博客
关于我
Java中为什么要重写 hashcode 和 equals 方法
阅读量:155 次
发布时间:2019-02-28

本文共 2222 字,大约阅读时间需要 7 分钟。

为什么要重写 hashcode 和 equals 方法

在面试Java初级开发时,提到自定义类在HashMap中存储时遇到的问题,往往会引发关于equals和hashCode方法的讨论。很多候选人表示自己从未重写过这两个方法,这不仅会导致实际开发中遇到问题,还可能在面试中暴露对Java内存管理和集合机制的理解不足。本文将从HashMap的存储规则入手,解释为什么要重写hashCode和equals方法,以及它们的重要性。


1. 理解Hash算法与HashMap的高效性

Hash表(即哈希表)是一种高效的数据结构,能够在平均O(1)时间内完成查找、插入和删除操作。与传统的线性表(如ArrayList)相比,Hash表的平均查找时间从O(n/2)显著降低到O(1)。

Hash表的核心原理是通过将键(Key)和值(Value)映射到一个特定位置(Index),称为Hash值。Java中的HashMap采用了链地址法来解决Hash冲突。


2. 为什么要重写equals和hashCode方法

当我们将自定义对象存入HashMap时,如果不重写hashCode和equals方法,可能会遇到以下问题:

示例分析:WithoutHashCode.java

import java.util.HashMap;class Key {    private Integer id;    public Key(Integer id) {        this.id = id;    }    // hashCode和equals方法被注释掉}public class WithoutHashCode {    public static void main(String[] args) {        Key k1 = new Key(1);        Key k2 = new Key(1);        HashMap
hm = new HashMap<>(); hm.put(k1, "Key with id is 1"); System.out.println(hm.get(k2)); }}
  • 问题1:无法通过相同值的对象正确取值

    • hashCode方法未重写,k1和k2的hashCode值分别为它们的内存地址。由于k1和k2是不同的对象,hashCode值不同,导致无法通过k2取到对应的值。
  • 问题2:无法正确判断对象相等

    • equals方法未重写,k1和k2会被视为两个不同的对象,无法找到正确的链表节点。

重写方法后的效果

class Key {    private Integer id;    public Key(Integer id) {        this.id = id;    }    public boolean equals(Object o) {        if (o == null || getClass() != o.getClass()) {            return false;        }        Key key = (Key) o;        return Objects.equals(id, key.id);    }    public int hashCode() {        return id != null ? id.hashCode() : 0;    }}public class WithoutHashCode {    public static void main(String[] args) {        Key k1 = new Key(1);        Key k2 = new Key(1);        HashMap
hm = new HashMap<>(); hm.put(k1, "Key with id is 1"); System.out.println(hm.get(k2)); // 输出:"Key with id is 1" }}
  • 效果1:相同值的对象能正确取值

    • k1和k2的hashCode值相同,存储在同一个链表节点下。
  • 效果2:能正确判断对象相等

    • equals方法判断对象的id是否相等,确保k2能找到k1的链表节点。

3. 对面试问题的说明

在面试中,提到hashCode和equals方法时,可以深入探讨以下问题:

  • 你有没有重写过hashCode方法?

    • 回答:有,重写了hashCode方法,确保每个对象的hashCode与其属性值相关联。
  • 你在使用HashMap时有没有重写hashCode和equals方法?

    • 回答:是的,重写了这两个方法,以确保自定义对象能正确存储和查找。
  • 你是怎么写的?

    • 回答:我重写了hashCode方法,使用对象的属性值计算哈希码。同时,重写了equals方法,判断对象的属性是否相等。

结论

重写hashCode和equals方法的主要作用是确保自定义对象能像预期一样存储和查找。这种做法不仅避免了哈希冲突,还能保证HashMap正确地找到目标对象。对于开发人员来说,这是基础的OOP知识,熟练掌握它对项目开发和面试中都至关重要。

转载地址:http://fcpc.baihongyu.com/

你可能感兴趣的文章
python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
查看>>
python 使用filetype校验文件
查看>>
Python 使用flush函数将缓冲区数据立即写磁盘
查看>>
python 使用in判断不准确,in不好使
查看>>
Python 使用pandas 进行查询和统计详解
查看>>
Redis 配置文件redis.conf详细解释
查看>>
python网络爬虫(2)——scrapy框架的基础使用
查看>>
python网络爬虫实例教程试读_Python网络爬虫实战教程(全套完整版) - 学途无忧网 - 做技术的王者 - Powered By EduSoho...
查看>>
Python 使用哈希函数用于加密
查看>>
Python 依赖管理的革新——Poetry 深度解析
查看>>
python 保留精度及增加去除数字的千位分隔符(金额化数字)
查看>>
python 倒计时 9,8,7,。。。。。。0
查看>>
Python 入门开发学习笔记之数据的增删改查
查看>>
Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
查看>>
Python 八大排序算法合集
查看>>
python 关于epoll的学习
查看>>
Python 内存管理
查看>>
Python 内嵌函数:它们有什么用处?
查看>>
Python 内置 sum 函数 vs. for 循环性能
查看>>
Python 内置时间模块
查看>>