A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

   才开始学习java,一上来就有人说javabean里面的construtors构造,set,get方法,重写hashCode方法,equals方法,实现java.io.Serializable接口。。。。刚开始很不解,写个java类怎么这么麻烦啊。看了几天的集合框架之后,才发现hashCode方法和equals方法真心很重要。。。  由于hashCode与equals方法在框架中用得比较多,所以这里就以HashMap为例子,说清楚为何这个两个方法的重要性了。下图是模拟HashMap说明其实现过程。
                                                                                    
这是一个对象数组,其长度一定。现在来看一下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方法,确定了对象是否已经存在,或者查找对象的方式。。。。。。



2 个回复

倒序浏览
今天又看了一遍,好像上述的答案也也不是很合理啊。。。
回复 使用道具 举报
为什么我的图不见了啊。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马