Sur l'objet chaîne en Java
Fait partie du code d'origine de la classe String
Regardez d'abord le code source de la classe String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,Constable, ConstantDesc {
@Stable
private final byte[] value;
private final byte coder;
/** Cache the hash code for the string */
private int hash; // Default to 0
private boolean hashIsZero; // Default to false;
private static final long serialVersionUID = -6849794470754667710L;
...
Le code source montre que le tableau de caractères de valeur du type String est modifié en dernier, ce qui signifie que le type String ne peut pas être modifié après sa création.
Regardez un code simple
Ce qui suit est un simple morceau de code de jugement sur les objets String
// An highlighted block
public static void main(String[] $s) {
String A = "StringA";
String B = A;
//"StringA"已存在,并不会创建新的对象
String C = "StringA";
System.out.println("A = B:" + (A == B));
System.out.println("A = C:" + (A == C));
//下面比较jvm会先从堆中寻找是否有"StringA"
System.out.println("A = 'StringA':" + (A == "StringA"));
//下面比较jvm会直接创建一个新的String类型的对象,将该对象的引用返回给用户
System.out.println("A = 'new StringA':" + (A == new String("StringA")));
}
Résultats de l'exécution du programme
A = B: vrai _
A = C: vrai
A = 'StringA': vrai
A = 'new StringA': faux
A = 'StringA.intern ()': vrai
Analyse
(1) Premièrement, après l'exécution de String A = "StringA", un objet String avec une valeur "StringA" est créé, la valeur constante de chaîne est ajoutée au pool de constantes de chaîne en mémoire et l'objet String est référencé avec " A "Bind.
(2) Après l'exécution de la chaîne B = A, affectez la référence A à B. À ce stade, A et B sont la même référence et pointent tous les deux vers la chaîne nouvellement créée "StringA"
(3) Chaîne C = "StringA" après l'exécution , La machine virtuelle Java recherche d'abord s'il existe une constante de chaîne avec la valeur "StringA" dans le pool de constantes de chaîne. Si tel est le cas, elle pointe directement "Référence C" vers la constante, à ce moment A, B et C pointent vers "StringA" "Objet.
(4) Pour '==' si les types de base de conception, comparez leurs valeurs; si cela implique une comparaison des types de référence, il comparera s'ils pointent vers le même objet, donc à ce moment A == B == C;
(5 ) Lors de l'évaluation (A == "StringA"), jvmhui recherchera d'abord une constante de chaîne avec une valeur de "StringA" dans le pool de constantes de chaîne, le cas échéant, il renverra directement la référence de l'objet String, donc A = = "StringA" est vrai;
(6) Lors du jugement (A == new String ("StringA")), jvm créera immédiatement un nouvel objet String et le placera dans le tas pour retourner la référence, donc les deux L'adresse pointée n'est pas la même, le résultat est faux;
(7) Lors du jugement (A == 'StringA'.intern ()), string.
Dernier
Cet article n'est qu'un bref aperçu de certains des mécanismes de la classe String. Veuillez indiquer s'il y a des erreurs.
Le lien de référence pour cet article: https://blog.csdn.net/qq_34490018/article/details/82110578 .