`

hascode()与equals()

 
阅读更多

这两个方法重写一个时必须重写另一个,否则使用hashmap等集合时可能会发生错误,在java的集合中,判断两个对象是否相等的规则是:

 

1),判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)

2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
比如下面的代码

 

由以上规则也可以看出:equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。

 

如果重写了某个类的equals()方法而不重写hashCode()方法,那么很有可能出现这种情况:将两个用equals()判断相等的对象放到hashmap中,却因为其hashCode()不等而认为不等(hashCode默认利用其引用地址来计算的),从而都放了进去,这就违背了java所制定的规则。

分享到:
评论

相关推荐

    java中hashcode()和equals()方法详解

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    详解Java中用于查找对象哈希码值的hashCode()函数

    当`HashSet`试图添加`b`时,它首先检查`b`的`hashCode()`是否与已经存在的任何对象的`hashCode()`相同。由于`a`和`b`的`hashCode()`相同,`HashSet`会假设这两个对象相等,但实际上它们不相等(因为没有重写`equals...

    java集合知识-map、set等

    是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 ...

    lombok-1.16.16源码和文档

      默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。 @ToString   生成toString方法,默认情况下,会输出类名、所有属性,属性会...

    CursoJava:NélioAlves的Udemy课程

    对象类别构造函数,getter,setter,toString,equals,hasCode方法; 超载; 封装; 保留字这个; 遗产; 多态性内存中对象,数组和列表的行为; 枚举; 对象的组成; 异常处理; 使用Scanner进行数据输入和读取文件...

Global site tag (gtag.js) - Google Analytics