Para dados com o mesmo conteúdo, precisar ser gerado o mesmo hashCode.
Nunca gera
um diferente:
String nome1 = "Maria";
String nome2 = "Maria";
sout([Link]());
sout([Link]());
Esse número é gerado por uma função dentro da classe Object
Como o número inteiro é limitado a 32 bits, o hashCode gerado pode dá colisões,
ou seja, ter objetos diferentes que, por coincidência, geraram o mesmo hashCode.
Mas é difícil de acontecer.
Se você for encontra um objeto em uma lista enorme de elementos, você compara o
seu objeto com o objeto da lista, você faz essa comparação usando o hashCode, se em
algum momento o hashCode do objeto que você está buscando for igual ao elemento da
lista, você vai e confirma a igualdade com o método equals();
Exemplo:
Vamos comparar se um Cliente é igual ao outro com base no nome. Geraremos uma
implementação dos métodos equals e hashCode na classe Client. Para isso, aperte alt
+ inserct + equals() and hashCode e selecione os atributos que você quer comparar
os objetos (nome).
O equals recebe um Object como argumento
c1 == c2
- dá false porque o ==, com exceções de tipos com tratamentos especiais, como o
String, não compara o conteúdo dos objetos, mas sim as referências de memória. Como
dois objetos diferentes foram alocados no Heap, eles têm posições de memória
diferentes, por isso dá falso. A referência de memória deles são diferentes.
- Se fosse quiser comparar se dois objetos são iguais pelo seu conteúdo, você dá
preferência ao equals(). Se quiser comparar as referências dos objetos, utilize ==;
String s1 = "Test";
String s2 = "Test";
sout(s1 == s2); -> true;
-Dá true porque o compilador dá um tratamento especial com literais
String s1 = new String("Text");
String s2 = new String("Test");
sout(s1 == s2); -> false. Porque dois objetos diferentes foram criados.