Explicación detallada de String en Java

Cadena detallada en Java
String: String Constant Pool

Preguntas de la entrevista (mira el video de la estación b)

1. ¿No puedo usar volatile con String?

2. ¿Por qué existen estas dos formas? Por sus diferentes áreas de almacenamiento

3. La capa inferior de String es una matriz de tipo char

1. Tres características de String

1.1. Inmutabilidad

1.1.1. La cadena es un objeto en modo inmutable. La función principal del modo invariante es garantizar la coherencia de los datos cuando un objeto debe ser compartido por varios subprocesos y se debe acceder a él con frecuencia.

1.2, optimización constante de la piscina

1.2.1 Una vez creado el objeto String, se almacenará en caché en el grupo de constantes de cadena, y la referencia almacenada en caché se devolverá directamente cuando se cree el mismo objeto la próxima vez.

1,3 、 final

1.3.1 La clase String no se puede heredar, lo que mejora la seguridad del sistema.

2. Hay tres formas de crear una instancia de String ():

2.1, asignación directa

2.2. A través del constructor, el valor de la cadena se puede pasar directamente o se puede pasar una matriz de caracteres.

2.3. A través del constructor, puede pasar directamente una matriz de tipo char

La diferencia entre los dos (área de almacenamiento): la asignación directa se almacena en el grupo de constantes de cadena y, al construir una instancia, se almacena en el montón.

3. Resumen de los sitios de prueba de entrevistas

3.1, String no es un tipo de datos básico

La capa inferior de String es en realidad una matriz de tipo char

3.2, la instanciación de String

3.3, método igual

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 El método equals en Object es el mismo que "==".

3.3.2. String reescribe el método de igualdad en Object. La comparación ya no es el valor de la dirección, sino su valor ().

3.4, String es inmutable

3.4.1. Siempre que se cambie el valor de String, se convierte en un nuevo objeto

3.5, método interno ()

3.5.1. Cuando el objeto String llama al método intern (), irá al grupo de constantes de cadena para encontrar el valor; si el valor existe, se devolverá una referencia al valor; si no existe, una nueva se creará uno en el valor de dirección de grupo constante de cadena y retorno.

Cuatro métodos de uso común

Inserte la descripción de la imagen aquí

4.1, corte de hilo

4.1.1, el método split () admite expresiones regulares

Cinco, preguntas clásicas de la entrevista

5.1 ¿Cuál es la diferencia entre == y es igual?

5.1.1. "==" se compara a partir de la clasificación del tipo de datos, si se compara el tipo de datos básico, es el valor de comparación, si se compara el tipo de datos de referencia, es el valor de la dirección en la memoria.

5.1.2, equals es el método proporcionado por Object y "==" es el mismo, pero String lo reescribe y compara su valor, no el valor de la dirección en la memoria.

5.2. El resultado de ejecutar el siguiente código es:

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

Puede usar el comando javap -c xx.class para ver el orden de ejecución En el proceso, hay un nuevo StringBuilder (); método append, por lo que str2 aparece en el montón y el resultado es falso;

Inserte la descripción de la imagen aquí

5.3. El resultado de ejecutar el siguiente código es:

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

Si el resultado es verdadero, la modificación final se compilará directamente en un valor explícito y la modificación final no se compilará en un valor explícito.
Referencia: la diferencia entre las variables de cadena modificadas finales y las variables de cadena no modificadas en java

5.4. El resultado de ejecutar el siguiente código es:

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

Si el resultado es falso, se modifica por final, pero se creó en la memoria de montón al principio, por lo que no importa si se modifica por final o no, siempre estará en la memoria de montón.

Inserte la descripción de la imagen aquí

5.5. El resultado de ejecutar el siguiente código es:

        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);

El resultado es: falso, verdadero. Debido a que el método intern (); de String busca primero el grupo de constantes de cadena, devuelve la referencia si hay una y la crea en el grupo de constantes si no hay.

5.6, el papel del grupo constante de cadenas

Varios valores idénticos pueden compartir un valor de dirección. Puede reducir el consumo de memoria.

5.7. ¿Es seguro el hilo de cadena?

Sí, el valor es inmutable, siempre que el valor cambie, es un nuevo valor de dirección.

5.8 ¿Cuáles son las ventajas de usar String como clave cuando se usa HashMap?

Dado que HashMap encuentra el valor de acuerdo con el código hash de la clave, la cadena se almacena en caché cuando se crea. Entonces, en HashMap, no hay necesidad de calcular el código hash, está en el caché y la eficiencia es mayor que la de otros objetos.

Supongo que te gusta

Origin blog.csdn.net/weixin_43983411/article/details/108569701
Recomendado
Clasificación