hashCode与equals的区别

hashCode与equals

HashSetHashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。 那么Java运行时环境是如何判断HashSet 中相同对象、HashMap中相同键的呢?当存储了相同的东西之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDKequals(Object obj)hashcode()这两个方法的定义和规范:在Java中任何一个对象都具备equals(Object obj)hashcode()这两个方法,因为他们是在Object类中定义的。equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回falsehashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。

接下来有两个个关于这两个方法的重要规范:

  • 若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。 说得简单点就是: 如果两个对象相同,那么他们的hashcode应该相等。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回truehashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG
  • 如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。 说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
  • 如果两个对象相同,那么它们的hashCode值一定要相同;
  • 如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏土豆专栏

Java面试之对象比较

原因是基本类型的变量存在栈中,系统先创建一个变量为a的引用然后查找栈中是否存在10这个值,如果没找到,就将10存放进来,a指向10。同理b也是一样,创建一个变量...

14510
来自专栏Python小屋

1000道Python题库系列分享二(48道)

本系列题目共约1000道,下一期题库分享时发布本期题目参考答案,可以在微信公众号菜单查看系列题目。 上一期题目链接1000道Python题库系列分享一(17道)...

77180
来自专栏我爱编程

Day7函数式编程3/3

装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print('2018...

38070
来自专栏Spark学习技巧

scala中常用但其他语言不常见的符号含义 - 心灵空谷幽兰 - 博客园

本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code。 随着我对Scala学习的深入,我会不断增加该篇博文的内容。 修改记录 -...

20860
来自专栏Java帮帮-微信公众号-技术文章全总结

04.Java对象和类

04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研...

46360
来自专栏编程

《4》python数据类型和变量

(4)python数据类型和变量 ? 整数 Python可以处理任意大小的整数,例如:1,100,-8080,0,等等。 十六进制用0x前缀和0-9,a-f表示...

35590
来自专栏深度学习思考者

一文搞懂C/C++中指针那些事(上篇)

一 指针变量 1.间接存取        指针变量的值为地址;普通变量的值为数据;其中“*”为指针运算符。&是地址操作符,用来引用一个内存地址。通过在变量名...

222100
来自专栏我爱编程

Day10面向对象高级编程1/3

使用slots 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。 class...

33750
来自专栏黑泽君的专栏

接口中可以包含的组成部分

    1.接口中的抽象方法,修饰符如果自己写必须是:public abstract

79810
来自专栏自然语言处理

Python读书笔记:需要注意的70个小问题

4 单双引号括起来的,字符串可以包含引号和撇号。用法:"this's a cup"

13220

扫码关注云+社区

领取腾讯云代金券