Java — Integer Cache
Le Integer Cache est un mécanisme interne de Java souvent méconnu… mais qui peut facilement piéger, surtout lors des comparaisons avec ==.
Idée simple
Java met en cache certaines valeurs de Integer pour optimiser les performances.
Concrètement :
- les entiers entre -128 et 127 sont réutilisés
- au lieu de créer un nouvel objet à chaque fois
Exemple simple
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true
Pourquoi true ?
- 100 est dans l’intervalle [-128, 127]
- Java utilise le même objet en mémoire
- donc
aetbpointent vers la même référence
Exemple piégeux
Integer a = 200;
Integer b = 200;
System.out.println(a == b); // false
Pourquoi false ?
- 200 est hors du cache
- Java crée deux objets distincts
- donc références différentes
Visualisation mentale
Quand tu écris :
Integer x = 100;
Java fait en réalité :
Integer x = Integer.valueOf(100);
Et cette méthode :
- retourne un objet en cache si possible
- sinon crée un nouvel objet
Le mécanisme derrière
Le cache est géré par :
Integer.IntegerCache
Elle stocke les objets entre -128 et 127.
Attention avec ==
Le piège classique :
penser que == compare les valeurs
- Faux
== compare les références
Et le cache peut donner l’illusion que ça fonctionne.
Comparaison correcte
Integer a = 200;
Integer b = 200;
System.out.println(a.equals(b)); // true
.equals() compare le contenu → toujours fiable
Pièges fréquents
- croire que
==fonctionne pour comparer desInteger - oublier l’existence du cache
- se faire tromper par les valeurs “qui marchent parfois”
🧾 En résumé
- Java met en cache les objets
Integerentre -128 et 127 - dans cette plage, plusieurs variables peuvent référencer le même objet
- en dehors de cette plage, de nouveaux objets sont créés
==compare les références → résultat parfois trompeur.equals()compare les valeurs → méthode fiable
Le Integer Cache est une optimisation interne utile, mais qui peut facilement induire en erreur si on ne connaît pas son fonctionnement.