Utilisant l'opérateur == en Java pour comparer wrapper objets
Je suis en train de lire SCJP Java 6 par Kathy Sierra et Bert Bates et ce livre est déroutant moi. Sur la page 245 ils affirment que le code suivant ci-dessous.
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2)
System.out.println("different objects");
//Prints output
different objects
Puis sur la page suivante, ils ont le code suivant
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4)
System.out.println("same objects");
//Prints output
same objects
Je suis tellement confus! Quand je l'ai essayer sur mon propre il semble que vous ne pouvez pas utiliser l' == pour comparer de la même manière que vous le feriez utiliser la méthode equals (). À l'aide de l' == me donne toujours la valeur 'false', même si les variables entières sont réglés à la même valeur (p. 10). Suis-je la corriger? À l'aide de l' == pour comparer le même objet Integer (avec les mêmes valeurs) entraînera toujours "faux"
- Je pense que ce lien peut vous aider: stackoverflow.com/questions/1514910/...
- double de stackoverflow.com/questions/5277881/...
- Et ceci: stackoverflow.com/questions/5117132/..., stackoverflow.com/questions/8427416/...
- Double Possible de Pourquoi ne 128==128 return false mais 127==127 retour de vrai dans ce code?
Vous devez vous connecter pour publier un commentaire.
La clé de la réponse est appelé objet un stage. Java stagiaires petit nombre (moins de 128), de sorte que toutes les instances de
Integer(n)
avecn
dans les internés de la gamme sont les mêmes. Les nombres plus grand que ou égal à 128 ne sont pas internés, d'oùInteger(1000)
objets ne sont pas égaux les uns aux autres.Integer.valueOf()
sont internés des objets, tandis que ceux construits avecnew Integer
sont toujours des objets distinctsintern
sur votre chaîne de variables pour le même effet, c'est tout. Et la raison est simple: Nous avons besoin de stocker des constantes de chaîne, quelque part, de toute façon, et pour les petits entiers, c'est juste une performance/optimisation de la mémoireInteger
objets sont utilisés comme clés de hachage des cartes ou des objets dans les jeux de hachage, le pourcentage de petits nombres est disproportionnée grande. En s'y consacrant à eux, vous pouvez ignorer la ré-allocation de la mémoire pour stocker des copies identiques des objets immuables qui sont égaux les uns aux autres, et de laisser l'égalité de comparer finir plus vite par la vérification de référence de l'égalité d'abord. Le meilleur de tous, elle ne vous coûte rien en termes de cycles de CPU, donc c'était une décision facile à prendre.Integer
lui-même est en train de faire l'objet de mise en commun.int
constantesIntegers
) donc je pense que cette utilisation est justifiée.Integer.valueOf
méthode.Si vous regardez le code source de
Integer
vous verrez queInteger.valueOf(int)
piscines toutes les valeurs de -128 à 127. La raison en est que les petites valeurs entières sont utilisés fréquemment et sont donc digne d'être mis en commun dans le cache.Pris directement à partir de
Integer.java
:Noter que cette mise en commun est mise en œuvre spécifique et il n'y a aucune garantie de la mise en commun de gamme.
Les réponses à propos de stage sont corrects dans le concept, mais incorrecte avec la terminologie. Stage en Java implique normalement que le Java runtime est d'effectuer la mise en commun (tels que la Chaîne du stagiaire). Dans Integer cas, c'est la classe elle-même qui est en train de faire la mise en commun. Il n'y a pas de JVM quelque chose de magique.
Integer
objets pourint
valeurs dans l'intervalle [-128, 127] est spécifié dans l'API docs, de sorte qu'une partie de la plage est, en fait, c'est garanti.La réponse ci-dessus à propos de Stage est à droite sur. Quelque chose à considérer si vous ne:
Vous n'aurez pas les nouveaux objets puisque vous avez créé de nouveaux objets explicitement. Si vous écrivez le code comme suit, il sera interné:
Ils seront désormais les mêmes l'objet de nouveau. Si vous jetez un oeil à la Méthode valueOf à l'intérieur de la Integer.java classe dans le src.zip fichier, vous pouvez voir où il vérifie si la valeur de l'int est à l'extérieur de -128 à 127, il appelle la nouvelle classe Integer sinon il se charge dans la mémoire cache.
Le compilateur "boîtes" de l'int 1000 comme objet Integer. Pour ce faire, il convertit la source à la suivante:
Maintenant
valueOf
pourrait être un simple appel ànew Integer(1000)
toutefois la création d'un nouvel objet Integer chaque fois qu'unint
est en boîte coûterait à la fois du temps et de l'espace. Pour éviter cela, la classe Integer conserve un tableau d'Entiers à des objets destinés à un nombre limité de valeurs int.La vitesse acquise contre le souvenir perdu de ce qui peut être ajusté par le réglage de la portée avec un argument jvm au démarrage du programme (autant que je sache, la valeur par défaut est de -127 à 128).
Lorsque le Java opérateur == est utilisé pour comparer quoi que ce soit d'autre que les types primitifs, il vérifie référentielle de l'égalité; cela s'applique même lorsque les choses comparés sont enveloppés primitives. De plus, le
valueOf
méthode et généré par le compilateur l'autoboxing déclaration sont généralement gratuits, de façon arbitraire, de retour d'un nouvel objet qui ne sera pas de référence à l'égal des autres déjà existantes de référence, ou pour renvoyer une référence à un objet existant (ce qui serait, bien sûr, être de référence égale à tous les pré-existantes référence permettant d'identifier le même objet). Les implémentations sont nécessaires pour maintenir un "pool" deInteger
cas pour les valeurs de -128 à 127, de telle sorte que tous les appels àInteger.valueOf
sur un nombre dans la plage sera de retour références pour le même objet, mais autre que celui d'une mise en œuvre serait libre de faire quelque chose commeJe n'ai pas particulièrement d'attendre implémentations Java pour faire quelque chose comme ça, puisque dans de nombreux cas, le "cache" ratio pourrait être proche de 0% et le temps supplémentaire consacré à la recherche de cas dans le cache serait perdu. Néanmoins, il n'y a jamais aucune garantie qu'une référence retourné par
instanceOf
ne correspond pas certain de référence retourné par cette méthode (même si elle ne correspond pas à la dernier de référence retourné par cette méthode, certains algorithmes de mise en cache peut éventuellement provoquer le retour d'un plus tôt de référence, surtout si la piscine est partagée par plusieurs threads sans verrouillage. Le manque de verrouillage ne sera jamais la cause le code de retour rien d'autre qu'une référence à un entier avec la valeur correcte, mais peut causer des variations imprévisibles de la qui a renvoyé les références de comparer l'égalité). Seule référence àInteger
les objets créés directement à l'aide du constructeurnew Integer(n)
sont garantis d'être unique, code, qui prévoit que toute référence retourné parvalueOf
à correspond pas à la référence retournée parvalueOf
, sans avoir réellement observé qu'il ne correspond pas, doit être considéré comme rompu.Comparaison de chaîne et comparaison des entiers à l'aide de == et != donne boolean résultats pas que nous attendons.Soyez donc prudent et assurez-vous que les inconnues sont les résultats pour ne pas entraver la performance , de la fiabilité et de l'exactitude de votre logiciel.
"==" toujours comparer l'emplacement de la mémoire ou des références à des objets de valeurs.
méthode equals de toujours comparer les valeurs.mais équivaut aussi, indirectement, utilise le "==" opérateur de comparer les valeurs. Entier Entier utilise le cache pour stocker les valeurs de -128 à +127.Si l'opérateur == est utilisé pour vérifier les valeurs entre -128 à 127 puis il retourne la valeur true. si une valeur comprise entre -128 à 127 comme
autre que celle indiquée ci-dessus, puis elle retourne false
Consultez le lien pour quelques informations supplémentaires
Selon jls-5.1.7
Donc, n'importe quel nombre entre -128 et 127 est mis en cache par le nombre Entier de la classe.
Rappelez-vous, lors de la comparaison de deux objets toujours utiliser
equals
méthode.La mise en cache le code est écrit en
IntegerCache
classe qui est membre deInteger
classe.Voici l'extrait de code:
Références