Porque o == compara se duas instâncias do objeto tipo String são iguais, o equals compara se o valor de dois objetos do tipo String são iguais (o que é, geralmente, mais indicado)
O operador == retornará true caso verifiquemos se as variáveis de mesmo valor/conteúdo apontam para o mesmo endereço de memória de um objeto distinto.
O equals retorna um boolean que verifica se dois objetos são iguais ou não .
Segue um exemplo reescrevendo a assinatura do método equals da classe java.lang.Object:
public class Livro {
...
public boolean equals(Object obj) {
if (obj instanceof Livro) // verifica se o objeto passado é compatível com a classe em questão
return Codigo.equals((Livro)obj.getCodigo());
else
return false;
}
}
Assumindo uma comparação por igualdade entre 2 instâncias distintas:
Livro livro1 = new Livro("123456");
Livro livro2 = new Livro("123456");
if (livro1.equals(livro2)) {
System.out.println("objetos são iguais");
} else {
System.out.println("objetos são diferentes");
}
Mesmo sendo 2 objetos distintos (livro1 e livro2), o programa mostrará “objetos são iguais”, pois os objetos em questão tem o mesmo Codigo (123456).