说说JAVA的equals()和hashCode()
来源:互联网 发布:ipadpro笔记软件 编辑:程序博客网 时间:2024/05/15 13:44
经常会有人问,如果重写了equals方法,是不是一定要重写hashcode方法呢? 答案是yes,因为如果不重写,那么基于hash结构的那些东东比如hashMap,HashSet等等会出现非你想象的结果。
why?看一下HashMap的源码,get也是一样的判断逻辑:
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而不重写equals也是不行的,
if (e.hash == hash && ((k = e.key) == key || key.equals(k))),==比较的是内存地址与hashCode无关(这个结论写个简单的例子就可以验证),每一个new都是新的对象,互不==的,所以大部分情况还是会走到equals,所以equals也同等重要,要重写就两者都重写哦~其实,java对于hashCode是有约定的:
1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。在多次执行期间,当然可以不同。
2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法
如何理解第三条最后一句?散列的意义在于其速度,散列的速度是优于线性结构的,所以如果散列码冲突的很多,后面跟着一个长长的链表,那散列还谈何速度呢?
- 说说JAVA的equals()和hashCode()
- Java的hashcode()和equals()
- java的equals和hashCode
- java hashCode() 和 equals()
- java hashCode()和equals()
- java hashcode和equals
- Java equals()和hashCode()
- Java equals和hashCode
- Java-- hashcode 和 equals
- java中hashcode()和equals()的详解
- java中equals()和hashcode()的关系
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- java中equals()和hashcode()的关系
- java中hashcode()和equals()的详解
- java中hashcode()和equals()的详解
- myeclipse import 第三方jar
- 并发连接数与pv的换算公式
- 【转】位图法应用
- arm-none-linux-gnueabi交叉工具链安装
- SGU 133. Border
- 说说JAVA的equals()和hashCode()
- 实例恢复机制
- 详解大端模式和小端模式
- vim常用的命令
- mysql数据库的所有操作
- 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
- 线程池
- 我的读书计划(持续更新中......)
- IOS:XCode 4.6 failed to get the task for process解决方法