黑马程序员技术交流社区

标题: hashcode()导致的内存泄漏 [打印本页]

作者: 小方的sunshine    时间: 2015-3-28 17:32
标题: hashcode()导致的内存泄漏
我们度知在集合ArryList al =new ArrayList()中可以操作相同元素,但在 hashSet集合中添加相同元素,却不被
显示,或者对以前的元素进行修改后,在进行删除,结果显示无法删除 为什么啦?

作者: 关山明月    时间: 2015-3-28 19:51
HashSet是Set集合下的一个子类,底层是哈希表结构。而Set集合的特点是元素是无序的,是不可重复的,所以hashSet中的元素也是无序的,不可重复的。往hashSet集合中添加相同元素,不是不显示,而是没有添加进去。它判断元素是否相同的依据是hashCode()方法和equals()方法。
而ArrayList底层结构是数组结构。因为List集合是有序的,是带有索引的,就如同在数组中可以添加相同元素一样。
至于在删除的时候,判断的依据还是hashCode()和equals() 方法。例如,要删除hashSet集合中的一个对象A,那么集合就会判断元素列表中哪一个元素和对象A相同。先根据hashCode()判断哈希值,若哈希值相同,则再判断equals()返回的结果是否为true,若是,则删除这个元素。

作者: wenke    时间: 2015-3-29 09:10
楼上说的很全 补充一点就是 不能修改集合元素中参与hashcode运算的变量值  。如果变量值被修改了 原先已经存入的集合元素hash值就会改变  以后永远也没法最期就行删除等操作   
作者: wenke    时间: 2015-4-20 17:47
往hashSet集合里添加理论上相同的元素并不是添加不进去 真实的情况是后一个相同的元素覆盖了前一个元素而已。因为hashset底层是通过hashmap集合实现  hashset的add方法的底层是通过hashmap的put(Key,value)方法实现 hashmap的put方法功能特点就是往map里面添加相同的键值对 后面一个后自动覆盖前面的一个  返回false 而这也是hashset集合不能添加相同元素的真正原因
作者: itheima_llt    时间: 2015-4-20 19:59
好东东,谢谢楼主




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2