HashSet

本文通过一个具体的示例,深入探讨了在Java中使用HashSet时可能会遇到的内存泄漏问题。特别是当HashSet中的元素被修改导致其哈希码发生变化时,会出现无法移除元素的情况,并可能导致多次添加同一元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

  private transient HashMap<E,Object> map;
  private static final Object PRESENT = new Object();
public static void main(String[] args)
{
Set<Person> set = new HashSet<Person>();
Person p1 = new Person("唐僧","pwd1",25);
Person p2 = new Person("孙悟空","pwd2",26);
Person p3 = new Person("猪八戒","pwd3",27);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变

set.remove(p3); //此时remove不掉,造成内存泄漏

set.add(p3); //重新添加,居然添加成功
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
for (Person person : set)
{
System.out.println(person);
}
}


由于hashset中使用代理hashmap实现的所以向set中插入一个元素后再改变这个元素,这个时候元素的hashcode改变了但却已经插入了,就相当于向错误的槽中插入了一个元素,所以无法remove而改变后的元素由于hashcode变了可以再次插入到表中,那么可能有多可Entry对象指向同一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值