E' uma instancia ou n?

Quem poderia tirar uma duvida minha.
Se eu tenho as segiuntes linhas no meu codigo java.

String a = new String(); //Criei uma nova instacia. a = "Test"; //Valorizo String b = "Test"; // E' criada uma nova instacia?

Qual a diferença entre criar uma String criando uma nova instacia depois valorizando-a e (String a) criar uma String valorizando-a diretamente sem dar o new (String b)?

Sei q é uma pergunta basica, mas isso ta me fazendo quebrar a cabeça.

Agradeço desde ja.

Quando vc faz.

String a = "ABC"; //cria-se uma instância
String b = "ABC"; // não se cria instância

Na verdade b e a apontam para o mesmo local. Por isso, se vc fizer

if (a == b) { 
    System.out.println("São iguais!"); 
} else {
    System.out.println("São diferentes!"); 
}

na tela aparece São iguais!.

Entretanto se vc fizer

String a = "ABC"; //cria-se uma instância
String b = new String("ABC"); // cria-se uma instância

b e a não mais apontam para a mesma área de memória, então se vc rodar o mesmo if de cima aparecerá que são diferentes.

Entao se eu fizer

String a = "ABC"; String b = "FGH";

Significa que elas vao estar apontando para o mesmo espaço de memoria? Ou seja, nesse caso tb serao “iguais”?
O valor nesses casos n tem importancia, certo?

[quote=Skim]Entao se eu fizer

String a = "ABC"; String b = "FGH";

Significa que elas vao estar apontando para o mesmo espaço de memoria? Ou seja, nesse caso tb serao “iguais”?
O valor nesses casos n tem importancia, certo?[/quote]

Claro que tem, elas só apontam pro mesmo espaço se tiverem o conteúdo igual.

a está apontando pra um espaço e b para outro, pois ABC != FGH.
Se vc criasse um String c = “ABC” então a e c apontariam pro mesmo espaço.

Pelo oq eu entendi entao elas serao iguais se tiverem um conteudo igual e se eu n tiver usado em nenhum dos dois casos o New.

Pelo oq eu entendi entao elas serao iguais se tiverem um conteudo igual e se eu n tiver usado em nenhum dos dois casos o New.[/quote]

Sim. O que ocorre na verdade quando você faz

String a = "ABC"; 

é a criação de uma string de forma literal e neste caso, quando se criam strings dessa forma, elas vão para um pool de Strings. Caso você declare uma nova variável da seguinte forma

String b = "ABC";

a JVM procura no pool de strings para ver se já existe uma string igual e, caso exista, faz sua variável apontar para o mesmo endereço de memória. Por este motivo, quando vc testa a igualdade das variáveis a e b através do “==”, ela retorna true.

Mas, se vc criar strings assim

String b = new String("ABC");

você está criando um novo objeto em memória e se testar a igualdade das variáveis a e b com “==”, ela retornará false, pois não apontam para o mesmo lugar na memória…

Vlw