我想知道在向 ? 中添加新元素(对象)之前检查了哪些因素(1、2 或 3?HashSet
)
如果 中存在唯一元素(对象) pre HashSet
,并且我们尝试添加新对象,那么该集合是否仅比较哈希码或引用 usingequals()
或两者?
HashCode()
equals()
- 1 和 2
换句话说,
如果hashTable.add(obj1) => returns true
, 并且
hashTable.add(obj2) => returns false
,
哪些因素被认为是检查obj2
拒绝将其存储在HashSet
.
我试图通过覆盖函数调用来打印日志,但是在将元素添加到集合时从未调用过 equals()。
public class HashTest {
int a,b;
public HashTest(int a, int b){
this.a=a;
this.b=b;
}
public static void main(String[]args){
HashSet<HashTest> hashTable=new HashSet<HashTest>();
HashTest obj1=new HashTest(1, 2);
HashTest obj2=new HashTest(1, 2);
System.out.println("1. obj1 hash code:"+obj1.hashCode());
System.out.println("2. obj2 hash code:"+obj2.hashCode());
System.out.println("inserting obj1 to the Hash Table:"+hashTable.add(obj1));
System.out.println("inserting obj2 to the Hash Table:"+hashTable.add(obj2));
}
public boolean equals(Object obj){
System.out.println("***equals called");
return super.equals(obj);
}
public int hashCode(){
System.out.println("***hashCode called");
return super.hashCode();
}
}
结果:
***hashCode 调用
- obj1 哈希码:4072869
***hashCode 调用
- obj2 哈希码:1671711
***hashCode 调用
将 obj1 插入哈希表:true
***hashCode 调用
将 obj2 插入哈希表:true