解决这个问题得先明白:hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。

第一步:具体背景(没有背景的讨论就是在耍流氓)

以HashMap中put方法为背景

第二步:分析源代码:

  public V put(K key, V value) {    

         if (key == null)
return putForNullKey(value); //通过key的hashcode计算hash值
int hash = hash(key.hashCode());
//通过hash值和table数组的长度计算出元素存放在table数组的位置
int i = indexFor(hash, table.length); //table[i]的位置已经存在元素,遍历链表
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k; //调用 equals 方法判断key是否相等,若相等,该key对应的键值对已经存在,用新的value取代旧的value
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
} modCount++;
// 若该key对应的键值对不存在,将key-value封装成Entry对象添加到table[i]处 ,头插法。
addEntry(hash, key, value, i);
return null;
}

HashMap 的 put 方法实际上是先调用 hashCode 定位到数组的位置
如果该数组的位置上已经存在元素了,即 table[i] != null,那么遍历链表,调用 equals 方法判断key是否相等。如果相等,表明这个key对应的键值对已经存在,那么新的 value 会覆盖掉旧的 value。如果遍历链表都没有找到key,那么表明这个 key 对应的键值对不存在,直接插入头部,作为链表的头节点。


总结Hashmap的put方法流程:

1.向HashMap添加元素的时候,需要先定位到在数组的位置(采用hashCode方法)。

2.如果只重写了 equals 方法,两个键的 equals 返回了true,集合是不允许出现重复键的,只能插入一个。

3.此时如果没有重写 hashCode 方法,那么就无法定位到同一个位置,集合还是会插入键。这样集合中就出现了重复键了。那么重写的equals方法就没有意义了。所以一定要重写!

如下图:

为什么重写了equals(),还要重写hashCode()?的更多相关文章

  1. 为什么重写equals还要重写hashcode??

    equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...

  2. 为什么重写了equals() 就要重写hashcode()

    规定:1.两个对象相等,则hashcode也一定是相等的:2.两个对象相等,对两个对象分别调用equals()都返回 true:3.两个对象有相同的hashcode,但不一定相等 为什么重写了equa ...

  3. 为什么重写equals还要重写hashcode

    参考回答: HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两 ...

  4. 为什么重写equals()必须重写hashCode()

    主要原因是因为hashCode是用对象的内部地址转换成一个整数的,而equals比较得是两个对象,或者是两个对象的内容 如果你重写了equals,而保留hashCode的实现不变,那么很可能两个对象明 ...

  5. 详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  6. java基础解析系列(十一)---equals、==和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  7. static,final关键字,Object类的tostring方法,equals方法,hashCode方法

    1)static关键字 static可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...

  8. 详解 equals() 方法和 hashCode() 方法

    创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...

  9. equals()方法和hashCode()方法详解

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

随机推荐

  1. vs编译项目报错:The OutputPath property is not set for this project

    今天使用VS2008编译项目时报错: The OutputPath property is not set for this project.  Please check to make sure t ...

  2. 自己实现一个简化版的SpringMVC框架

    废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用.SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实 ...

  3. 免费使用Google

    这里需要借助一下`梯子`,这里有教程 点击进入 如果没有谷歌浏览器,进入下载最新版谷歌浏览器,进入下载,不要移动它的安装位置,选择默认位置, 如果已经安装了谷歌浏览器,打开赛风之后,选择设置 进行安装 ...

  4. python、mysql四-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar() ); create tabl ...

  5. wordcloud:让你的词语变成黑云

    介绍 对文本中出现频率较高的关键词给予视觉化的显示 使用 import jieba import codecs import wordcloud file = r"C:\Users\Admi ...

  6. Jenkins+GitHub 项目环境搭建和发布脚本(二)

    Jenkins+gitHub项目搭建配置 项目发布脚本 profilesScript.sh (支持不同环境配置文件) #!/bin/bash ACTIVE=$ JENKINS_PATH=/var/li ...

  7. Restricting Input in HTML Textboxes to Numeric Values

    Ok, here’s a fairly basic one – how to force a textbox to accept only numeric input. Somebody asked ...

  8. tcpdump工具抓到的cap文件

    一.链路层   ---> 以太网数据包 一个数据包被称为一帧, 制定这个规则的协议就是以太网协议.一个完整的以太网数据包如下图所示: 整个数据帧由首部.数据和尾部三部分组成,首部固定为14个字节 ...

  9. 磁盘IO及性能指标

    一.磁盘 I/O 的概念 I/O 的概念,从字义来理解就是输入输出.操作系统从上层到底层,各个层次之间均存在 I/O.比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 ...

  10. centos7 nginx 代理

    2019/06/05 15:00:23 [crit] 4332#4332: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) ...