黑马程序员技术交流社区
标题:
我来说说hashCode与equals方法的重要性
[打印本页]
作者:
micro_hx
时间:
2015-6-11 12:20
标题:
我来说说hashCode与equals方法的重要性
才开始学习java,一上来就有人说javabean里面的construtors构造,set,get方法,重写hashCode方法,equals方法,实现java.io.Serializable接口。。。。刚开始很不解,写个java类怎么这么麻烦啊。看了几天的集合框架之后,才发现hashCode方法和equals方法真心很重要。。。 由于hashCode与equals方法在框架中用得比较多,所以这里就以HashMap为例子,说清楚为何这个两个方法的重要性了。下图是模拟HashMap说明其实现过程。
QQ截图20150611115552.png
(50.59 KB, 下载次数: 198)
下载附件
HashMap内部实现
2015-6-11 11:56 上传
这是一个对象数组,其长度一定。现在来看一下HashMap.put(k,v)的过程:
1.计算k的hashCode的值,计算什么的,因为k是继承object的,所以有一个hashCode方法,因此这里我们需要重写属于自己的hashCode方法
2. 取值 m = k.getHashCode() % array.length() ;
3. 在数组array中的,找到array[m]的位置,由于数组中的元素是List<MapEntry>类型,如果array[m] == null ,我们需要new一个新的arrayList<MapEntry>,将我们此时的K,V放进去。当然这只是最理想的方式,一旦array[m]!=null时,换句话说,我们的k值有了与map对象中包含的k有了相同的hashCode值,那么这时我们就要用到了我们的equals方法,程序将以此比较此List<MapEntry>中的k值,如果没有找到相同对象,就将我们的k v值放进去;如果找到了,那么就像原来的v值替换掉为新的值,
这就是我们所知HashMap不能有相同的Key的原因了
。。。
4.对于HashMap取值时,首先会计算k的hashCode值,同理对array.length取模,得到m,现在直接在array[m],也就是List<MapEntry>中遍历所需要的对象了,这里判断条件也是equals方法。
那么我们要总结一下,为何HashMap取值这么快了,首先有了HashCode值,就可以知道数组对象的下标,直接在那个List中遍历就行了,所以速度很快。但是,如果我们的hahCode设计得不好,可能出现那种极端分布的情况,想象一个List中有上千个MapEntry对象,而一个List中只有几个,甚至都没有,那么HashMap的快速查找就失去了意义。因此,合理的设计HashCode值,使之能在数组array中分布均匀,是非常值得考虑的。
所以,hashCode方法非常重要,它的存在加快了查找速度,直接找到目标数组的下标。而equals方法,确定了对象是否已经存在,或者查找对象的方式。。。。。。
作者:
micro_hx
时间:
2015-6-13 15:30
今天又看了一遍,好像上述的答案也也不是很合理啊。。。
作者:
micro_hx
时间:
2015-6-22 11:17
为什么我的图不见了啊。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2