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的实现源码
Java基础拾遗(二) — 关于equals(),hashcode()和 ==的更多相关文章
- Java基础拾遗(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
- java基础解析系列(十一)---equals、==和hashcode方法
java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...
- Java基础拾遗(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- JAVA基础(二)—— 常用的类与方法
JAVA基础(二)-- 常用的类与方法 1 Math类 abs ceil floor 绝对值 大于等于该浮点数的最小整数 小于等于该浮点数的最大整数 max min round 两参数中较大的 两参数 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- java基础(二章)
java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l 必须以字母.下划线 _ .美元符号 $ 开头 l 变量中,可以包括数字 l 变量中,不能出现特 ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- java基础-多线程二
java基础-多线程二 继承thread和实现Runnable的多线程每次都需要经历创建和销毁的过程,频繁的创建和销毁大大影响效率,线程池的诞生就可以很好的解决这一个问题,线程池可以充分的利用线程进行 ...
随机推荐
- C中空指针、NULL与0
空指针是指确保可以没有指向任何一个对象的指针.空指针常量值通常使用宏定义NULL来表示. 空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用. 链表也经常在数据末尾放一个空指针提示后 ...
- Jmeter-【beanshell处理器】-随机获取手机号
一.通过操作变量 二.引用外部Java文件 三.引用外部class文件
- phpstrom 注释效果
/** * .,:,,, .::,,,::. * .::::,,;;, .,;;:,,....:i: * :i,.::::,;i:. ....,,:::::::::,.... .;i:,. ..... ...
- OpenGL glfw
{ https://github.com/glfw/glfw }
- spring boot 项目启动无法访问,排查
查看docker日志,后台应用正常启动,定时任务正常执行,但是前端无法访问到后端接口,点击提示系统错误,解压出项目二级域名,访问域名,报错:Kong Error,说明Kong路由转发没有绑定项目端口, ...
- 关于ThreadLocal的一道面试题(酷我公司)
2013年8月,本人那时候刚毕业来到了北京找工作,在网上投递了各种简历,也面试了很多家公司,遇到最大的问题就是:你什么时候毕业的呀?,做过什么项目呀?都将我拒之门外,但是我还是幸运总会来的,那天早上9 ...
- Java高新技术第三篇:注解的使用
我们知道注解是在JDK1.5引入的,可能有的人没有用过注解,所以感觉注解这个东西没有什么用,但是深入了解注解,对以后学习框架有所帮助的,后面提到的JavaWeb的框架中很多都是基于注解的技术, 其实注 ...
- 进程、线程、协程、CPU
进程.线程.CPU 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 ...
- 秦曾昌人工智能课程---6、Decision Tree Learning
秦曾昌人工智能课程---6.Decision Tree Learning 一.总结 一句话总结: 怎样去构建决策树:比如一维:***|00|***|000|***,|为分割线,每个分割点都是一种情况, ...
- c# 将byte数组保存成图片
将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...