Java 基础:Object 类中的 equals 与 hashCode 方法

本贴最后更新于 2441 天前,其中的信息可能已经斗转星移

前言

  这个系列的文章主要用来记录我在学习和复习 Java 基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢。

一切皆对象

  对于软件工程来说面向对象编程有一套完整的解决方案:OOA、OOD、OOP, 作为程序员来讲,OOP 其实是直接接触最多的。Java 中 OOP 最直接的体现就是 java.lang.Object 了,一切都是对象(除了原生类型,原生类型的 PrimitiveClass 对象由 JVM 启动时生成和加载),Object 类主要就只有这么几个方法,其中 getClass 是反射的基石,notify、notifyAll、wait 是多线程并发时常用的方法,其中比较有意思的就是 hashCode 与 equals 了,也是面试的时候面试官很喜欢问的一个问题。

View Code

equals 与 hashCode

  面试题的标准答案是:如果两个对象 a 和 b 满足 a.equals(b) == true,则它们的散列码(hash code)应当要相同,反之则不一定。这里也就引申出:重写了类的 equals 方法之后一定要重写 hashCode 方法,这种情况最常见的是在 entity bean 中,当 bean 跟容器类搭配使用时如果重写了 equals 而没重写 hashCode 就会引起问题,这里先来看看 HashMap 的 getEntry 方法,循环中就是先判断两个对象的 hash 值(由对象的 hashCode 计算得到)是否相等,再判断两个对象是否为同一对象最后才调 equals 方法来判断,这样可以减少 equals 方法的调用次数,提升容器的性能,如果大家看看 Java 容器类的源码就会发现大神们对 hash 思想的运用简直炉火纯青(生活中哈希的应用也随处可见:年月日、时分秒就是对时间流的哈希散列)

final Entry getEntry(Object key) { int hash = (key == null) ? 0 : hash(key); for (Entry e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }

下面是一张抽象化的对比图:

hashCode 一般是一个 int 值,比较两个对象的 hashCode 就是比较两个 int 值,Java 中对原生类型操作的性能肯定要好于对方法的调用,所以我们才会在 Java 容器中看到那么多对 hash 的应用。

上面这张图也可以直观看出为什么说两个对象 equals 为 true 的话 hashCode 就一定相同,反之则不一定。

equals 方法的四大特性

通过 equals 方法的注解就能清晰看到 Java 大神们给我们总结的 4 大特性了(如果在面试中遇到 equasl 和 hashCode 的问题时一遍把四大特性阐述一下会是个小小的加分项):

  1、自反性:自己跟自己比较返回 true

  2、对称性:x.equals(y) == y.equals(x)

  3、传递性:x.equals(y) == truey.equals(z) == truex.equals(z) == true

  4、一致性:多次调用 equals 返回结果相同

  (null 与任何对象比较都应该返回 false)

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 413 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 543 回帖 • 4 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    84 引用 • 414 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 115 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    172 引用 • 1546 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 541 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖 • 2 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 398 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖 • 1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    101 引用 • 905 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    292 引用 • 4495 回帖 • 665 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 40 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    2 引用 • 32 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 505 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖 • 1 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 16 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    38 引用 • 158 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 833 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 3 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 184 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖 • 1 关注