private int hash; // Default to 0 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i ) { h = 31 * h val[i]; } hash = h; } return h; }
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i ; } return true; } } return false; }
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o){ if(this == o){ return true; } if(o instanceof Person){ Person p = (Person)o; return this.age == p.getAge() && this.name.equals(p.getName()); } return false; } }
public class Application { public static void main(String[]args){ Set<Person> set = new HashSet<>(); Person p1 = new Person("Lilei", 25); Person p2 = new Person("Lilei", 25); set.add(p1); System.out.println("p1 equals p2: " (p1 == p2));//1 System.out.println("set contains p1: " set.contains(p1));//2 System.out.println("set contains p2: " set.contains(p2));//3 } }
p1 equals p2: false set contains p1: true set contains p2: false
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Application { public static void main(String[]args){ Set<Person> set = new HashSet<>(); Person p1 = new Person("Lilei", 25); Person p2 = new Person("Lilei", 25); set.add(p1); set.add(p2); System.out.println("set size is: " set.size()); //System.out.println("p1 equals p2: " (p1 == p2)); //System.out.println("set contains p1: " set.contains(p1)); //System.out.println("set contains p2: " set.contains(p2)); } }
set size is: 2
@Override public int hashCode(){ return name.hashCode() * 31 age; }
set size is: 2
@Override public boolean equals(Object o){ if(this == o){ return true; } if(o instanceof Person){ Person p = (Person)o; return this.age == p.getAge() && this.name.equals(p.getName()); } return false; } @Override public int hashCode(){ return name.hashCode() * 31 age; }
set size is: 1
这一点和第二点实际上是一样的,这里就不举例介绍了。 实际上,Set的对象和Map的key的操作和hashCode以及equals方法有关,比如查这个对象是否在Set里,先根据hashCode定位到一个段,在根据equals进行确定是否存在,这样不需要把Set里所有的对象都遍历一遍,效率太低,Map的key是同样道理。 那么hashCode和equals的设计原则就呼之欲出了。