更改集合元素或map键后找不到元素——内存泄漏

HashSet是根据元素的hash值来查找的,HashMap也是根据key的hash来查找的。如果先添加了元素,然后又在外面单独对元素做修改,很可能导致再次查找时找不到,因为这个元素的hash值已经被修改了。这并不是出现在所有的数据类型中,只会出现在那些根据自身值或属性计算hash值,而修改时又恰好是修改这些的。
下面做个测试,

		System.out.println("----int----");
        int a = 2;
        Set<Integer> set = new HashSet<>();
        set.add(a);
        a = 3;
        System.out.println(set.contains(a));	//false
        System.out.println(set.contains(2));	//true

        System.out.println("----String----");
        String s = "22";
        Set<String> set1 = new HashSet<>();
        set1.add(s);
        s = "33";
        System.out.println(set1.contains(s));	//false
        System.out.println(set1.contains("22"));	//true

        System.out.println("----StringBuilder----");
        StringBuilder sb = new StringBuilder("22");
        Set<StringBuilder> set2 = new HashSet<>();
        set2.add(sb);
        sb.append('3');
        System.out.println(set2.contains(sb));	//true

        System.out.println("---HashMap + String---");
        Map<String, Integer> map = new HashMap<>();
        map.put(s,a);
        s = "44";
        a = 4;
        System.out.println(map.getOrDefault(s,100));	//100
        System.out.println(map.getOrDefault("33", 100));	//3

String是根据自身的每个字符去计算hash值的,修改了,对象指向了新一块内存,有了新的hash值,但集合仍持有原来的引用,导致再按s的hash去查找找不到,同时"22"的内存无法释放,发生内存泄漏。
其他的原因类似。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值