我在一个教程中找到了这个示例。
当我运行此程序时,我的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<Object> hs = new HashSet<Object>(); hs.add(h1); hs.add(h2); hs.add(s1); hs.add(s2); System.out.print(hs.size()); } }
当上述程序中的equal方法调用时
您的代码将调用equals()的HashTest唯一一次。另一次调用equals()方法将是equals()对的String类。
equals()
HashTest
String
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
此答案说明何时equals()由HashSet和何时调用方法。摘录:
HashSet
HashSet利用哈希码来加快处理速度。假定彼此相等的两个对象将具有相同的哈希码。但是,它不假定具有相同哈希码的两个对象意味着它们相等。这就是为什么当它检测到冲突的哈希码时,它仅与具有相同哈希码的集合中的其他对象(在您的情况下为一个)进行比较。