iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java开发HashMap key怎么实现hashCode equals
  • 904
分享到

Java开发HashMap key怎么实现hashCode equals

2023-07-05 14:07:40 904人浏览 独家记忆
摘要

本篇内容主要讲解“Java开发HashMap key怎么实现hashCode equals”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发HashMap 

本篇内容主要讲解“Java开发HashMap key怎么实现hashCode equals”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发HashMap key怎么实现hashCode equals”吧!

一、问题引入

平时在开发中,相信你多多少少都使用过HashMap,而当你用自定义对象作为key时,很多人会告诉你:你必须要同时实现自定义对象的hashCode、equals方法,否者可能会出问题,于是你就实现了。

可是为什么呢?比如这里有自定义对象Person,构造如下:

public class Person {    private String name;    private int age;    private float height;}

欲将Person作为HashMap的key,放入哈希表中存储信息。我们来探讨一下,为什么要同时实现hashCode、equals方法吧~

Person p1 = new Person("ciusyan", 21, 1.8f);Person p2 = new Person("ciusyan", 21, 1.8f);Map<Person, String> map = new HashMap<>();map.put(p1, "Ciusyan");map.put(p2, "Zhiyan");

首先要明确:

  • hashCode方法用于计算出对象的哈希值

  • equlas方法用于比较两个对象是否相等

二、hashCode、equals方法都未实现

倘若你了解哈希表的基本构造,可以画出一个草图:

Java开发HashMap key怎么实现hashCode equals

我们并没有实现hashCode、equals方法,为什么还能放入哈希表中呢?

  • 因为jdk会有默认实现

在默认的实现中:

  • 利用hashCode方法计算出的哈希值是不同的

  • 利用equals方法比较,p1和p2不是一个对象

  • 所以放入哈希表中的大致结构如上图所示:

    • 可能会被放入两个桶(不同哈希值计算出的索引不一样)

    • 也可能会被放入一个桶(不同哈希值也可能会计算出相同的索引),又因为是不同对象,所以会被串起来

三、只实现hashCode方法

如果我们实现了hashCode方法,会有什么不同呢?

    @Overridepublic int hashCode() {        int hash = Integer.hashCode(age);        hash = hash * 31 + Float.hashCode(height);        hash = hash * 31 + (name == null ? 0 : name.hashCode());        return hash;    }

如上实现,既满足了尽量用的所有信息,也使计算的值尽量唯一了

如果是现在,我们再来画一幅草图:

Java开发HashMap key怎么实现hashCode equals

现在只实现了hashCode方法:

  • 利用hashCode方法计算出的哈希值是相同的

  • equals方法是默认实现,p1和p2不是一个对象

  • 所以放入哈希表中的大致结构如上图所示:

    • 只会被放入一个桶(相同的哈希值计算出的索引相同),又因为是不同对象,所以会被串起来

四、只实现equals方法

如果我们实现了equals方法,会有什么不同呢?

    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || o.getClass() != getClass()) return false;        Person p = (Person) o;        return p.age == age && p.height == height && (Objects.equals(name, p.name));    }

如上实现,如果两个对象的age、name、height都相等,那么可以认为是同一个对象

如果是现在:

Java开发HashMap key怎么实现hashCode equals

现在只实现了equals方法:

  • hashCode方法是默认实现,计算出的哈希值是不同的

  • 利用equals方法比较,p1和p2是同一个对象

  • 所以放入哈希表中的大致结构如上图所示:

    • 可能会被放入两个桶(计算出的索引不一样)

    • 也可能会被放入一个桶(不同哈希值也可能会计算出相同的索引),又因为是同一对象,所以p2的键和值会覆盖掉p1的

五、hashCode、equals方法都实现

倘若我们用上面的实现方式,将hashCode和equals方法都实现了

来看看最终的结构:

Java开发HashMap key怎么实现hashCode equals

现在hashCode、equals方法都实现了:

  • 利用hashCode方法计算出的哈希值是相同的

  • 利用equals方法比较,p1和p2是同一个对象

所以放入哈希表中的大致结构如上图所示:

  • 只会被放入一个桶中(相同的哈希值计算出的索引相同),又因为是同一对象,所以p2的键和值会覆盖掉p1

到此,相信大家对“Java开发HashMap key怎么实现hashCode equals”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java开发HashMap key怎么实现hashCode equals

本文链接: https://www.lsjlt.com/news/352240.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java开发HashMap key怎么实现hashCode equals
    本篇内容主要讲解“Java开发HashMap key怎么实现hashCode equals”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java开发HashMap ...
    99+
    2023-07-05
  • Java开发HashMap key必须实现hashCode equals方法原理
    目录一、问题引入二、hashCode、equals方法都未实现三、只实现hashCode方法四、只实现equals方法五、hashCode、equals方法都实现六、总结一、问题引入...
    99+
    2023-03-20
    Java开发HashMap key hashCode equals方法
  • java中怎么获取hashmap中所有的key
    这篇文章主要介绍了java中怎么获取hashmap中所有的key的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么获取hashmap中所有的key文章都会有所收获,下面我们一起来看看吧。如何获取has...
    99+
    2023-07-05
  • HashMap怎么实现保存两个key相同的数据
    这篇文章主要讲解了“HashMap怎么实现保存两个key相同的数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HashMap怎么实现保存两个key相同的数据”吧!HashMap如何保存两个...
    99+
    2023-06-20
  • Java之怎么实现从Map到HashMap
    本篇内容主要讲解“Java之怎么实现从Map到HashMap”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java之怎么实现从Map到HashMap”吧! 一、 Map1.1 Map ...
    99+
    2023-06-15
  • java hashmap遍历取值怎么实现
    在Java中,遍历HashMap并取得其值可以通过以下几种方法实现: 使用entrySet()方法遍历HashMap的键值对: ...
    99+
    2024-04-02
  • Java怎么根据key值修改Hashmap中的value值
    这篇文章主要讲解了“Java怎么根据key值修改Hashmap中的value值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么根据key值修改Hashmap中的value值”吧!根...
    99+
    2023-07-05
  • 基于java HashMap插入重复Key值问题怎么解决
    这篇“基于java HashMap插入重复Key值问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于j...
    99+
    2023-07-05
  • java怎么实现webservice接口开发
    要实现Java的Web Service接口开发,可以使用Java的一些框架和库来帮助开发。以下是一个基本的步骤示例:1. 创建一个J...
    99+
    2023-09-15
    java webservice
  • Java根据某个key加锁怎么实现
    本篇内容主要讲解“Java根据某个key加锁怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java根据某个key加锁怎么实现”吧!一、背景日常开发中,有时候需要根据某个 key 加锁,确...
    99+
    2023-07-05
  • Java项目开发中怎么实现分页
    这篇“Java项目开发中怎么实现分页”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java项目开发中怎么实现分页”文章吧。前...
    99+
    2023-06-29
  • Java单例模式怎么利用HashMap实现缓存数据
    本文小编为大家详细介绍“Java单例模式怎么利用HashMap实现缓存数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java单例模式怎么利用HashMap实现缓存数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-30
  • 怎么实现Java开发SpringBoot集成接口文档
    本篇内容介绍了“怎么实现Java开发SpringBoot集成接口文档”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!swagger vs sm...
    99+
    2023-06-25
  • 怎么实现java开发SpringBoot参数校验过程
    这篇文章主要讲解了“怎么实现java开发SpringBoot参数校验过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现java开发SpringBoot参数校验过程”吧!为什么需要参数...
    99+
    2023-06-25
  • 怎么在java中使用HashMap实现一个斗地主游戏
    本篇文章给大家分享的是有关怎么在java中使用HashMap实现一个斗地主游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、准备牌:每张扑克牌牌由花色和数字两部分组成。可以...
    99+
    2023-06-06
  • java怎么实现高并发
    Java可以通过以下几种方法来实现高并发:1. 线程池:使用线程池来管理线程,避免频繁创建和销毁线程,提高线程的重用性和效率。2. ...
    99+
    2023-08-12
    java
  • Java开发实现飞机大战
    目录一、飞机大战1 封装所有飞行物公共属性和功能的父类2 封装英雄机属性和功能类3 封装敌机属性和功能的类4 封装大飞机属性和功能的类5 子弹类6 飞机大战射击的主方法二、测试结果本...
    99+
    2024-04-02
  • node.js中怎么实现web开发
    这篇文章给大家介绍node.js中怎么实现web开发,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.express框架安装1)在node命令行模式下输入以下命令npm in...
    99+
    2024-04-02
  • Windows中怎么实现Python开发
    Windows中怎么实现Python开发,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体教程如下所示:初学者在 Windows 上使用 Python 的教程web 开发者...
    99+
    2023-06-16
  • Java怎么实现短信发送
    本篇内容主要讲解“Java怎么实现短信发送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现短信发送”吧!1. 引入相关maven依赖<dependency><gr...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作