Sorry … about this silly/stupid question, guys:
Why aren’t equals() and hashCode() being applied?
Currently they are only working as I expected for HashSet.
UPDATE
EVEN key value 5 is repeated but it doesn’t call equals and hashCode.
I want to apply it also on Value.
As just like HashSet calls equal and hashCode in this example, why hashMap is not being called equals and hashCode even if for key.
UPDATE2 – ANSWER
HashMap’s key(class->HashCode, equals) would be called.
Thank you All.
I was little bit confused on this.
🙂
public class Employee {
int id;
String name;
int phone;
public Employee(int id, String name, int phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
// Getter Setter
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Employee other = (Employee) obj;
System.out.println("Employee - equals" + other.getPhone());
if (this.id != other.id) {
return false;
}
if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
return false;
}
if (this.phone != other.phone) {
return false;
}
return true;
}
@Override
public int hashCode() {
System.out.println("Employee - hashCode" );
int hash = 3;
hash = 67 * hash + this.id;
hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
hash = 67 * hash + this.phone;
return hash;
}
}
____________________________________________________________________________________
public class MapClass {
public static void main(String[] args) {
Map<Integer,Employee> map = new HashMap<Integer,Employee>();
map.put(1, new Employee(1, "emp", 981));
map.put(2, new Employee(2, "emp2", 982));
map.put(3, new Employee(3, "emp3", 983));
map.put(4, new Employee(4, "emp4", 984));
map.put(5, new Employee(4, "emp4", 984));
**//UPDATE**
map.put(5, new Employee(4, "emp4", 984));
System.out.println("Finish Map" + map.size());
Set<Employee> set = new HashSet<Employee>();
set.add(new Employee(1, "emp", 981));
set.add(new Employee(2, "emp2", 982));
set.add(new Employee(2, "emp2", 982));
set.add(new Employee(3, "emp3", 983));
set.add(new Employee(4, "emp4", 984));
set.add(new Employee(4, "emp4", 984));
System.out.println(set.size());
}
}
OUTPUT IS
Finish Map5
Employee - hashCode
Employee - hashCode
Employee - hashCode
Employee - equals982
Employee - equals982
Employee - hashCode
Employee - hashCode
Employee - hashCode
Employee - equals984
Employee - equals984
4
Yes it does call hashCode, on the key, the Integer.
Dose of reality: Java HashMaps don’t work that way. They check the key only for duplicates, not the value, and this is as it should be.
If you want Employee’s hash to be checked in the Map, then it must be the key. Period.
Another possible solution is to download one of the multimaps that are available.
Edit to see that it’s calling hashCode and equals, change your Map’s key type to something like so:
Then fill your Map like so:
and you’ll see: