[quote=dtxk]porque são diferentes as duas condições abaixo:
String nome1= new String("Fulano");
String nome2 = new String("Fulano");
if(nome1 == nome2){ //FALSE
System.out.println("Iguais");
}
String nome1= "Fulano";
String nome2 = "Fulano";
if(nome1 == nome2){ //TRUE
System.out.println("Iguais");
}
Na primeira se cria um endereço na memória pelo que eu entendi e o segundo com o autoboxing não?
Obrigado por qualquer ajuda[/quote]
aqui temos envolvida nessa pergunta dois conceitos, vamos por partes:
primeiro o conceito de igualdade, o == não compara se os dois objetos são vamos dizer assim equivalentes, se seu conteúdo deve ser considerado igual, isso compara se as suas duas variáveis apontam para o mesmo objeto la na memória (lembre-se que variáveis de objetos são apenas um “apontador” para o objeto, não são o objeto em si, mas sim a “flexinha”, um terceiro conceito alias).
o segundo conceito é a forma pela qual a JVM lida com strings, quando você cria uma string no seu código abrindo aspas digitando algo e fechando aspas, a JVM cria essa string e a insere em um pool interno de objetos de string dela. ok, se você criar outro objeto de string da mesma forma, abrindo e fechando aspas, com o mesmo conteudo, a jvm deve identificar que ja existe um objeto assim no pool dela e então usará esse objeto já criado, não um novo, então o == retornará true, ja que se referem ao mesmo objeto aproveitado la no pool. Diferentemente quando você usar o operador new com algum objeto (seja qual for, incluindo string) ai a jvm criará um objeto novo e irá inseri-lo na memória, por ser um objeto novo, diferente, então o == retornará false.
ainda em tempo, para se comparar a igualdade entre objetos, deve-se usar o método equals, se você comparar usando o equals ao invés do == no seu exemplo você terá o resultado que você espera. Caso seja uma classe sua, que você criou, que não seja da api e você queira fazer comparações você precisará sobrescrever o método equals (crie um método equals na sua classe).
em tempo, o conceito de auto boxing que eu saiba se refere a conversão implícita de tipos primitivos para objetos, não é o caso deste exemplo.