Hablar de String en jvm

Piscina constante

Tres piscinas constantes

  • El grupo constante en el archivo de clase: grupo constante
  • Grupo de constantes en tiempo de ejecución: el cargador de clases analiza el grupo de constantes en el archivo de clase y lo almacena en ConstantPool * _constants en la clase InstanceKlass en el área de métodos.
  • Pool de constantes de cadena: esta es una estructura de datos String Pool bajo el montón, realizada por la HashTable subyacente, un formulario de almacenamiento de valor clave
    • Genere valor hash por contenido de cadena + longitud. Convertir hash a clave
    • El valor es encapsular un instanceOopDesc ​​de la clase String en un HashtableEntry.

experimentar

  • String s1 = "11";
    El objeto String generado por "11" se encapsulará directamente en HashtableEntry, y las variables en la pila apuntan al objeto String. Irá a HashTable para ver si esta clave existe, luego devolverá directamente la referencia del objeto String.Inserte la descripción de la imagen aquí
  • String s1 = new String ("11");
    Debido a que se llama a la nueva instrucción, se generará un objeto Stri. En este momento, irá a HashTable para ver si la clave existe. Si existe, devolverá directamente la Char matriz de su objeto String. Es decir, la referencia de typeArrayOopDese al nuevo objeto String.
    Inserte la descripción de la imagen aquí
  • Al buscar en HashTable, si se encuentra, devolverá directamente una referencia al objeto String.
    Inserte la descripción de la imagen aquí
  • Obviamente, lo mismo es cierto cuando se usa new, pero aún creará una instancia de objeto String.
    Inserte la descripción de la imagen aquí

Cómo realizar la capa inferior de las cuerdas de empalme

  • Comillas dobles + comillas dobles
public class TestString_5 {
    
    
    public static void main(String[] args) {
    
    
    	test2();
    }
    public static void test2() {
    
    
        String s1 = "1";
        String s2 = "1";
        String s = s1 + s2;
    }
}
  • Bytecode
0 ldc #2 <1>
 2 astore_0
 3 ldc #2 <1>
 5 astore_1
 6 new #3 <java/lang/StringBuilder>
 9 dup
10 invokespecial #4 <java/lang/StringBuilder.<init>>
13 aload_0
14 invokevirtual #5 <java/lang/StringBuilder.append>
17 aload_1
18 invokevirtual #5 <java/lang/StringBuilder.append>
21 invokevirtual #6 <java/lang/StringBuilder.toString>
24 astore_2
25 return

Se puede ver en lo anterior que en realidad se usa un código similar al siguiente

new StringBuilder().append("1").append("1").toString();
// StringBuilder的toString()调用的是:
new String(char[], 0, count);
//上面这种创建会直接生成String实例,并没有加入到常量池中去。
//可以通过intern()方法将其放入常量池。
  • Explica los siguientes cambios en el espacio de código.
String str ="1"+"2"+new String("3")+"4"+"5"+new String("6")+"7";
//上面看字节码等价于下面
String str ="12"+new String("3")+"45"+new String("6")+"7";

Creó "12", "3", "45", "6", "7" instancias de String e instancias de Char [] en la memoria y las puso en el grupo constante, así como las últimas instancias de String "1234567" y Char [ ] instancia y no poner en el grupo constante

pasante () resumen

  • En JDK1.6, intente poner este objeto de cadena en el grupo de cadenas.
    • Si hay en la piscina de cuerdas, no se colocará. Devuelve la dirección del objeto en el grupo de cadenas existente
    • De lo contrario, hará una copia de este objeto, lo pondrá en el grupo de cadenas y devolverá la dirección del objeto en el grupo de cadenas.
  • Desde JDK1.7, intente poner este objeto de cadena en el grupo de cadenas.
    • Si hay en la piscina de cuerdas, no se colocará. Devuelve la dirección del objeto en el grupo de cadenas existente
    • De lo contrario, copiará la dirección de referencia del objeto, la pondrá en el grupo de cadenas y devolverá la dirección de referencia en el grupo de cadenas.

Supongo que te gusta

Origin blog.csdn.net/null_zhouximin/article/details/112690610
Recomendado
Clasificación