Red de conocimiento informático - Problemas con los teléfonos móviles - Clase de cadena

Clase de cadena

String es una clase inmutable. La inmutabilidad significa que después de inicializar la variable de tipo String, el contenido de la memoria al que apunta su referencia no se puede cambiar y la referencia de la variable puede apuntar a otra memoria.

Defina una variable String str, que haga referencia a la cadena de memoria abc.

Al asignar un valor a una variable, la cadena de definición de memoria se abre nuevamente, la referencia str apunta al nuevo objeto y el contenido de la memoria original abc permanece sin cambios.

La clase String es una clase contenedora para una matriz de cadenas (con una matriz char[] dentro). El tipo de matriz es privado final y el valor de referencia es inmutable y no se puede acceder a él externamente.

Por lo tanto, el objeto String es esencialmente una referencia que apunta a una memoria de matriz de caracteres y está diseñado como un tipo final inmutable. Una vez que se crea el objeto String, el valor se inicializa y apunta a una memoria de matriz de caracteres. La referencia char[] es inmutable. Los objetos String son inmutables.

Para reemplazar un determinado carácter en una cadena, el método replace() de la clase String no cambia directamente la referencia char[] que apunta a la memoria, sino que abre una nueva memoria.

Cree una nueva matriz char[], asigne memoria, la longitud es la misma que la matriz anterior, copie, reemplace, cree un nuevo objeto de clase String, en el método de construcción, asigne el nuevo char[] matriz al valor interno de la clase String, devuelve la referencia New String.

Grupo de constantes de archivos de clase. En el archivo, el compilador compila y genera literales y referencias de símbolos, que no se cargan en la memoria. Los literales son cadenas de texto (como abc en String str = "abc". ).

Las referencias de símbolos son nombres completos de clases/interfaces (como java/lang/String), nombres de variables (str), nombres de métodos y descriptores (parámetros y valores de retorno).

Después de cargar la clase en la memoria, el grupo de constantes del archivo de clase (referencias literales y simbólicas) ingresa al grupo de constantes de tiempo de ejecución del área de método, que se comparte globalmente.

Los literales (grupo de constantes de cadena) ya no están en el área de métodos después de jdk1.7 y se mueven al montón. Las referencias de símbolos, como los nombres de métodos y los nombres de clases completos, todavía están en el área de métodos.

Defina una variable de cadena a. Después de la compilación, hello2 es una cadena de texto en el grupo constante del archivo de clase, el valor de a se determina durante la fase de compilación.

Se optimizarán (empalmarán) dos literales de cadena en el momento de la compilación y se analizarán en uno, por lo que el compilador analiza directamente a2 en hello2 en el momento de la compilación.

Descompile el comando javap -verbose StrClass.class y vea el grupo constante del archivo de clase.

Al compilar, comprobará si la cadena hello2 ya existe en el grupo constante. Solo hay una cadena n.º 2, correspondiente al n.º 22, que es hello2.

Este proceso verificará si hello2 existe en el grupo de constantes de cadena. Si no existe, cree una matriz char[] en el montón, cree un objeto String asociado con la matriz char[] y guárdelo. al grupo constante de cadenas y finalmente guarde un punto en este objeto.

Durante la fase de compilación, no se puede determinar el valor de a3. Se define la variable final c y el código de bytes reemplaza la variable c en a4.

(Tiempo de ejecución) Inicialización de variable de objeto, nuevo objeto StringBuilder, la referencia a3 apunta al objeto String nuevo en la memoria del montón mediante el método toString(). a == a4, apunta al grupo constante de cadenas, a3 apunta al objeto String nuevo en la memoria del montón.

Cuando se carga la clase, el objeto hello2 y la variable a5 se crean en el grupo constante, y se crea un nuevo objeto String en la memoria del montón de tiempo de ejecución. La cadena hello2 ya está en el grupo constante, elemento. #2, y la referencia a apunta al grupo de constantes de cadena. La referencia a5 apunta a un nuevo objeto en la memoria del montón (a!=a5).

grupo constante de archivos de clase, carácter de texto hello2.

Cuando la clase carga memoria, se crea un objeto de cadena hello2 en el grupo de constantes de cadena.

Cuando se inicializa el objeto, la nueva instrucción crea un objeto nuevamente en el montón y la variable a6 hace referencia a él.

El grupo de constantes del archivo de clase solo tiene hola y 2 cadenas, pero no hay una cadena hello2. Cuando se carga la clase, el objeto hello2 no existe en el grupo de constantes de cadena.

Durante la inicialización, la nueva instrucción crea dos objetos String (hello y 2) en el montón. A través del método append() de la clase StringBuffer, el método toString() crea un nuevo objeto String (hello2). , a7 en la memoria del montón. La referencia apunta a él.

Al asignar la variable a3=b 2 en la sección anterior, se define una clase StringBuilder en el código de bytes de la clase, se llama dos veces al método append() y by 2 se agregan en secuencia, es decir , hola y 2, una vez que el método toString() crea objetos en la memoria del montón.

La diferencia entre StringBuffer y StringBuilder es la seguridad de los subprocesos.

StringBuffer guarda datos a través de la matriz char[]. Los nuevos datos de cada método append() se guardan en la matriz char[]. Admite diferentes tipos. El tipo booleano guarda 4 o 5 caracteres (verdadero/falso). ), la cadena guarda cada carácter y la clase StringBuffer puede modificar la cadena al concatenar cadenas, no se generarán nuevos objetos y la matriz char [] se operará y cambiará directamente.

Casi todos los métodos de operación de caracteres están sincronizados y esta clase es segura para subprocesos.

El método toString() crea un objeto String asociado con la matriz char[].

Queda un largo camino por recorrer