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. - 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.
- Al buscar en HashTable, si se encuentra, devolverá directamente una referencia al objeto String.
- Obviamente, lo mismo es cierto cuando se usa new, pero aún creará una instancia de objeto String.
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.