博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础拾遗(二) — 关于equals(),hashcode()和 ==
阅读量:5334 次
发布时间:2019-06-15

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

这里分别讲==和equals()的关系,以及equals()和hashcode()的关系

讲解之前,需要先明白对象的内容、对象的引用,基本类型,引用类型这几个概念,此处不做解释

一、==和equals()

两者都是比较"是否相同"这个概念。不同在于

1、基本类型比较是否相同用 == 和 !=

2、对象使用==时比较的是对象的引用,默认的Object.equals()比较对象引用地址,如果想比较对象的内容

那么需要覆盖equals()方法,大多数Java类库特别是"表示值得类",都实现了自己的equals()方法,比如最常见的Integer和String

3、Effective Java第8条花了大篇幅讲解覆盖equals需要遵守的通用约定,并给出了证明,这5个约定是:

自反性,对称性,传递性,一致性,以及对任何的非null的x,x.equals(null)必为false

 

二、equals()和hashcode()

Effective Java给出的另一个告诫(实际上编程思想中也有同样的要求):覆盖equals时总要覆盖hashCode

Object规范的第二条:相等的对象必须具有相等的散列码

很明显:equals为true的两个对象的hashcode()方法必须产生相等的整数结果

但是:equals结果为false的两个对象,不一定要产生不同的hashcode结果,意思就是hashcode可以相等

 

三、理解hashCode()

编程思想一书在讲解hashcode时这样描述,"使用散列的目的在于,想要使用一个对象来查找另一个对象;散列的价值在于速度",

设想一下执行HashMap的get(Object key)时,键如果没有按照一定的顺序保存,我们的get操作将变得机器缓慢,散列得以保持键

的排序状态,然后使用Collections.binarySearch()进行查询,注意,这里保存的是键的数字(散列码)而非键本身,前面讲过,不

同的键可能会得到相同的散列码,设计好的散列函数能最大限度保证散列码的不同,特殊情况,散列码仍然有相同的,将使用到

链地址法,有兴趣的可以阅读HashMap的实现源码

转载于:https://www.cnblogs.com/yb38156/p/9418968.html

你可能感兴趣的文章
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c#的const可以用于引用类型吗
查看>>