ArrayList与HashSet的比较,以及HashCode分析, 内存泄露

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值,找不到,我就删除失败了。这样就导致 内存泄露了,我以为把他删除掉了,实际上呢?没有删除掉。这样长时间的新增,修改删除对象,日积月累,就导致 内存溢出了。这就是内存泄露的一个现象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值