Primeiro de tudo, devemos deixar claro que ainda há uma diferença no método estagiário da classe String em JDK1.6 e JDK1.7:
Estagiário em JDK1.6:
Ao chamar o método estagiário, primeiro, vá para o pool constante para ver se existe um valor igual ao valor atual da string. Se existir, retornará diretamente uma referência ao valor da string no pool constante; Se não existir, a string da pilha original será copiada para o pool constante.
Estagiário em JDK1.7:
Ao chamar o método estagiário, primeiro, vá para o pool constante para ver se existe um valor igual ao valor atual da string. Se existir, retornará diretamente uma referência ao valor da string no pool constante; Se não existir, ele apenas colocará a referência à pilha original no pool constante e não copiará a string inteira no pool constante.
Isso significa que JDK1.6 e JDK1.7 lidam de maneira diferente quando essa string não existe no pool constante.
O seguinte é um exemplo a ser verificado e explicar:
Exemplo:
public static void main (string [] args) {string str = "str"+new string ("01"); ① str.intern (); ② string str1 = "str01"; ③ System.out.println (str == str1); String str2 = new string ("str01"); ④ str2.intern (); ⑤ string str3 = "str01"; ⑥ system.out.println (str2 == str3); String str4 = "str01"; ⑦ string str5 = new string ("str")+new string ("01"); ⑧ str5.intern (); ⑨ system.out.println (str4 == str5); Em JDK1.6, o resultado da saída é:
falso
falso
falso
explicar:
① Durante a execução, um objeto String STR com o valor "STR01" será criado na memória da heap e as constantes "STR" e "01" serão criadas no pool constante;
② Ao executar, primeiro vá para o pool constante para verificar se existe um valor constante de "STR01" e descobre que ele não existe. O método do JDK1.6 é gerar uma cópia da string "STR01" no pool constante;
③ Durante a execução, um objeto "STR01" será criado no pool constante e será encontrado que já existe, para que não seja criado novo;
A razão da primeira saída falsa é que o STR aponta para "STR01" na memória da heap, enquanto o STR1 aponta para "STR01" no pool constante;
④ Ao executar, um objeto String STR2 com um valor de "STR01" será criado na memória da heap e uma constante com um valor de "STR01" será criada no pool constante;
⑤ Ao executar, primeiro vá para o pool constante para verificar se há um valor constante de "STR01". Quando se descobriu que existe, retornará diretamente essa referência constante;
⑥ Durante a execução, um valor constante de "STR01" será criado no pool constante. Se for constatado que já existe, não será criado;
A razão da segunda saída falsa é que o STR2 aponta para "STR01" na memória da heap, enquanto o STR3 aponta para "STR01" no pool constante;
⑦ Durante a execução, um valor constante de "STR01" será criado no pool constante;
⑧ Ao executar, um objeto String STR5 com o valor "STR01" será criado na memória da heap, e as constantes "str" e "01" serão criadas no pool constante;
⑨ Ao executar, o pool constante será usado para verificar se existe um valor constante de "STR01". Se for encontrado, ele retornará diretamente essa referência constante;
A razão da terceira saída falsa é que o STR5 aponta para "STR01" na memória da heap, enquanto o STR4 aponta para "STR01" no pool constante;
Em JDK1.7, o resultado da saída é:
verdadeiro
falso
falso
explicar:
Descobri que apenas o primeiro resultado da saída é diferente, então explicamos apenas o motivo do primeiro:
① Durante a execução, um objeto String STR com o valor "STR01" será criado na memória da heap, e uma constante "str" e "01" será criada no pool constante; (Isso não é diferente de JDK1.6)
② Ao executar, primeiro vá para o pool constante para verificar se existe um valor constante de "STR01" e descobre que ele não existe. O método do JDK1.7 é copiar a referência de "STR01" na memória da heap para o pool constante;
③ Durante a execução, um objeto "STR01" será criado no pool constante e será encontrado que já existe, para que não seja criado novo;
Então, neste momento, STR e STR1 apontarão para o valor de "STR01" na memória da heap, para que os dois sejam iguais;
O exposto acima é uma comparação do método estagiário da classe String em JDK1.6 e JDK1.7. Existem diferenças. Amigos que precisam podem se referir a ele.