Java Collection How to - Update Java HashMap Object key only, result in unexpected behaniour








Question

We would like to know how to update Java HashMap Object key only, result in unexpected behaniour.

Answer

import java.util.HashMap;
/* w w  w  .  java2 s .c  om*/
public class Main {
    public static void main (String [] args)  {
        MyKey e1 = new MyKey(1);
        MyKey e2 = new MyKey(2);

        HashMap<MyKey, Integer> map = new HashMap<>();
        map.put(e1, 1);
        map.put(e2, 2);

        System.out.println(map.get(e1));
        System.out.println(map);

        e1.setValue(9);
        System.out.println(map.get(e1));
        System.out.println(map);

        e1.setValue(2);
        System.out.println(map.get(e1));
        System.out.println(map);

        
        MyKey e3 = new MyKey(2);
        System.out.println(map.get(e3));    
    }
}

class MyKey {
  private int n;

  public MyKey(int n) {
      this.n = n;
  }

  public void setValue(int n) {
      this.n = n;
  }

  @Override
  public int hashCode() {
      return n;
  }

  @Override
  public boolean equals(Object e) {
      if (this == e)
          return true;
      if (!(e instanceof MyKey))
          return false;
      MyKey an = (MyKey) e;
      return n == an.n;
  }

  @Override
  public String toString() {
    return "MyKey [n=" + n + "]";
  }
  
}

The code above generates the following result.