advanced.java
← Tous les concepts
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