Bonnes pratiques générales · ch. 7, p. 58
Le pool de constantes de chaînes
Les littéraux String sont internés dans un pool à l'échelle de la JVM, donc des littéraux identiques sont le même objet. Les chaînes construites à l'exécution ne sont pas mises en pool sauf appel explicite à intern().
String a = "java";
String b = "java";
String c = new String("java");
String d = c.intern();
a == b; // true — même littéral mis en pool
a == c; // false — new String() alloue toujours
a == d; // true — intern() renvoie l'instance mise en pool
Les expressions constantes sont repliées à la compilation, donc "ja" + "va"
est aussi mise en pool et == "java" est vrai. La concaténation impliquant
une variable non finale se produit à l’exécution et ne l’est pas.
Pourquoi c’est important
La comparaison d’identité sur des chaînes est un bug qui passe ses propres
tests unitaires, parce que les données de test sont généralement des
littéraux. Comparez toujours avec equals.
1 questions sur ce concept S'entraîner