Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

hashCode与equals

阅读数:次 2018-02-15
字数统计: 812字   |   阅读时长≈ 2分

平时我们在项目里经常会用到HashMap这个数据结构,所以在面试的时候一定会被问这个问题∶你有没有重写过hashCode方法?你在使用HashMap时有没有重写hashCode和equals方法?你是怎么写的? 那么为什么要重写hashCode与equals方法,这两个方法起着什么作用呢?当我们往HashMap里放key时,首先会调用这个对象的hashCode方法计算它的hash值,随后把key放入hash值所指引的内存位置。

equals()方法

equals是超类Object中的一个基本方法,是用来判断一个对象和另一个对象是否具有相同的引用(即内存地址),如果有则返回true,下面是Object类的equals()方法:

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

equals()与 == 的区别

对于从Object继承而来的equlas方法,与 == 并无区别,都是比较的对象的内存地址。但是我们可以重写equals方法,使其按照我们的要求来进行比较。比如String类就重写了equals方法,比较的是字符串的字符序列,而不是内存地址。

equals()的重写规则

  • 自反性:对于任何非null的引用值x,x.equals(x)应该返回true
  • 对称性:对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true
  • 传递性:对于任何非null的引用值x、 y与z,如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true
  • 一致性:对于任何非null的引用值x与y,假设对象的equals比较中的信息没有被修改,则多次调用x.equals(y)始终返回true或者始终返回false
  • 对于任何非null的引用值x,x.equals(null)应返回false

上述这些规则在同一个类的两个对象中还是很容易理解的。

hashCode()方法

hash code是一种通过对象得出Hash值的方式,在Java中,每个对象都会有一个对应的hashCode。通过算法,算出对象的hashcode,同一个对象的hashcode唯一(前提是对象没有被改变),但是不同的对象也可能有相同的hashCode。

HashMap

HashMap通过计算对象的Hash值判断对象应该在Hash表的哪个链上,通过equals方法判断是否是同一个对象。关键是我们没有重写hashCode方法,调用的仍是Object类的hashCode方法(因为所有的类都是Object的子类),而Object类的hashCode方法返回的hash值其实可以看出是对象的内存地址。

因为在hashMap中,判断key是否相等首先是比较hashCode,然后再用equals比较。我们重写equals方法是为了按我们自己的想法来比较两个对象是否相等。如果不重写hashCode方法,可能出现具有相同含义的不同对象(他们的hashCode不同)被pass掉的情况。而实际上他们应该是相同的key。而如果只重写hashCode不重写equals方法,那么equals只是判断两个对象是否是同一个对象。所以需要同时重写equals和hashCode方法,目的是为了准确定位到我们期望的key。

赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/3708804667.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • JavaSE
  • 编程语言

扫一扫,分享到微信

生产者消费者模型
网页启动本地Activity
  1. 1. equals()方法
  2. 2. equals()与 == 的区别
  3. 3. equals()的重写规则
  4. 4. hashCode()方法
  5. 5. HashMap
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书