为什么要重写了equals方法后一定要重写hashcode方法
来源:互联网 发布:memached 端口信息 编辑:程序博客网 时间:2024/05/17 04:29
重写了equals方法一定要重写hashcode方法,原因在于用到hash来提高效率的集合类在插入对象时先比较对象的hashcode是否相同,若相同再比较equals是否相同,若hashcode不同j就不再比较equals。
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:
public
native
int
hashCode();
为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法。
一、hashcdoe方法的作用
对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。
为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)
也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。
此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
下面这段代码是java.util.HashMap的中put方法的具体实现:
public
V put(K key, V value) {
if
(key ==
null
)
return
putForNullKey(value);
int
hash = hash(key.hashCode());
int
i = indexFor(hash, table.length);
for
(Entry<K,V> e = table[i]; e !=
null
; e = e.next) {
Object k;
if
(e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(
this
);
return
oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return
null
;
}
因此有人会说,可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,则equals方法得到的结果未知。
- 为什么要重写了equals方法后一定要重写hashcode方法
- 重写了equals方法后不一定要重写hashcode()
- 为什么重写了equals方法后,还要重写hashcode方法
- 为什么要重写equals方?重写equals方法一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法?(
- 0073 为什么重写equals方法,一定要重写HashCode方法【基础】
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法
- 重写equals方法为什么一定要重写hashcode方法
- 重写了equals()为什么要重写hashCode()方法
- 重写了equals()为什么要重写hashCode()方法
- 重写了equals()为什么要重写hashCode()方法
- 为什么重写equals方法要重写hashCode
- 什么时候需要重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 【Java基础之重写equals、hashCode和compareTo方法】什么时候需要重写重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 别再让C++头文件中出现“using namespace xxx;” http://blog.csdn.net/dj0379/article/details/11565387
- Qt之QHeaderView添加复选框
- httpClient对post内容gzip压缩和server端解压接收
- 非整行截断
- bananapi之开发板介绍
- 为什么要重写了equals方法后一定要重写hashcode方法
- 商业智能在公安交通管理领域的应用
- json笔记
- 【C++11新特性】 C++11智能指针之weak_ptr
- 根据iPhone6进行适配
- armv7 armvs7 arm64
- bag of feature
- 模式识别相似性测度距离计算---夹角余弦和特征二值得夹角余弦
- /Z7、/Zi、/ZI(调试信息)