【发布时间】:2015-05-07 11:36:10
【问题描述】:
我已经阅读了 Java 文档页面,但我无法解释,为什么 hashCode() 和 equals() 的调用次数会如此变化?
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class NumberOfCalls {
int field;
public int getField() {
return field;
}
public NumberOfCalls(int field) {
this.field = field;
}
@Override
public int hashCode() {
System.out.println("In Hashcode method.");
return 10;
}
@Override
public boolean equals(Object obj) {
System.out.println("In Equals Method");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NumberOfCalls other = (NumberOfCalls) obj;
if (field != other.field)
return false;
return true;
}
public static void main(String[] args) {
NumberOfCalls object1 = new NumberOfCalls(5);
NumberOfCalls object2 = new NumberOfCalls(6);
NumberOfCalls object3 = new NumberOfCalls(5);
Set<NumberOfCalls> set = new HashSet<NumberOfCalls>();
set.add(object1);
set.add(object2);
Iterator<NumberOfCalls> it = set.iterator();
System.out.print("Size of set is : " + set.size()
+ "\nObject fields values present in set are : ");
while (it.hasNext()) {
System.out.print(it.next().getField() + " ");
}
System.out.println("\n---------------------------------------------------");
System.out.println("Now checking number of calls -- ");
System.out.println("Object1 is present in set ? - " + set.contains(object1)+"\n");
System.out.println("Object2 is present in set ? - " + set.contains(object2)+"\n");
System.out.println("Object3 is present in set ? - " + set.contains(object3)+"\n");
}
}
以上代码的输出是
在哈希码方法中。
在 Hashcode 方法中。
等式法
套装尺寸:2
集合中存在的对象字段值为:6 5----------------------------------- ----
现在检查通话次数 --
在 Hashcode 方法中。
等式法
Object1 存在于集合中? - 是的在哈希码方法中。
Object2 存在于集合中吗? - 是的在哈希码方法中。
等式法
等式法
Object3 存在于集合中吗? - 是的
问题:
- 为什么
hashCode()和equals()在object1的情况下调用一次而不是object2(在这种情况下只调用hashCode())? - 为什么
equals()会在object3的情况下被调用两次?
【问题讨论】: