HashSet什么时候调用equal方法? [复制]

2024-02-10

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

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

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() of HashTest只有一次。另一次它调用equals()方法将是equals() of the String class.

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

这个答案 https://stackoverflow.com/a/5397003/2024761解释了当equals()方法被调用HashSet以及何时不是。摘录如下:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashSet什么时候调用equal方法? [复制] 的相关文章

随机推荐

  • 在MAMP上安装Mongo驱动

    我已经下载 编译并安装了最新的 mongo php 驱动程序 它位于 opt local lib php extensions no debug non zts 20090626 mongo so 我该如何将其添加到 MAMP php in
  • 访问存储正则表达式的二维数组以进行表单验证

    我正在尝试循环遍历表单字段并针对存储在数组中的正则表达式进行验证 看不出这里出了什么问题 有什么想法吗
  • 如何在 keras 生成器中使用 numpy memmap 不超过 RAM 内存?

    我正在尝试在生成器内实现 numpy memmap 方法 以使用 keras 训练神经网络 以免超出内存 RAM 限制 我用这个作为参考post https stackoverflow com questions 45132940 nump
  • BLUEZ 中的 DBUS API

    我是 BLUEZ 和 Linux 的新手 我发现 Bluez 提倡使用 DBUS API 我还想知道 BLUEZ 中的 DBUS API 是什么 使用它们而不是直接的 C API 有什么好处 与 C API 相比有何不同 从我自己的经验来看
  • 如何使用 Mockito 在 Flutter 中模拟静态方法?

    我有一个文件函数fetchPosts 它负责从服务器获取新帖子并将其存储在本地 sqlite 数据库中 正如 sqflite 上的推荐doc https github com tekartik sqflite blob master sqf
  • Rails 3.1 错误捕获

    我认为 Rails 3 1 正在改变引发错误的方式 任何人都可以协助或确认这一点吗 我正在尝试使用 Rails 3 1 0 rc1 创建自定义错误页面 unless config consider all requests local re
  • LinearLayout achartengine 图表不显示在 ScrollView 中

    我正在尝试在滚动视图中创建 achartengine 图表 但它不会显示 它只显示黑屏 但不会崩溃或发生任何情况 问题是 如果我只是将标签更改为图表显示就好了 在我的 Java 代码中 我确实有 renderer setInScroll t
  • 使用 Modernizr 加载脚本...不工作

    我在尝试使用 Modernizr 版本的 yepnope 加载脚本时遇到问题 并且无法理解它们为何不同 如果我使用 yep nope 加载脚本 它可以正常工作
  • NSubstitute DbSet / IQueryable

    因此 EntityFramework 6 比以前的版本具有更好的可测试性 还有一些很好的例子 http msdn microsoft com en us data dn314429 queryTest在互联网上寻找像 Moq 这样的框架 但
  • 排序忽略标点符号 (Objective-C)

    我正在尝试对 iOS UITableView 对象进行排序 我目前正在使用以下代码 Sort terms alphabetically ignoring case self termsList sortUsingSelector selec
  • 如何查找映射驱动器的可用空间百分比?

    是否可以以编程方式查找映射驱动器中的可用空间 如何使用 ms dos 查找驱动器中可用空间的百分比 在硬盘中找到驱动器的可用空间可能很容易 但我需要找到映射驱动器的可用空间 我已经在我的系统中映射了一些文件服务器 可以在 我的电脑 中看到它
  • Octave并行计算

    我在网上找到了一些资料 表明 Octave 有一些工具可以并行化算法 但找不到任何细节或如何获取和使用它们 对此的任何帮助 见解都会很棒 http octave sourceforge net parallel http octave so
  • VSO 和单个产品团队的多个项目

    我们有一个由大约 10 名开发人员组成的团队正在开发新产品 我们已将此产品拆分为 Visual Studio Online 上的两个团队项目 开发人员可以在任何一个冲刺期间同时处理这两个项目 尽管我们有两个团队项目 但整个团队作为一个敏捷单
  • 如何解决:引用的 AMP URL 不是 AMP

    搜索控制台添加了一系列 引用的 AMP URL 不是 AMP 的问题 如果我使用 I get 然而 当我登记入住时https validator ampproject org https validator ampproject org 表
  • R 的同比百分比变化

    虽然我发现了几个类似的问题 但我无法在基础 R 中找到解决我的问题的简单方法 我想计算一组数据 此处为 y 值 的同比百分比变化 并将此 Delta 系列作为新列添加到我的数据框中 例如 gt x c 2000 2001 2002 2003
  • 我可以使用 Objective-C 将块作为 @selector 传递吗?

    是否可以传递一个 Objective C 块 selector论证中的一个UIButton 即 有什么办法可以让以下工作发挥作用吗 closeOverlayButton addTarget self action anotherIvarLo
  • 调用 SelectAll() 后,文本框的光标如何移动到文本的开头?

    在某些情况下 当焦点设置到特定文本框时 光标会自行停在文本之前 如下所示 然而 TextBox 有一个 GotFocus 处理程序 可以显式选择所有文本 private void txtQty GotFocus object sender
  • 如何在乘以 pandas DataFrame 时将 NaN 或未对齐的值视为 1 或 0

    我想将未对齐或缺失 NaN Inf Inf 值视为 1 或 0 df1 pd DataFrame x 1 2 3 4 5 y 3 4 5 6 7 index a b c d e df2 pd DataFrame y 1 NaN 3 4 5
  • 使用子进程获取实时输出[重复]

    这个问题在这里已经有答案了 我正在尝试为命令行程序 svnadmin verify 编写一个包装脚本 它将显示一个很好的操作进度指示器 这要求我能够在包装程序输出后立即看到输出的每一行 我想我只需使用以下命令执行该程序subprocess
  • HashSet什么时候调用equal方法? [复制]

    这个问题在这里已经有答案了 我在一个教程中找到了这个例子 当我运行这个时 我得到 hs size 值为 2 并且 equals 方法仅被调用一次 任何人都可以解释一下当 equal 方法在 HashSet 中调用时 import java