Explication détaillée de String en Java

Chaîne détaillée dans une chaîne Java
: pool de constantes de chaîne

Questions d'entrevue (regardez la vidéo de la station b)

1. Puis-je ne pas utiliser volatile avec String?

2. Pourquoi y a-t-il ces deux manières? En raison de leurs différentes zones de stockage

3. La couche inférieure de String est un tableau de type char

1. Trois caractéristiques de String

1.1. Immuabilité

1.1.1. String est un objet en mode immuable. La fonction principale du mode invariant est d'assurer la cohérence des données lorsqu'un objet doit être partagé par plusieurs threads et fréquemment accédé.

1.2, optimisation constante de la piscine

1.2.1 Une fois l'objet String créé, il sera mis en cache dans le pool de constantes de chaîne et la référence mise en cache sera renvoyée directement lors de la création du même objet la prochaine fois.

1.3 、 final

1.3.1 La classe String ne peut pas être héritée, ce qui améliore la sécurité du système.

2. Il existe trois façons d'instancier String ():

2.1, affectation directe

2.2 Grâce au constructeur, la valeur de la chaîne peut être transmise directement, ou un tableau de caractères peut être passé.

2.3. Grâce au constructeur, vous pouvez passer directement un tableau de type char

La différence entre les deux (zone de stockage): l'affectation directe est stockée dans le pool de constantes de chaîne, et en construisant une instance, elle est stockée dans le tas.

3. Résumé des sites de test des entretiens

3.1, la chaîne n'est pas un type de données de base

La couche inférieure de String est en fait un tableau de type char

3.2, l'instanciation de String

3.3, méthode égale

public boolean equals(Object anObject) {
    
        
if (this == anObject) {
    
           
    return true;   
 }   
 if (anObject instanceof String) {
    
          
   String aString = (String)anObject;      
     if (coder() == aString.coder()) {
    
             
        return isLatin1() ? StringLatin1.equals(value, aString.value) : 			           					  
                            StringUTF16.equals(value, aString.value);       
    }    }   
     return false; 
     }

3.3.1. La méthode equals dans Object est la même que "==".

3.3.2. String réécrit la méthode d'égalité dans Object. La comparaison n'est plus la valeur d'adresse, mais sa valeur ().

3.4, la chaîne est immuable

3.4.1. Tant que la valeur de String est modifiée, elle devient un nouvel objet

3.5, méthode intern ()

3.5.1. Lorsque l'objet String appelle la méthode intern (), il ira dans le pool de constantes string pour trouver la valeur; si la valeur existe, une référence à la valeur sera renvoyée; si elle n'existe pas, une nouvelle un sera créé dans la chaîne de valeur constante de l'adresse du pool et de retour.

Quatre méthodes couramment utilisées

Insérez la description de l'image ici

4.1, coupe de cordes

4.1.1, la méthode split () prend en charge les expressions régulières

Cinq, interrogez des questions classiques

5.1 Quelle est la différence entre == et equals?

5.1.1. "==" est comparé à partir de la classification des types de données, si le type de données de base est comparé, c'est la valeur de comparaison; si le type de données de référence est comparé, c'est la valeur d'adresse dans la mémoire.

5.1.2, equals est la méthode fournie par Object et "==" est la même, mais String la réécrit et compare sa valeur, pas la valeur d'adresse en mémoire.

5.2. Le résultat de l'exécution du code suivant est:

String str1 = "Hello World"; 
String str2 = "Hello"; 
str2 += " World"; 
System.out.println(str1 == str2);

Vous pouvez utiliser la commande javap -c xx.class pour voir l'ordre d'exécution. Dans le processus, il y a une nouvelle méthode StringBuilder (); append, donc str2 apparaît dans le tas et le résultat est faux;

Insérez la description de l'image ici

5.3. Le résultat de l'exécution du code suivant est:

        String str1 = "Hello World";
        final String str2 = " World";
        String str3 = "Hello" + str2;
        System.out.println(str1 == str3);

Si le résultat est vrai, la modification finale sera directement compilée en une valeur explicite, et la modification finale ne sera pas compilée en une valeur explicite.
Référence: La différence entre les variables String modifiées finales et les variables String non modifiées en Java

5.4. Le résultat de l'exécution du code suivant est:

String str1 = "Hello World"; 
final String str2 = new String(" World"); 
String str3 = "Hello"+str2; 
System.out.println(str1 == str3);

Si le résultat est faux, il est modifié par final, mais il a d'abord été créé dans la mémoire du tas, donc peu importe qu'il soit modifié par final ou non, il est toujours en mémoire du tas.

Insérez la description de l'image ici

5.5. Le résultat de l'exécution du code suivant est:

        String str1 = "Hello World";
        String str2 = "Hello";
        String str3 = " World";
        String str4 = str2 + str3;
        System.out.println(str4 == str1);
        System.out.println(str4.intern() == str1);

Le résultat est: faux, vrai. Parce que la méthode intern (); de String recherche d'abord le pool de constantes de chaîne, retourne la référence s'il y en a une et la crée dans le pool de constantes s'il n'y en a pas.

5.6, le rôle du pool de constantes de chaîne

Plusieurs valeurs identiques peuvent partager une valeur d'adresse. Peut réduire la consommation de mémoire.

5.7 Le thread String est-il sûr?

Oui, la valeur est immuable, tant que la valeur change, il s'agit d'une nouvelle valeur d'adresse.

5.8. Quels sont les avantages de l'utilisation de String comme clé lors de l'utilisation de HashMap?

Comme HashMap trouve la valeur en fonction du hashcode de la clé, la chaîne est mise en cache lors de sa création. Donc dans HashMap, il n'est pas nécessaire de calculer le hashcode, il est dans le cache, et l'efficacité est supérieure à celle des autres objets.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43983411/article/details/108569701
conseillé
Classement