hashcode 和 equals 方法同时重写原理
-
HashMap、HashSet中判断两个Key值是否相等时先判断两者的hashcode是否一样,若不同则判定两者不同;若相同,则再通过equals方法判断两者是否相同,若仍相同则判定两个Key值是同一个,否则不是同一个。故一般而言,hashcode和equals方法需要同时重写,否则在容器中应用时可能出错。
- 设定Help类,定义两个int型成员变量,重写其hashcode方法和equals方法使得当两个对象的成员变量相等时,hashcode方法返回同一个值,equals方法判定相等。
import java.util.*; public class Help { private int x; private int y; public Help(int x, int y) { this.x = x; this.y = y; } @Override public int hashCode() { int prime = 31; return prime * (prime + x) + y; } @Override public boolean equals(Object obj) { if(this == obj) { return true; } if(obj == null) { return false; } if(this.getClass() != obj.getClass()) { return false; } Help help = (Help)obj; if(this.x != help.x) { return false; } return this.y == help.y; } public static void main(String[] args) { Help h1 = new Help(1, 1); Help h2 = new Help(2, 2); Help h3 = new Help(3, 3); Help h4 = new Help(1, 1); HashMap<Help, Integer> hm = new HashMap<>(); hm.put(h1, 1); hm.put(h2, 1); hm.put(h3, 1); hm.put(h4, 1); System.out.println("HashMap 中的元素有 " + hm.size() + " 个"); // HashSet<Help> hs = new HashSet<>(); // hs.add(h1); hs.add(h2); hs.add(h3); hs.add(h4); // System.out.println("HashSet中的元素有 " + hs.size() + " 个"); } }
- 运行所示代码可以看到HashMap中元素有3个,可以推测h1和h4被判定为同一个Key值;注释掉重写的hashcode方法,运行结果为4个,说明当hashcode值不同时,Key值不同;保留hashcode方法,注释掉equals方法,运行结果也为4个,说明即使hashcode值相同,Key值是否相同也会再通过equals方法来判断。