Let's say I have a person class and equality is based on id attribute. Below is the implementation of Person class -
class Person {
    private int id;
    private String firstName;
    public Person(int id, String firstName) {
        super();
        this.id = id;
        this.firstName = firstName;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public int hashCode() {
        return this.id;
    }
    public boolean equals(Object obj) {
        return ((Person) obj).getId() == this.id;
    }
}
I am using Person class as as key of a HashMap. Now see below code -
import java.util.HashMap;
public class TestReport {
    public static void main(String[] args) {
        Person person1 = new Person(1, "Person 1");
        Person person2 = new Person(2, "Person 2");
        HashMap<Person, String> testMap = new HashMap<Person, String>();
        testMap.put(person1, "Person 1");
        testMap.put(person2, "Person 2");
        person1.setId(2);
        System.out.println(testMap.get(person1));
        System.out.println(testMap.get(person2));
    }
}
Notice, though we have added two different person object as key to the HashMap, later we have changed the id of person1 object to 2 to make both the person object equal.
Now, I am getting output as -
Person 2
Person 2
I can see there are two key-value pairs in the HashMap with data: "person1/Person 1" and "person2/Person 2", still I will always get "Person 2" as output and I can never access value "Person 1". Also notice, we have duplicate key in HashMap.
I can understand the behavior after looking at the source code, but doesn't it seem to be problem? Can we take some precaution to prevent it?
 
     
     
    