2015-04-08 1 views
4

La comparaison d'entiers dans Java est difficile, en ce que int et Integer se comportent différemment. Je reçois cette partie.Comparaison d'entiers dans Java

Mais, comme ce example program montre, (Integer)400(ligne n ° 4) se comporte différemment (Integer)5(ligne n ° 3). Pourquoi est-ce??

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     System.out.format("1. 5    == 5   : %b\n", 5 == 5); 
     System.out.format("2. (int)5   == (int)5  : %b\n", (int)5 == (int)5); 
     System.out.format("3. (Integer)5  == (Integer)5 : %b\n", (Integer)5 == (Integer)5); 
     System.out.format("4. (Integer)400 == (Integer)400 : %b\n", (Integer)400 == (Integer)400); 
     System.out.format("5. new Integer(5) == (Integer)5 : %b\n", new Integer(5) == (Integer)5); 
    } 
} 

Résultat

1. 5    == 5   : true // Expected 
2. (int)5   == (int)5  : true // Expected 
3. (Integer)5  == (Integer)5 : true // Expected 
4. (Integer)400 == (Integer)400 : false // WHAT? 
5. new Integer(5) == (Integer)5 : false // Odd, but expected 
+1

Cela peut vous aider à http://stackoverflow.com/questions/1700081/why-does-128-128-return-false-but- 127-127-return-true-dans-ce-code –

+1

check out [this] (http://stackoverflow.com/questions/10002037/comparing-integer-values-in-java-strange-behavior) – SomeJavaGuy

+0

Copie possible: http://stackoverflow.com/questions/9824053/how-and-operators-work-on-integers-in-java – assylias

Répondre

2

De l'JLS

Si la valeur p étant boxed est vrai, faux, un octet ou un caractère dans la gamme \ u0000 à \ u007f, ou un int ou un nombre court entre -128 et 127 (inclus), alors soit r1 et r2 sont les résultats de deux conversions de boxe de p. C'est toujours le cas que r1 == r2. Idéalement, encadrer une valeur primitive p donnée donnerait toujours une référence identique. En pratique, cela peut ne pas être possible en utilisant les techniques de mise en œuvre existantes. Les règles ci-dessus sont un compromis pragmatique. La dernière clause ci-dessus exige que certaines valeurs communes soient toujours encadrées dans des objets indiscernables. L'implémentation peut les mettre en cache, paresseusement ou avec empressement. Pour les autres valeurs, cette formulation n'autorise aucune hypothèse sur l'identité des valeurs encadrées sur la partie du programmeur. Cela permettrait (mais n'exigerait pas) le partage de certaines ou de toutes ces références.

Cela garantit que dans la plupart des cas, le comportement sera le comportement souhaité, sans imposer une pénalité de performance excessive, en particulier sur les petits appareils. Les implémentations moins limitées en mémoire peuvent, par exemple, mettre en cache toutes les valeurs char et short, ainsi que les valeurs int et long dans la plage de -32K à +32K.

4

Voici une citation de JLS:

Si la valeur p étant boxed est vrai, faux, un octet ou un caractère dans la gamme \ u0000 à \ u007f, ou un int ou court nombre entre -128 et 127 (inclus), alors soit r1 et r2 sont les résultats de deux conversions de boxe de p. C'est toujours le cas que r1 == r2.

En bref Integer utilise piscine, donc pour les numéros de -128 à 127, vous obtiendrez toujours le même objet après la boxe, et par exemple new Integer(120) == new Integer(120) évaluera à true, mais new Integer(130) == new Integer(130) évaluera à false.

6

Parce que dans autoboxing un littéral à Integer, sont évalués comme suit:

(Integer)400 --- Integer.valueOf(400) 

valueOf is implemented such that certain numbers are "pooled", and it returns the same instance for values smaller than 128.

Et depuis (Integer)5 est inférieur à 128, il serait mis en commun et (Integer)400 ne sera pas mis en commun.

Par conséquent:

3. (Integer)5  == (Integer)5 : true // Expected -- since 5 is pooled (i.e same reference) 

et

4. Integer(400) == (Integer)400 : false // WHAT? -- since 400 is not pooled (i.e different reference) 
+1

Si tel est le cas, alors Le code basé sur Autoboxing/Unboxing en souffrira et cela va rendre le code ambigu.Kind d'inconfort – nobalG