ArrayList与HashSet的比较,以及HashCode分析, 内存泄露,hashsethashcode
分享于 点击 40794 次 点评:168
ArrayList与HashSet的比较,以及HashCode分析, 内存泄露,hashsethashcode
http://www.360doc.com/content/14/0718/16/8072791_395303870.shtml
看下面这两个小示例:
那为什么HashSet中的集合个数是3个呢,我明明在集合中存了4个元素啊?这是因为:在ArrayList集合中,保存对象是按照顺序保存的,将每一个实例放到一个位置。 而HashSet集合,插入一个元素的插后,他会判断,这个元素则集合中是否存在,如果存在,就不插入了,注意不是替换,是不插入了。如果想吧这个元素插入,那就必须把原来的元素删除。
那么在集合c中,第一个元素和第三个元素想不想等呢?作为程序员,我希望他想等,那怎么做呢? 解决上面的提问:第一个,他们肯定是不相等的。HashSet比较是根据HashCode的值来比较的,HashCode值是根据内存地址换算出来的,这是两个对象,内存地址肯定不一样,所以用“==”来比较肯定不等,用equals方法来比较,我们没有重写,那也不相等。 第二个问题:那我想让他想等,怎么办?重写equals方法。
我们在ReflectPoint.java中生成hashCode和equals方法。 这个时候再来看看,集合中有几个元素?答案是集合中有两个元素 下面来讲讲这个HashCode的作用。 我们把ReflectPoint中的hashCode()方法删除掉,看看集合中有几个元素,答案是可能是3个也可能是2个。 那为什么会这样呢?我们来分析一下,hashCode的作用: 注意:要想一个对象有hashCode方法有价值的话,必须将这个对象存储在Hash集合中。加入文件没有这样的集合,而是ArrayList,那么hashCode就没有用了。
回到刚刚的问题上来,为什么我没有实现hashCode方法,集合中元素个数就等于3了呢?因为,每一个对象算出来的哈希值,是根据内存来算的。对象rp1根据内存算出来的哈希值存在第1个区域,而对象rp3根据内存算出来的哈希值存在第8个区域,虽然在其他区域有跟我一样的对象,但我却只跟集合内部比较。这就是为什么集合个数是3了。那如果恰巧rp1和rp3在同一个集合,那就比较出来了他们是相等的,这是集合个数就是2了。 为了让相等的对象,放在相同的区域,那么就有一种说法,如果两个对象的相等的话(equals相等),那么让他们的hashCode也相等。这就是写hashCode的原因了。
这里有一个很重要的知识点:
我们来分析一下原因,为什么会这样呢?我改一个值,就取不走了呢?因为我一改x的值,这个对象的hashCode就变了, 不在原来的区域了。 删除的时候我在这个区域里找原来的那个hashCode值,找不到,我就删除失败了。这样就导致内存泄露了,我以为把他删除掉了,实际上呢?没有删除掉。这样长时间的新增,修改删除对象,日积月累,就导致内存溢出了。这就是内存泄露的一个现象。
相关文章
- 暂无相关文章
用户点评