2010-06-21 6 views
16

La sortie du programme en cours est « étrange ». Mais les deux variables partagent la même référence. Pourquoi les deuxième et troisième comparaisons ne sont pas vraies?Comparaison entre les variables pointant vers un même objet Entier

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

Sortie: Strange

+0

Unboxing est probablement la réponse. Cependant, je n'ai aucune idée réelle. – jjnguy

+9

+1 pour démontrer une utilisation impardonnable de l'autoboxing. –

Répondre

19

C'est l'artefact de autoboxing et un fait que Integer est immuable en Java. Les a++ et a-- sont traduits à peu près ceci.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Notez que si vous remplacez 'a = new Integer (2)' 'a = avec Integer.valueOf (2)', "Strangest" sera également imprimé car il utilisera le cache entier pour obtenir l'instance. –

+0

Que voulez-vous dire par cache entier dans votre commentaire. peux-tu élaborer ? – restrictedinfinity

+4

@restrictedinfinity. Au moins dans Java, Byte, Short et Integer de Sun ont un cache de 256 valeurs allant de -128 à 127 inclus qui sont servies par la méthode 'Type.valueOf()'. Dans notre cas, après 'a -' la valeur int est '2' et ce serait la même que nous avons commencé avec, donc' Integer.valueOf (2) 'aurait retourné le même objet' Integer'. Notez que ce type 'Long' n'a pas de cache, donc' Long.valueOf' renvoie toujours un nouvel objet. –

6
  • Strage - il est évident, les deux variables pointent vers le même objet

  • pas Stranger à cause de autoboxing. Integer est immuable, donc chaque opération crée une nouvelle instance.

  • pas à cause du point précédent, et parce que vous avez utilisé new Integer(..) qui ignore le cache qui est utilisé pour la plage d'octets. Si vous utilisez Integer.valueOf(2) d'abord, puis les mises en cache Integer s seront utilisés et Strangest seront également imprimés.

Questions connexes