Autoboxing e Unboxing no Java
em 04 de Setembro de 2020
Muitos iniciantes em Java frequentemente se esquecem que uma string em particular não é um tipo primitivo de dado, tal como int ou char, mas sim um objeto, ou seja, não se pode utilizar o operador ==
para comparar objetos. A classe Object, que é a classe raiz da hierarquia de classes em Java, oferece o método equals(Object obj) que retorna um valor booleano true, se o objeto que invoca tal função for igual ao outro passado como parâmetro dessa função, ou false caso contrário. O operador == entre objetos apenas checa se suas referências são iguais, mas não seus conteúdos.
String s1 = new String("banana");
String s2 = new String("banana");
//Bloco 1
System.out.println(s1.equals(s2)); //true
//Bloco 2
System.out.println(s1 == s2); //false
O resultado da comparação do "Bloco 1" acima, utilizando a função equals, é true. E do "Bloco 2" é false, apesar de s1 e s2 serem objetos do tipo String, com o mesmo conteúdo, eles possuem endereços diferentes na memória. Mas se modificarmos a criação das strings, sem utilizar o operador new, o resultado será true em ambos os casos.
String s3 = "abacaxi";
String s4 = "abacaxi";
//Bloco 1
System.out.println(s3.equals(s4)); //true
//Bloco 2
System.out.println(s3 == s4); //true
Quando criamos strings literais, usando apenas aspas duplas, o conteúdo delas vão para um pool de strings, conforme figura abaixo.
Então s3 e s4 estão se referindo ao mesmo objeto dentro do pool de strings, por isso s3 == s4 retorna true. E quando o objeto string é criado utilizando operador new, um espaço na memória heap do Java é alocado exclusivamente para aquele objeto, portanto s1 == s2 retorna false nesta situação. O mecanismo de pool de strings auxilia na economia de espaço em memória para o ambiente Java Runtime, embora normalmente leve mais tempo para criar a string. O aconselhável é utilizar o método equals quando quisermos comparar os valores de duas strings para saber se são iguais ou não.