segunda-feira, 26 de setembro de 2011

Porque utilizar equals() e não == para comparar String

Uma pergunta bem básica e objetiva, é possível comprar String utilizando == ? Sim. Da certo 100% das vezes? Não.

Uma das primeiras coisas que aprendi quando comecei a programar em java foi JAMAIS utilizar == para comprar Strings, mais porque isso? Vamos a uma explicação técnica.

String é um objeto, o metodo equals(Object) vai retornar true se ambas as Strings tiverem o mesmo objeto. O operador == só ira retornar true se ambas referencias de String apontarem para a mesma referencia do objeto.

Quando criamos uma String de forma literal é criado um pool de Strings, quando criamos uma outra String literal com o mesmo valor a JVM procura se ja existe uma String com esse mesmo valor no pool de Strings, caso exista, faz sua variável apontar para o mesmo endereço de memória. Por este motivo, quando você testa a igualdade das variáveis a e b através do "==", ela retorna true.


String a = "abc";    //pool de string
String b = "abc";    /*ja existe uma string com o mesmo conteúdo no pool,
                                 vai para a mesma referencia na memória*/
String c = "dda";    //vai para uma nova referencia de memoria pois não existe no pool

Se você criar strings assim, você está criando um novo objeto em memória e se testar a igualdade das variáveis a e d com "==", ela retornará false, pois não apontam para o mesmo lugar na memória.

String d = new String("abc");     //Cria um novo objeto na memoria



String a = "abc";
String b = "abc";
String c = "dda";
String d = new String("abc");


a==b = true
a==c = false
a==d = false
a.equals(d) = true