Ok, deixe-me explicar o conceito em palavras muito simples.
Primeiramente, de uma perspectiva mais ampla, temos coleções, e o hashmap é uma das estruturas de dados nas coleções.
Para entender por que precisamos substituir o método equals e hashcode, se for necessário primeiro entender o que é o hashmap e o que ele faz.
Um hashmap é uma estrutura de dados que armazena pares de dados-chave de valor de maneira array. Vamos dizer a [], onde cada elemento em 'a' é um par de valores-chave.
Além disso, cada índice na matriz acima pode ser vinculado à lista, tendo assim mais de um valor em um índice.
Agora, por que um hashmap é usado? Se tivermos que pesquisar em uma matriz grande, pesquisando em cada uma delas, se elas não forem eficientes, o que a técnica de hash nos diz que permite pré-processar a matriz com alguma lógica e agrupar os elementos com base nessa lógica, por exemplo, Hashing
por exemplo: temos matriz 1,2,3,4,5,6,7,8,9,10,11 e aplicamos uma função hash mod 10 para que 1,11 sejam agrupados. Portanto, se tivéssemos que procurar 11 na matriz anterior, teríamos que iterar a matriz completa, mas quando a agrupamos, limitamos nosso escopo de iteração, melhorando assim a velocidade. Essa estrutura de dados usada para armazenar todas as informações acima pode ser vista como uma matriz 2D para simplificar
Agora, além do hashmap acima, também informa que ele não adicionará duplicados. E esta é a principal razão pela qual temos que substituir os iguais e o código de hash
Então, quando se diz que explica o trabalho interno do hashmap, precisamos descobrir quais métodos o hashmap possui e como ele segue as regras acima, que expliquei acima
portanto, o hashmap tem o método chamado como put (K, V) e, de acordo com o hashmap, ele deve seguir as regras acima para distribuir eficientemente a matriz e não adicionar duplicatas
Então, o que faz é que ele primeiro gere o código hash da chave especificada para decidir em qual índice o valor deve entrar. se nada estiver presente nesse índice, o novo valor será adicionado por lá, se algo já estiver lá o novo valor deve ser adicionado após o final da lista vinculada nesse índice. mas lembre-se de que nenhuma duplicata deve ser adicionada conforme o comportamento desejado do hashmap. então digamos que você tenha dois objetos Inteiros aa = 11, bb = 11. Como todo objeto derivado da classe de objeto, a implementação padrão para comparar dois objetos é que ele compara a referência e não os valores dentro do objeto. Portanto, no caso acima, ambos semânticos iguais serão reprovados no teste de igualdade e a possibilidade de existirem dois objetos com o mesmo código de hash e os mesmos valores, criando duplicatas. Se substituirmos, poderemos evitar adicionar duplicatas. Você também pode consultarDetalhe de trabalho
import java.util.HashMap;
public class Employee {
String name;
String mobile;
public Employee(String name,String mobile) {
this.name=name;
this.mobile=mobile;
}
@Override
public int hashCode() {
System.out.println("calling hascode method of Employee");
String str=this.name;
Integer sum=0;
for(int i=0;i<str.length();i++){
sum=sum+str.charAt(i);
}
return sum;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
System.out.println("calling equals method of Employee");
Employee emp=(Employee)obj;
if(this.mobile.equalsIgnoreCase(emp.mobile)){
System.out.println("returning true");
return true;
}else{
System.out.println("returning false");
return false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee emp=new Employee("abc", "hhh");
Employee emp2=new Employee("abc", "hhh");
HashMap<Employee, Employee> h=new HashMap<>();
//for (int i=0;i<5;i++){
h.put(emp, emp);
h.put(emp2, emp2);
//}
System.out.println("----------------");
System.out.println("size of hashmap: "+h.size());
}
}