Java基础拾遗(二) — 关于equals(),hashcode()和 ==
这里分别讲==和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的实现源码
最新文章
- 一步一步拆解一个简单的iOS轮播图(三图)
- 如何调试PHP程序
- 【poj1568】 Find the Winning Move
- Web调试工具——Fiddler介绍
- hadoop、hbase、hive、zookeeper版本对应关系
- Fedora 防火墙关闭与开启
- Remote Desktop Connection Manager介绍
- Linux查看系统资源占用
- <;meta http-equiv=";X-UA-Compatible"; content=";IE=Edge";>;
- JavaScript事件的属性列表
- Avos Cloud 的 ParseObject的创建与数据存储检索
- !important强制此css最强,其它被覆盖
- hashchange事件
- PAT——1027. 打印沙漏
- 一定要使用-server参数来调试并发程序
- 基于usb4java实现的java下的usb通信
- C#集合之不变的集合
- Filter内容
- silverlight 图形报表开发
- LeetCode OJ:Pow(x, n) (幂运算)