class DiffHash_DiffEqual extends Base { public DiffHash_DiffEqual(String s) { this.s = s; } @Override public int hashCode() { int hash = 5; hash = 67 * hash + Objects.hashCode(this.s); return hash; } @Override public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } final DiffHash_DiffEqual other = (DiffHash_DiffEqual) obj; return Objects.equals(this.s, other.s); } } class DiffHash_SameEqaul extends Base { public DiffHash_SameEqaul(String s) { this.s = s; } @Override public int hashCode() { int hash = 5; hash = 67 * hash + Objects.hashCode(this.s); return hash; } @Override public boolean equals(Object obj) { return true; } } class SameHash_DiffEqaul extends Base { public SameHash_DiffEqaul(String s) { this.s = s; } @Override public int hashCode() { return 1; } @Override public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } final SameHash_DiffEqaul other = (SameHash_DiffEqaul) obj; return Objects.equals(this.s, other.s); } } class SameHash_SameEqual extends Base { public SameHash_SameEqual(String s) { this.s = s; } @Override public int hashCode() { return 1; } @Override public boolean equals(Object obj) { return true; } }
class Base { protected String s; @Override public String toString() { return this.getClass().getSimpleName() + "{" + "s=" + s + '}'; } }
public class TestHashCodeEqals { public static void main(String[] args) { HashMap<DiffHash_DiffEqual, Integer> mapDiffHash_DiffEqual = new HashMap<>(); mapDiffHash_DiffEqual.put(new DiffHash_DiffEqual("aaaaaa"), 1); mapDiffHash_DiffEqual.put(new DiffHash_DiffEqual("bbbbbb"), 2); System.out.println("DiffHash_DiffEqual ----------" + mapDiffHash_DiffEqual.keySet().size() ); HashMap<DiffHash_SameEqaul, Integer> mapDiffHash_SameEqaul = new HashMap<>(); mapDiffHash_SameEqaul.put(new DiffHash_SameEqaul("aaaaaa"), 1); mapDiffHash_SameEqaul.put(new DiffHash_SameEqaul("bbbbbb"), 2); System.out.println("DiffHash_SameEqaul ----------" + mapDiffHash_SameEqaul.keySet().size() ); HashMap<SameHash_DiffEqaul, Integer> mapSameHash_DiffEqaul = new HashMap<>(); mapSameHash_DiffEqaul.put(new SameHash_DiffEqaul("aaaaaa"), 1); mapSameHash_DiffEqaul.put(new SameHash_DiffEqaul("bbbbbb"), 2); System.out.println("SameHash_DiffEqaul ----------" + mapSameHash_DiffEqaul.keySet().size() ); HashMap<SameHash_SameEqual, Integer> mapSameHash_SameEqual = new HashMap<>(); mapSameHash_SameEqual.put(new SameHash_SameEqual("aaaaaa"), 1); mapSameHash_SameEqual.put(new SameHash_SameEqual("bbbbbb"), 2); System.out.println("SameHash_SameEqual ----------" + mapSameHash_SameEqual.keySet().size() ); } }
输出:
DiffHash_DiffEqual ---------- 2 // 两个元素保存在不同内存地址
DiffHash_SameEqaul---------- 2 // 两个元素保存在不同内存地址
SameHash_DiffEqaul ----------2 // 两个元素保存在相同内存地址,构成一个链表
SameHash_SameEqual ---------- 1 //后一个元素替换了前一个元素