En primer lugar, debemos tener claro que todavía hay una diferencia en el método interno de la clase de cadena en JDK1.6 y JDK1.7:
Pasante en JDK1.6:
Al llamar al método interno, primero, vaya al grupo constante para ver si existe un valor al mismo que existe el valor de cadena actual. Si existe, devolverá directamente una referencia al valor de cadena en el grupo constante; Si no existe, la cadena del montón original se copiará en la piscina constante.
Pasante en JDK1.7:
Al llamar al método interno, primero, vaya al grupo constante para ver si existe un valor al mismo que existe el valor de cadena actual. Si existe, devolverá directamente una referencia al valor de cadena en el grupo constante; Si no existe, solo colocará la referencia al montón original en el grupo constante y no copiará toda la cadena en el grupo constante.
Esto significa que JDK1.6 y JDK1.7 se manejan de manera diferente cuando esta cadena no existe en el grupo constante.
El siguiente es un ejemplo para verificar y explicar:
Ejemplo:
public static void main (string [] args) {string str = "str"+new String ("01"); ① str.intern (); ② string str1 = "str01"; ③ system.out.println (str == str1); Cadena str2 = nueva cadena ("str01"); ④ str2.intern (); ⑤ string str3 = "str01"; ⑥ system.out.println (str2 == str3); Cadena str4 = "str01"; ⑦ string str5 = new String ("str")+new String ("01"); ⑧ str5.intern (); ⑨ System.out.println (str4 == Str5); En JDK1.6, el resultado de la salida es:
FALSO
FALSO
FALSO
explicar:
① Durante la ejecución, se creará un objeto de cadena con el valor "str01" en la memoria de montón, y se crearán constantes "str" y "01" en el grupo constante;
② Al ejecutar, primero vaya al grupo constante para verificar si hay un valor constante de "STR01" y descubra que no existe. El método de JDK1.6 es generar una copia de la cadena "Str01" en el grupo constante;
③ Durante la ejecución, se creará un objeto "STR01" en el grupo constante, y se encontrará que ya existe, por lo que no se creará nuevo;
La razón de la primera salida falsa es que STR apunta a "STR01" en la memoria del montón, mientras que STR1 apunta a "STR01" en el grupo constante;
④ Al ejecutar, se creará un objeto Str2 con un valor de "STR01" en la memoria del montón, y se creará una constante con un valor de "Str01" en el grupo constante;
⑤ Al ejecutar, primero vaya al grupo constante para verificar si hay un valor constante de "STR01". Cuando se encuentra que existe, devolverá directamente esta referencia constante;
⑥ Durante la ejecución, se creará un valor constante de "STR01" en el grupo constante. Si se encuentra que ya existe, no se creará;
La razón de la segunda salida falsa es que Str2 apunta a "STR01" en la memoria de almacenamiento moneda, mientras que STR3 apunta a "STR01" en el grupo constante;
⑦ Durante la ejecución, se creará un valor constante de "STR01" en el grupo constante;
⑧ Cuando se ejecuta, se creará un objeto Str5 con el valor "STR01" en la memoria del montón, y se crearán constantes "Str" y "01" en el grupo constante;
⑨ Al ejecutar, el grupo constante se utilizará para verificar si hay un valor constante de "STR01". Si se encuentra, devolverá directamente esta referencia constante;
La razón de la tercera salida falsa es que Str5 apunta a "str01" en la memoria de montón, mientras que STR4 apunta a "str01" en el grupo constante;
En JDK1.7, el resultado de la salida es:
verdadero
FALSO
FALSO
explicar:
Descubrí que solo el primer resultado de salida es diferente, por lo que solo explicamos la razón del primero:
① Durante la ejecución, se creará un objeto de cadena con el valor "str01" en la memoria de montón, y se creará una constante "str" y "01" en el grupo constante; (Esto no es diferente de JDK1.6)
② Al ejecutar, primero vaya al grupo constante para verificar si hay un valor constante de "STR01" y descubra que no existe. El método de JDK1.7 es copiar la referencia de "STR01" en la memoria de montón al grupo constante;
③ Durante la ejecución, se creará un objeto "STR01" en el grupo constante, y se encontrará que ya existe, por lo que no se creará nuevo;
Luego, en este momento, Str y Str1 apuntarán al valor de "STR01" en la memoria de almacenamiento, por lo que los dos son iguales;
Lo anterior es una comparación del método interno de la clase de cadena en JDK1.6 y JDK1.7. Hay diferencias. Los amigos que lo necesitan pueden referirse a él.