小编典典

当HashSet调用equal方法时?

java

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

当我运行此程序时,我的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方法调用时


阅读 332

收藏
2020-11-23

共1个答案

小编典典

您的代码将调用equals()HashTest唯一一次。另一次调用equals()方法将是equals()对的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利用哈希码来加快处理速度。假定彼此相等的两个对象将具有相同的哈希码。但是,它不假定具有相同哈希码的两个对象意味着它们相等。这就是为什么当它检测到冲突的哈希码时,它仅与具有相同哈希码的集合中的其他对象(在您的情况下为一个)进行比较。

2020-11-23