- 什么是hashcode和equals方法
这里首先明白一个问题,比较两个对象,如果他们的equals想等,那么他们的hashcode一定相等,而如果他们的hashcode相等的话,他们的equals不一定相等这是为什么呢?
当比较两个对象时,先比较他们的hash码,再比较他们的equals方法
所以光重写equals方法或者hashcode方法是没用的,必须两个同时重写。
2.为什么要重写hashcode()和equals()方法
String和integer自带了hashcode()和equals方法,而我们自己写的类不带有,当出现下列情况时(有类A)
A a = new A(1);
A b = new A(1);
这样产生的两个对象的hash码是不一样的。
- 怎么重写
class B { private int i; public B(int i) { this.i = i; } public boolean equals(Object ob) { B bb = (B)ob; return this.i == bb.i; } public int hashCode() //Integer(1) { return new Integer(i).hashCode(); } } class Student { private int id; private String name; public Student(int id, String name) { this.id = id; this.name = name; } public int hashCode() { //return new String(name+id).hashCode(); return id * name.hashCode(); } } public class TestHash { public static void main(String[] args) { // B bb1 = new B(1); // B bb2 = new B(10); // System.out.println(bb1.equals(bb2)); //true // System.out.println(bb1.hashCode() == bb2.hashCode()); // false Student st1 = new Student(1, "1111"); Student st2 = new Student(1, "1111"); System.out.println(st1.hashCode() == st2.hashCode()); // } }
class Student { int num; String name; Student(int num, String name) { this.num = num; this.name = name; } public int hashCode() { return num * name.hashCode(); } public boolean equals(Object o) { Student s = (Student) o; return num == s.num && name.equals(s.name); } public String toString() { return num + ":" + name; } }