Lorsque l'opérateur Java == est utilisé pour comparer des éléments autres que des types primitifs, il vérifie l'égalité référentielle, même lorsque les éléments comparés sont des primitives enveloppées. En outre, l'opérateur valueOf
et la déclaration d'autocomplétion générée par le compilateur sont généralement libres de renvoyer arbitrairement un nouvel objet qui ne sera pas égal à une autre référence existante, ou de renvoyer une référence à un objet existant (qui serait, bien sûr, égal à une référence préexistante identifiant le même objet). Les implémentations sont tenues de maintenir un "pool" d'objets de type Integer
pour les valeurs -128 à 127, de sorte que tous les appels à Integer.valueOf
sur un nombre particulier dans cette plage renverra des références au même objet, mais à part cela, une implémentation serait libre de faire quelque chose comme
static Integer [] intPool = new Integer[256];
public Integer valueOf(int n)
{
int hash = (n*0x18675309) >>> 24;
Integer instance = intPool[n];
if (instance == null && instance.value != n)
{
instance = new Integer(n);
intPool[hash] = instance ;
}
return instance;
}
Je ne m'attends pas particulièrement à ce que les implémentations Java fassent quelque chose de ce genre, car dans de nombreux cas, le ratio de "cache hit" pourrait être proche de 0 % et le temps supplémentaire passé à chercher des instances dans le cache serait perdu. Néanmoins, il n'y a jamais de garantie qu'une référence renvoyée par la fonction instanceOf
ne correspondra pas à une référence précédente renvoyée par cette méthode (même si elle ne correspond pas à l'adresse de l'utilisateur). dernier renvoyée par cette méthode, certains algorithmes de mise en cache peuvent éventuellement faire en sorte qu'elle renvoie une référence de type plus tôt surtout si le pool est partagé par plusieurs threads sans verrouillage. L'absence de verrouillage ne fera jamais que le code renvoie autre chose qu'une référence à un entier avec la valeur correcte, mais pourrait provoquer des variations imprévisibles dans la comparaison des références renvoyées). Seule la référence à Integer
objets créés directement à l'aide du constructeur new Integer(n)
sont garantis comme étant uniques ; le code qui s'attend à ce que toute référence retournée par valueOf
pour ne pas correspondre à une référence renvoyée par valueOf
sans avoir réellement constaté qu'il ne correspond pas, doit être considéré comme rompu.
2 votes
Je pense que ce lien peut vous aider : stackoverflow.com/questions/1514910/
1 votes
Duplicata de stackoverflow.com/questions/5277881/
1 votes
Et ceci : stackoverflow.com/questions/5117132/ , stackoverflow.com/questions/8427416/
1 votes
Duplicata possible de Pourquoi 128==128 renvoie faux mais 127==127 renvoie vrai dans ce code ?