2015-08-26 3 views
3

Je lisais JavaSE 6 specs, puis j'ai fait un test pour résoudre certains doutes.Lorsque les types de référence sont les mêmes - Array

Deux types de référence sont le même type d'exécution si:

  • Ils sont à la fois classe ou les deux types d'interface, sont définis par le même chargeur de classe, et ont le même nom binaire (§13.1), en Dans ce cas, on dit parfois qu'il s'agit de la même classe d'exécution ou de la même interface d'exécution.
  • Ce sont les deux types de tableaux et leurs types de composants sont du même type d'exécution(§10).

L'exécution du code ci-dessous ...

public class Test { 
    public static void main(String[] args) { 
     String str = "" + new String(" "); 
     String[] strArr = {str}; 
     String[] strArr2 = {str}; 
     System.out.println("strArr == strArr2 : " + (strArr == strArr2)); 
    } 
} 

... Je me attendais à la sortie suivante:

strArr == strArr2 : true

Mais la sortie actuelle est:

strArr == strArr2 : false

Qu'est-ce qui me manque?

+5

Pour votre code, le JLS seulement que 'strArr.getClass() == strArr2. getClass() '. – dhke

+2

Mélangez-vous des types et des variables? Le spex parle des types et votre exemple concerne les instances. Vérifiez le commentaire ci-dessus par @dhke. –

Répondre

2

Ce n'est pas parce qu'ils sont du même type que ce sont les mêmes objets.

Lorsque vous faites

String[] strArr = {str}; 
String[] strArr2 = {str}; 

Vous créez deux tableaux composés avec le même contenu, mais les tableaux eux-mêmes sont deux objets distincts.

Ils sont du même type (un tableau de chaînes) mais ils ne sont pas le même objet (référence X et référence Y). Quand vous dites strArr == strArr2, vous demandez s'ils sont le même objet (ou instance, si vous préférez cette terminologie). Le JLS que vous citez est à un niveau différent de ce dont vous parlez, il dit simplement que String[] et String[] sont du même type.

+0

@JeroenVannel Maintenant, je vois que c'est ma mauvaise interprétation. Je vous remercie. – WillRamos

1

Vous comparez les références de tableau. Les références strArr et strArr2 ne sont évidemment pas identiques.

Vous pouvez comparer les valeurs en utilisant Arrays.equals(strArr, strArr2).

Votre comparaison de référence serait vraie si vous initialisiez strArr2 avec la valeur strArr.

De même, la comparaison des types de tableaux (strArr.getClass() == strArr2.getClass()) serait vraie dans les deux cas.

1

En résumé:

Type de référence String[] est le même que le type de référence String[], à savoir

strArr.getClass() == strArr2.getClass() // true 

instance strArr de String[] n'est pas identique à une autre instance strArr2 du même type, à savoir

strArr == strArr2 // false