首页 > 其他分享 >两个对象值相同(x.equals(y) == true),但却可有不同的hash code

两个对象值相同(x.equals(y) == true),但却可有不同的hash code

时间:2023-04-06 22:35:54浏览次数:35  
标签:code hash name age equals hashCode Example

两个对象值相同(x.equals(y) == true),但却可有不同的hash code_成员变量


当我们使用 Java 的 hashCode() 方法时,该方法将返回与该对象相关的一个整数值。hash code 用于在哈希表等数据结构中确定对象的位置,以提高查找效率。当我们使用 equals() 方法比较两个对象时,如果 equals() 返回 true,则可以认为这两个对象的值相等。

然而,有时候两个对象值相同,但它们的 hash code 却不同。这是因为 hash code 与对象的值是两个独立的概念。

为了更好地理解这个问题,我们可以看下面这个例子:

public class Example {
    private String name;
    private int age;

    public Example(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (!(obj instanceof Example)) return false;
        Example example = (Example) obj;
        return example.name.equals(this.name) && example.age == this.age;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age;
    }
}

在上面的例子中,我们自定义了一个类 Example,它有两个成员变量 name 和 age。我们重写了 equals() 和 hashCode() 方法来比较两个 Example 对象是否相等。equals() 方法通过比较 name 和 age 成员变量的值来判断对象是否相等。hashCode() 方法使用成员变量 name 的 hashCode() 方法和 age 的整数值的和来计算 hash code。

如果我们创建两个 Example 对象,它们的值相等,如下所示:

Example example1 = new Example("John", 30);
Example example2 = new Example("John", 30);

那么,使用 equals() 方法比较它们时,将返回 true。因为这两个对象的 name 和 age 成员变量的值相同。但是,如果我们使用 hashCode() 方法比较它们的 hash code,我们会发现它们的 hash code 不同,如下所示:


System.out.println(example1.hashCode());  // 2103
System.out.println(example2.hashCode());  // 2104

这是因为 hashCode() 方法的计算方式不同,即使两个对象的值相同,它们的 hash code 也可以不同。在这种情况下,可能会出现一些问题,例如当将对象放入哈希表等数据结构中时,可能会出现意外的结果。因此,我们需要注意 equals() 和 hashCode() 方法的实现,以确保它们在比较对象相等性时具有一致性。

标签:code,hash,name,age,equals,hashCode,Example
From: https://blog.51cto.com/u_15968096/6174223

相关文章

  • VSCode 工程下手动生成配置文件
    0.打开VS-Code,打开所在的工程1.首先在工程目录下新建.vscode文件夹2.按Ctrl+Shift+P,输入C/C++E,选择如图所示的项目,即自动生成配置文件。  3. 配置文件名字为:c_cpp_properties.json代码如下:1{2"configurations":[3{4"name":......
  • VSCode 新建 ssh 并配置免密登录
    #在local端VSCode点击新建ssh,输入ssh<user>@<ip>-A,修改config,点击connect#在local端cmd运行ssh-keygen-trsa#在remote端shell运行ssh-keygen-trsacd/home/lyc/.ssh/id_rsa#将loacl端id_rsa.pub的内容复制到authorized_keysvimauthorized......
  • C 牛哥与AI (双hash,map处理 )2023年“华为”杯广东工业大学第十七届程序设计竞赛
     思路:从时间复杂度入手,就可以考虑暴力枚举每一种情况,然后利用数据结构去保存这些信息如何保存捏?自己想的是利用map<bitset>去做,真sb直接利用双hash,转化为数值然后map存就彳于了, 记住hash并不是只有字符串才用,01序列甚至图上,或者其他很多抽象的东西要去转......
  • leetcode1000. 合并石头的最低成本
    有N堆石头排成一排,第i堆中有stones[i]块石头。每次移动(move)需要将连续的K堆石头合并为一堆,而这个移动的成本为这K堆石头的总数。找出把所有石头合并成一堆的最低成本。如果不可能,返回-1来源:力扣(LeetCode)链接:https://leetcode.cn/problems/minimum-cost-to-merge-st......
  • 【code】动态规划-两种状态
    买卖股票的最佳时机给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能......
  • HashMap排序方法,少见的toArray转为Array 泛型数组 排序,而非ArrayList
        HashMap<String,Integer>hm=newHashMap<>();    hm.put("a",1);    hm.put("c",2);    hm.put("b",3);         Set<Entry<String,Integer>>entrySet=hm.entrySet();      ......
  • VSCode插件Project Manager的使用方法
    1.在VSCode扩展里下载插件ProjectManager   2.点击文件,打开文件夹  3.这是你当前在vscode中打开的项目,单机回车就可以保存到项目管理  3.如果同时保存了多个项目管理文件,还可以给他们进行分组。 单击图标后编辑tags内容  4.再点击如下图标即可看......
  • NuGet Response status code does not indicate success: 401 (Unauthorized).
    Retrying'FindPackagesByIdAsyncCore'forsource'https://nexus-cn/repository/nuget-group/FindPackagesById()?id='Moq'&semVerLevel=2.0.0'.Anerroroccurredwhilesendingtherequest.Therequestwasaborted:Therequest......
  • vscode/PyCharm常用快捷键
    vscode1、显示所有指令:ctrl+shift+P2、查找文件:ctrl+P3、文件内搜索:ctrl+shift+F4、Debug:F55、显示/隐藏终端(Terminal):ctrl+`Pycharm1.位置互换:Alt+shift+箭头上下2.变量重构造:shift+F63.格式化代码:ctrl+alt+l4.同时加东西:一直按alt键,鼠标定......
  • glib g_hash_table_lookup g_hash_table_remove
    这里会简单的说明一下例子中用到的api接口。GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);功能:生成hash表。参数:hash_func创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自......