根据“类是否覆盖equals()方法”,将它分为2类。
若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。
我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。
“hashCode() 和 equals() ”是有关系的:
1)、如果两个对象相等,那么它们的hashCode()值一定相同。
这里的相等是指,通过equals()比较两个对象时返回true。
2)、如果两个对象hashCode()相等,它们并不一定相等。
因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等
参考代码 (ConflictHashCodeTest1.java):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| 1 import java.util.*; 2 import java.lang.Comparable; 3 4
10 public class ConflictHashCodeTest1{ 11 12 public static void main(String[] args) { 13 14 Person p1 = new Person("eee", 100); 15 Person p2 = new Person("eee", 100); 16 Person p3 = new Person("aaa", 200); 17 18 19 HashSet set = new HashSet(); 20 set.add(p1); 21 set.add(p2); 22 set.add(p3); 23 24 25 System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode()); 26 27 System.out.printf("set:%s\n", set); 28 } 29 30
33 private static class Person { 34 int age; 35 String name; 36 37 public Person(String name, int age) { 38 this.name = name; 39 this.age = age; 40 } 41 42 public String toString() { 43 return "("+name + ", " +age+")"; 44 } 45 46
49 @Override 50 public boolean equals(Object obj){ 51 if(obj == null){ 52 return false; 53 } 54 55 56 if(this == obj){ 57 return true; 58 } 59 60 61 if(this.getClass() != obj.getClass()){ 62 return false; 63 } 64 65 Person person = (Person)obj; 66 return name.equals(person.name) && age==person.age; 67 } 68 } 69 }
|