Fala cs.santos0, a classe String tem um pool de string unicas que é inicialmente vazio, então quando vc cria uma string com o operador “=”, o objeto S1, este é colocado no pool diretamente, logo quando vc chama o método intern() para o objeto S1, é retornado apenas uma referência a esse objeto que já está no pool, já para o objeto S2 criado com o operador new, é criada uma nova referência em memória, que é diferente da referência do objeto S1, por isso o primeiro teste da falso, lembre da diferença entre == e equals, no segundo teste o objeto S2 não está no pool ainda, então o método intern() adiciona-o no pool e retorna uma nova referência a este objeto, que agora é a mesma do objeto S1, por isso o segundo teste também da falso, ja no último teste ambos os objetos tem a mesma referência por isso o resultado é verdadeiro.
“intern” é um método que retorna uma cópia da string, só que localizada no pool de strings. Como cada string só pode aparecer uma única vez no pool de strings, então duas strings diferentes (em termos de objetos, não de conteúdo) podem retornar o mesmo valor na chamada de “intern”, se elas tiverem o mesmo conteúdo.
String s1 = new String ("abacaxi");
String s2 = new String ("abacaxi");
System.out.println (s1 == s2); // imprime false porque ambas as strings são diferentes porque são objetos diferentes
System.out.println (s1.intern() == s2.intern()); // imprime true porque ambas as strings, quando "internadas" no pool, são associadas com a mesma string "abacaxi" do pool.
toni.arc
Desculpa a intromição é que já vi uma questão com esse intern e não tinha compreendido muito. Deixa eu ver se entendi.
Quando se faz:
String S1 = "A"; //Aiciona no pool de Strings
String S2 = new String("A"); //Cria uma instância na memória.
A primeira comparação System.out.println( S1.intern() == S2 ); imprime false pq se está comparando um String que está no pool e uma String que está na memória.
A segunda comparação System.out.println( S2.intern() == S2 ); imprime false pq está tentando comparar uma String que foi adicionada ao pool que agora é a mesma de S1 com uma String ainda na memória S2.
A terceira comparação System.out.println( S2.intern() == S1 ); imprime true pq agora a string q está no pool pode ser utizada por inten() e é comparada com S1 que também está no pool.
Desculpa a inromição mas gostária muito de aprender esse método intern().
Lógicamente é criado um único objeto String de nome a já que vc está instanciando apenas uma única String. E a String vai está no heap. No exemplo acima ela só foi colocada no pool pq o método intern() adiciona ela no pool.