Maison > Questions et réponses > le corps du texte
黄舟2017-04-18 10:48:45
String a = new String("abc");
a = a.intern();
String b = "abc";
if (a == b) {
System.out.println("相等");
} else {
System.out.println("不等");
}
Vous avez appelé la méthode a.intern()
, mais vous n'avez pas réaffecté le résultat renvoyé a
est toujours l'original a
.
ringa_lee2017-04-18 10:48:45
Utilisez equals()
pour juger de l'égalité des chaînes. Cette question a même échoué en Java !
PHPz2017-04-18 10:48:45
a.intern(); ne changera pas la référence du caractère a, il a une valeur de retour.
Les suivants seront égaux
String b = a.intern();
ringa_lee2017-04-18 10:48:45
String a = new String("abc");
Ici a et "abc" sont deux objets. Lorsque la méthode interne est appelée, le pool de constantes de caractères contient déjà une chaîne égale à cet objet, donc l'appel de la méthode interne est inutile, même s'il est suivi de b=" abc", b et a ne sont pas le même objet.
Si vous souhaitez que le résultat soit égal, soit la première phrase devient :
String a = "abc";
Ou la deuxième phrase devient :
a = a.intern();
PHP中文网2017-04-18 10:48:45
La première chose à savoir est que l'opération == détermine si deux objets ou types de base a et b pointent vers la même zone mémoire
L'implémentation sous-jacente deString est
private final value[]
Lorsque String est instancié, il divise en fait une mémoire continue pour enregistrer le tableau de caractères via System.arraycopy.
new String("abc") n'est en fait pas recommandé pour initialiser String de cette manière. L'implémentation réelle nécessite une étape de plus que a = "abc".
String a = "abc";
String b = "abc".intern(); 或者String b = a.intern();
L'opération réelle est la troisième étape ci-dessus, c'est-à-dire b = a;L'implémentation sous-jacente réelle de
String b = "abc" est :
.
Il est recommandé de jeter un œil à l'analyse du code source de String[Analyse du code source JAVA - Java.lang] Analyse du code source de String