编程语言
首页 > 编程语言> > java – 使用String文字和String对象的weakhashmap的行为

java – 使用String文字和String对象的weakhashmap的行为

作者:互联网

我理解WeakhashMap的概念. String literal和String对象使其难以理解.

以下是代码:

package com.lnt.StringBuf;

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

public class Test1 {
    public static void main(String[] args) {

        Map w = new WeakHashMap();
        Map h = new HashMap<>();

        String hkey = new String("hashkey");
        String wkey = new String("weakkey");
    /*  String hkey = "hashkey";
        String wkey = "weakkey";*/

        h.put(hkey, 1);
        w.put(wkey, 1);

        System.gc();

        System.out.println("Before");
        System.out.println("hashmap size: " + h.size());
        System.out.println("weakmap size: " + w.size());
        System.out.println("Hashmap value: " + h.get("hashkey") + "\t"
                + "weakmap value: " + w.get("weakkey"));

        hkey = null;
        wkey = null;

        System.gc();
        System.out.println(hkey+" "+wkey);

        System.out.println("After");
        System.out.println("hashmap size: " + h.size());
        System.out.println("weakmap size: " + w.size());
        System.out.println("Hashmap value: " + h.get("hashkey") + "\t"
                + "weakmap value: " + w.get("weakkey"));

        System.out.println(h.entrySet());
        System.out.println(w.entrySet());

    }

}

输出是:

Before
hashmap size: 1
weakmap size: 1
Hashmap value: 1    weakmap value: 1
null null
After
hashmap size: 1
weakmap size: 0
Hashmap value: 1    weakmap value: null
[hashkey=1]
[]

但当
String hkey = new String(“hashkey”);
String wkey = new String(“weakkey”);

替换为以下代码,输出更改.

String hkey = "hashkey";
String wkey = "weakkey";

输出是:

Before
hashmap size: 1
weakmap size: 1
Hashmap value: 1    weakmap value: 1
null null
After
hashmap size: 1
weakmap size: 1
Hashmap value: 1    weakmap value: 1
[hashkey=1]
[weakkey=1]

问题:在WeakHashMap中以不同的方式使String字符串和String对象’null’受影响.是什么原因?

解决方法:

字符串文字被实现,这基本上意味着有一个缓存,通常称为字符串池.因此,字符串文字总是被强烈引用 – 使它们不适合用作弱结构中的键,例如WeakReference和WeakHashMap.

对于自动装箱的整数也是如此:整数也为[-128,127]范围内的int值保留Integer对象的缓存.所以你也不应该在弱结构中使用int作为键.

但是,您可以通过在插入条目时创建新对象来解决这些问题,例如:在下面的示例中,“a”条目最终将从地图中删除,但“b”条目将永远保留在那里,这实际上是内存泄漏:

WeakHashMap<String, Object> map = new WeakHashMap<>();
map.add(new String("a"), new Object());
map.add("b", new Object());

相同的示例对整数有效:

WeakHashMap<Integer, Object> map = new WeakHashMap<>();
map.add(new Integer(56), new Object());
map.add(57, new Object());

这里57的条目将永远留在那里,因为Integer的缓存,但56条目可以被垃圾收集器删除.

布尔也有缓存,但当然只有2个值.在Integer有256个潜在危险值的情况下,String实际上有无限次出现可能是危险的 – 你只需要使用文字(或使用String.intern())来创建它们.可能还存在其他危险类别.

标签:java,weakhashmap
来源: https://codeday.me/bug/20190725/1530629.html