JavaSE - grupo de constantes de cadena (StringTable)

ced485cbb11e458d81a746890b32cf3f.gif

Autor: Rukawa Maple Knock Code

Página de inicio del blog: Blog de Rukawa Kaede

Columna: Aprende java conmigo

Cita: Mantente hambriento, mantente tonto

Si quieres hacer cosas buenas, primero debes afilar tus herramientas. Permíteme presentarte una herramienta súper poderosa para ganar ofertas de grandes fabricantes: Niuke.com

Haga clic para registrarse de forma gratuita y aclarar las preguntas conmigo  

Directorio de artículos

1. Conjunto de constantes de cadenas

2. método interno

3. Preguntas de la entrevista


1. Conjunto de constantes de cadenas (StringTable)

Para mejorar el rendimiento, reducir la sobrecarga de memoria y evitar la creación repetida de cadenas, la JVM mantiene un espacio de memoria especial, el conjunto de constantes de cadenas. El grupo de constantes de cadena se mantiene de forma privada por la clase String

Para ahorrar espacio de almacenamiento y la eficiencia de ejecución del programa, Java también presenta:

1. Conjunto de constantes de archivos de clase: después de compilar cada archivo fuente .Java, el archivo .Class guardará las constantes literales y la información de símbolos en la clase actual

2. Conjunto de constantes de tiempo de ejecución: cuando se carga el archivo .Class, el conjunto de constantes del archivo .Class se carga en la memoria denominada conjunto de constantes de tiempo de ejecución, y cada clase en el conjunto de constantes de tiempo de ejecución tiene una copia.

Hay dos formas de crear objetos de cadena en Java:

1. Use directamente constantes de cadena para la asignación

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1==s2);

    }
}
//运行结果:true

Use String s1 = "hola"; al crear un objeto, la JVM primero irá al grupo de cadenas para averiguar si el objeto "hola" existe. Si no existe, creará el objeto "hola" en la cadena y luego coloque "hola" en el grupo. La dirección de referencia del objeto "hola" se devuelve a la constante de cadena s1, de modo que s1 apuntará al objeto de cadena "hola" en el grupo; si existe, no se creará el objeto, y la dirección del objeto "hola" en el grupo se devolverá directamente y se le asignará dar constante de cadena

 Cadena s2 = "hola"; Al crear un objeto, la JVM primero va al conjunto de constantes de cadena para encontrar "hola" y hace referencia a la dirección a s2, por lo que, como se muestra en la figura a continuación, las matrices de valores señaladas por s1 y s2 son la misma matriz

2. Cree un objeto de clase String a través de new

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3==s4);
        //运行结果:false
    }
}

Cuando s3 y s4 crean un objeto, primero vaya al grupo de constantes de cadena para encontrar si hay "hola" en el grupo de constantes de cadena y luego cree el objeto si no está en el grupo, cree directamente un objeto de cadena "hola" en el montón, y luego devolver la dirección Asigne una referencia a s3 o s4, que apunte al objeto de cadena creado en el montón; si no se encuentra, primero cree un objeto de cadena "hola" en el grupo de constantes de cadena y luego cree un "hola" en el montón "objeto de cadena, luego asigne la dirección a la referencia, apuntando así al objeto creado en el montón

Cuando la nueva palabra clave crea un objeto, la nueva salida es un nuevo objeto, es decir, las referencias s3 y s4 apuntan a dos objetos diferentes, por lo que la declaración de salida es falsa.

Una pregunta:

//下面代码将输出什么内容:()

public class SystemUtil{
	public static boolean isAdmin(String userId){
		return userId.toLowerCase()=="admin";
	}
	public static void main(String[] args){
		System.out.println(isAdmin("Admin"));
	}
}

analizar:

En primer lugar, los dos lados del signo == son tipos de datos de referencia, luego la comparación es "las direcciones son diferentes"

Luego, "admin" en el método isAdmin() se almacena en el conjunto de constantes de cadena, userId.toLowerCase() es nuevo y se devuelve un nuevo objeto

Entonces salida: falso

2. método interno

La función de este método es agregar manualmente el objeto String creado al grupo de constantes

public class Test {
    public static void main(String[] args) {
        char[] chars = new char[]{'h','e','l','l','o'};
        String s1 = new String(chars);
        //s1.intern();
        String s2 = "hello";
        System.out.println(s1==s2);
    }
    //运行结果:false
}

Cuando String s1 = new String(chars);, copie una nueva matriz y asígnela a s1, es decir, s1 apunta a una nueva matriz

Cuando String s2 = "hola";, la JVM primero busca "hola" en el grupo de constantes, y si no encuentra, crea un "hola" y lo almacena en el grupo de constantes, y devuelve la dirección a s2

Entonces salida: falso

agregar s1.interno();

public class Test {
    public static void main(String[] args) {
        char[] chars = new char[]{'h','e','l','l','o'};
        String s1 = new String(chars);
        s1.intern();
        String s2 = "hello";
        System.out.println(s1==s2);
    }
    //运行结果:true
}

s1.intern(); Agregue el objeto String creado al grupo de constantes, cuando String s2 = "hola";, la JVM primero va al grupo de constantes para encontrar "hola", y luego devuelve la dirección a s2

Entonces salida: verdadero

3. Preguntas de la entrevista

Explique la diferencia entre los dos tipos de creación de instancias de objetos en la clase String (en JDK1.8)

Cadena str = "hola"

Solo abrirá un espacio de memoria en montón, lo guardará en el grupo de constantes de cadenas y luego str compartirá el objeto String en el grupo de constantes.

Cadena str = nueva cadena ("hola")

Se abrirán dos espacios de memoria de almacenamiento dinámico, la cadena "hola" se almacenará en el grupo de constantes de cadena y luego se le asignará un valor al objeto String recién creado con el objeto String en el grupo de constantes.

Cadena str = nueva Cadena(nuevo carácter[]{'h', 'e', ​​'l', 'l', 'o'})

Ahora cree un objeto String en el montón y luego use copyof para volver a abrir el espacio de la matriz y copiar el contenido de la matriz de cadenas de parámetros en el objeto String.

"El intercambio de este problema está aquí, recuerda darle al blogger un enlace de tres, ¡tu apoyo es la mayor fuerza impulsora para mi creación!

ced485cbb11e458d81a746890b32cf3f.gif

Supongo que te gusta

Origin blog.csdn.net/chenchenchencl/article/details/126359224
Recomendado
Clasificación