当前位置: 首页 > 面试题库 >

当HashSet调用equal方法时?

严书
2023-03-14
问题内容

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

当我运行此程序时,我的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类。

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比较中进行了此测试,但 并未被调用 当farAway = false时我想考虑等于(检查两个点距离的函数) 完整的可编译代码,您可以对其进行测试,并说明为什么在此示例中未调用equals。 编辑 -是否有一种方法可以强制HashSet添加到调用等于? 问题答案: 如果哈希码不同,则无需调用,因为可以保证可以返回。 在此之前,从一般的合同上和: 如果根据该方法两个对象相

  • 问题内容: 我执行了以下代码,发现输出为。 我想知道它的行为以及为什么输出是。 问题答案: 您还需要覆盖方法。这两种方法都用于适当的功能,因此必须被覆盖在 用户定义的类 ,如果你制作的作为,其他的类习惯并没有两个不同的可被视为与它们的将永远是不同的,并且肯定会在情况下总是返回。

  • 问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得

  • Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或

  • 这是一个线程,用于处理服务器端的输入和输出: 如果我调用print方法,线程就会被阻塞。这意味着“之前”是打印出来的,但“之后”永远不会到达。printwriter的CheckError方法返回false! 它位于一个AbstractServer中,由两个不同的服务器使用。第一个以前就已经使用过了,而且一直都没有问题(现在仍然如此)。另一个是新的,导致了这个问题。对于每个初始化的连接(两个具有不同

  • 该方法返回一个布尔值,表示一个字符串是否等于另一个字符串。 如果字符串相等,则返回值true,否则返回false值。 语法 (Syntax) equal(str1,str2) 参数 (Parameters) str1,str2 - 需要比较的2个字符串。 返回值 (Return Value) 如果2个字符串相等,则返回true值,否则返回false值。 例如 (For example) -mod