日期:2014-05-20  浏览次数:20661 次

一道hashset的题目,求助
发在认证区了,这边人气好点...各位帮帮忙啊
http://community.csdn.net/Expert/topic/5553/5553367.xml?temp=.2240412
orz

------解决方案--------------------
那不就是意味着HashSet里面可以有相同的元素了么?
=============================================
对了。但是这两个实例放在不同的篮子里。为什么不同的篮子呢?因为它们被放进去的时候,hashCode()是不一样的。
------解决方案--------------------
HashSet里面是用HashMap支持的(组合了一个HashMap实例来实现HashSet)调用HashSet的remove()方法其实就是调用HashMap的remove方法。HashSet里面的元素就是HashMap里面的Key。而HashMap里面的remove(Key key)方法会根据key的hashcode和equals()来移除元素。
k2的i变了之后,HashMap计算它的hashCode的时候会计算出跟k1一样的结果,而实际上k2根本不和k1在一个桶里。它在哪个桶是由你put进去的时候决定的。所以hashmap去k1的桶里当然找不到k2,所以删不掉。
鉴定完毕。
------解决方案--------------------
对于写入,通过对象的hashCode 计算出这个对象应存储在map的 index 的位置,这和数组一样,把一个对象放在其中的第index位置,但如果是查询,经过同样的算法,map可以直接通过key得到index,从第index取得这个值对象,实际上你修改完k2 之后map 会根据k2 现在的hashCode=2 来计算 index的值,得出来的index 和 k1 的index 相同!! 这样虽然在remove(k2) 实际上还是在remove(k1)!

这也是为什么对于数据量稍大时,Hashtable的查询比数组具有更高的性能的原因(前提是hashcode设计得好),因为数组是要循环遍历才能找到,而hashtable 可以通过 index 一步搞定