【问题标题】:When HashSet call equal method? [duplicate]HashSet什么时候调用equal方法? [复制]
【发布时间】:2014-02-07 11:39:46
【问题描述】:

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

当我运行这个时,我得到 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方法调用时

【问题讨论】:

  • a.hashCode() == b.hashCode()。即equals 用于在hashCode 冲突的情况下确定两个对象是否相同。 (它也可以在containsremove 方法中使用,但你不要在这里使用它们)。
  • equals 将被调用两次,但您只会记录其中一个调用,因为另一个调用是 String 的方法。

标签: java


【解决方案1】:

您的代码只会调用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

This answer 解释了equals() 方法何时被HashSet 调用以及何时不被调用。摘录:

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

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2014-03-27
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2015-07-13
    • 2012-11-30
    • 2013-01-08
    相关资源
    最近更新 更多