一、hashCode()和equals()是什么?

hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。

Equal

没有重写的equal 使用是继承自 Object 的 equal 方法,和 “==” 的作用一样, 比较两个对象的内存地址是否相等。

public boolean equals(Object obj) {

return (this == obj);

}

重写过的 equal, 比较的是两个对象的属性变量值 是否相等。

HashCode

hashCode是对象在内存地址通过hash算法得到的哈希码。

二、hashCode()和equals()的区别

下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们之间的主要区别也基本体现在这里。

1、equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?

因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

2、hashCode()既然效率这么高为什么还要equals()呢?

因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出(PS:以下两条结论是重点,很多人面试的时候都说不出来):

equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。

hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。

三、hashCode()和equals()使用的注意事项

1、对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equals()去再对比

了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

2、这种大量的并且快速的对象对比一般使用的hash容器中,比如HashSet,HashMap,HashTable等等,比如HashSet里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equals()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。

3、然而hashCode()和equals()一样都是基本类Object里的方法,而和equals()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的

hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值,比如下面:

由于标识这个类的是他的内部的变量num和name,所以我们就根据他们返回一个hash值,作为这个类的唯一hash值。

所以如果我们的对象要想放进hashSet,并且发挥hashSet的特性(即不包含一样的对象),则我们就要重写我们类的hashCode()和equals()方法了。像String,Integer等这种类内部都已经重写了这两个方法。

当然如果我们只是平时想对比两个对象 是否一致,则只重写一个equals(),然后利用equals()去对比也行的

4、什么时候需要重写?

一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode。

5、那么为什么要重载hashCode呢?

如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。

这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

6、为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?

因为是按照hashCode来访问小内存块,所以hashCode必须相等。

HashMap获取一个对象是比较key的hashCode相等和equals为true。

之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equals为false。

7、为什么需要hashCode?

通过hashCode可以很快的查到小内存块。

通过hashCode比较比equals方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

------------------------------------------

java equal hashcode_Java(二)equal 和 hashcode使用相关推荐

  1. java 复写hashcode_java 重写equals()和hashCode()

    用户信息实体类: public class UserInfo{ private Integer userId; private String userName; private Integer uer ...

  2. Java校招笔试题-Java基础部分(二)

    导语   Java面试题集2021版 Java基础部分二 14.hashCode方法的作用? 15.写clone()方法时,通常都有一行代码,这行代码是什么? 16.静态变量和实例变量的区别? 17. ...

  3. java script中==和===_Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑...

    判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...

  4. java中的==、equals()、hashCode()源码分析(转载)

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  5. java 二叉查找树_如何在Java中实现二叉搜索树( binary search tree)?

    二叉搜索树或BST是一种流行的数据结构,用于保持元素的顺序.二叉搜索树是二叉树,其中左子节点的值小于或等于父节点,右子节点的值大于或等于父节点.由于它是二叉树,它只能有0,1或2个子节点.二叉搜索树之 ...

  6. 深入Java基础(二)——字符串家族

    上一篇写了基本数据类及其包装类详解,这篇我们就来讨字符串这个家族吧,这个也是重中之重啊!!! 文章结构: 1.众说纷纷的equals和==: 2.字符串家族的基本知识以及字符串家族的源码解读: 3.字 ...

  7. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  8. Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

    1.什么是hashCode: hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址.通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定 ...

  9. java springboot生成二维码图片

    java生成二维码图片 Maven依赖 <!--生成二维码--> <dependency><groupId>com.google.zxing</groupId ...

  10. Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举

    Java基础(一):编译和解释.数据类型.变量作用域.String常用方法.数组.面向对象.异常 Java基础(二):集合.IO流(Zip压缩输入/输出流等).File文件类.反射.枚举 Java异常 ...

最新文章

  1. java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
  2. 创业公司Starry拟推1G网速的无线宽带服务
  3. Linux gitlab完全卸载
  4. ubuntu 安装fcitx输入法(3.6和4.0bate)
  5. 使用计算机也要遵守规范教学反思,《我要守规则》教学反思
  6. iphone分屏功能怎么用_iPhone终于上线这功能,可惜安卓都用烂了
  7. HTML5标准有缺陷 手机电池信息可泄露上网活动
  8. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  9. Scrapy框架学习(二)
  10. lopatkin俄大神精简中英俄系统Windows 10 Home 18362.145 19H1 Release x86-x64 RU-EN-CN NANO
  11. 【windows10】 CH340/CH341 USB转串口驱动安装
  12. h2o api java_H2O框架简介
  13. 中国各省存贷款余额(2003-2020年)
  14. 股市入门基础 :基本术语和概念的解读
  15. android 微信架构,微信App支付技术架构全解析
  16. 作业Android自我介绍
  17. 教你如何使用SwipeRefreshLayout来构建一个上拉加载下拉刷新框架
  18. pip installl lap安装失败 error: Microsoft Visual C++ 14.0 or greater is required.
  19. 毕业答辩ppt计算机科学与技术,计算机科学与技术专业论文答辩PPT范例.ppt
  20. 文章摘要智能提取【基于BERT技术】

热门文章

  1. 2022-2028年中国社区体育产业深度调研及投资前景预测报告
  2. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)
  3. 2022-2028年中国汽车橡胶件行业市场调查研究及前瞻分析报告
  4. Go 知识点(14) — Go 多协程(单个协程触发panic会导致其它所有协程挂掉,每个协程只能捕获到自己的 panic 不能捕获其它协程)
  5. jquery过滤HTML标签方法
  6. Java中如何实现Date与String之间的数据类型转换
  7. LeetCode简单题之好对数的数目
  8. SpringBoot整合JDBC、整合Druid数据源详解教程
  9. CPU三级缓存技术解析
  10. TensorFlow损失函数