当HashSet调用相等的方法?

我在一个教程中找到了这个例子。

当我运行这个时,我得到hs.size()值为2 ..并且只调用一次equals方法任何人在HashSet中调用equal()方法时解释我

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 hs = new HashSet(); hs.add(h1); hs.add(h2); hs.add(s1); hs.add(s2); System.out.print(hs.size()); } } 

当相等的方法调用上述程序时

您的代码只会调用一次HashTestequals() 。 另一次调用equals()方法将是String类的equals()

 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 

这个答案解释了什么时候HashSet调用equals()方法,什么时候不调用。 摘录自:

HashSet利用哈希码来加快速度。 它假设两个相等的对象将具有相同的哈希码。 但是,它并不假设具有相同哈希码的两个对象意味着它们是相等的。 这就是为什么当它检测到冲突的哈希码时,它只会与具有相同哈希码的集合中的其他对象(在您的情况下为一个)进行比较。