我在一个教程中找到了这个例子。
当我运行这个时,我得到 hs.size() 值为 2 ..并且 equals 方法仅被调用一次 任何人都可以解释一下当 equal() 方法在 HashSet 中调用时
import java.util.HashSet;
public class HashTest {
private String str;
public HashTest(String str) {
this.str = str;
}
@Override
public String toString() {
return str;
}
@Override
public int hashCode() {
return this.str.hashCode();
}
@Override
public boolean equals(Object obj) {
System.out.println("calling equal method");
if (obj instanceof HashTest) {
HashTest ht = (HashTest) obj;
System.out.println(ht.str);
return this.str.equals(ht.str);
}
else
{
System.out.println("Not equal");
}
return false;
}
public static void main(String args[]) {
HashTest h1 = new HashTest("1");
HashTest h2 = new HashTest("1");
String s1 = new String("2");
String s2 = new String("2");
HashSet<Object> hs = new HashSet<Object>();
hs.add(h1);
hs.add(h2);
hs.add(s1);
hs.add(s2);
System.out.print(hs.size());
}
}
当上面程序中调用 equal 方法时
您的代码将调用equals()
of HashTest
只有一次。另一次它调用equals()
方法将是equals()
of the String
class.
hs.add(h1); // Nothing is called
hs.add(h2); // Calls the equals() method of HashTest, thus the log
hs.add(s1); // Nothing is called
hs.add(s2); // Calls the equals() method of String
这个答案 https://stackoverflow.com/a/5397003/2024761解释了当equals()
方法被调用HashSet
以及何时不是。摘录如下:
HashSet 利用哈希码来加快速度。它假设两个彼此相等的对象将具有相同的哈希码。然而,它并不假设两个具有相同哈希码的对象意味着它们是相等的。这就是为什么当它检测到冲突的哈希码时,它只与具有相同哈希码的集合中的其他对象(在您的情况下是一个)进行比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)