题记:学习Java已经这么长时间了,还没有搞清楚equal,hashcode,实在是汗颜。现重新梳理一下。
1. ==
首先说明一下==,对对象来说,==比较的是对象的物理地址,即如果两个对象相等,他们一定是一个对象。
2.Equal
==比较的是对象的地址,如果需要比较对象的值,就需要equal方法了。
看一下JDK中equal方法的实现:
Java代码
1.public boolean equals(Object obj) {
2. return (this == obj);
3. }
public boolean equals(Object obj) {
return (this == obj);
}
也就是说,默认情况下比较的还是对象的地址。所以如果把对象放入Set中等操作,就需要重写eqaul方法了。
重写equal方法满足的5原则:
1. 自反性, x.equal(x);
2. 对称性, x.equal(y), y.equal(x)
3. 传递性
4. 一致性,多次调用都保持一致
5. 永远不等于null.
因此重新equal步骤:
1) ==比较
2)instanceof (此句包含的null的比较,因为null不是任何object的实例)
3)attribute比较
3.hashcode
hashcode的作用:
为了便于对象的检索,Set内部对象是用哈希表来存储,同时已对象的hashcode做key.因此比较重复对象的时候,首先首先通过hashcode检索对应的位置,如果有多个元素,则通过equal方法判断。因此两个对象equal,但没有相同的hashcode,就会造成重复的存储,破坏了set的原则。也可以这样理解,
相等的对象(equal)一定要存储在同一个位置(hashcode)。
JDK中对于hashcode的限定:
1)一致性,多次调用同一对象,返回的hashcode应该是一样的
2)两个对象equal,一定要有相同的hashcode
3) 两个不equal的对象,不需要一定不同的hashcode
总结来说,就是对象equal,必须有相同的hashcode;有相同的hashcode,并不一定equal.
因此重写equal的时候一定要重写hashcode.
分享到:
相关推荐
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
重写equals和hashcode方法,学习和进步
NULL 博文链接:https://jackosn-liao.iteye.com/blog/528757
关于重写equals,hashcode以及compareTo方法!
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点...
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
Java equals 方法与hashcode 方法的深入解析.rar
如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合
retry.zip,用于异步重试scala futures的简单原语库,因为您不应该放弃,至少在第一次尝试时不应该放弃。
1、何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 2、为什么改写equals()的时候,总是要改写hashCode() ... 3、什么是equals()与如何设计equals()
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
主要介绍了Java重写equals及hashcode方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧