Java中的HashMap如何处理键和值的弱引用?

Java中的HashMap如何处理键和值的弱引用?,java,garbage-collection,hashmap,out-of-memory,java-memory-model,Java,Garbage Collection,Hashmap,Out Of Memory,Java Memory Model,我最近读了一本关于java内存建模的书,书中说:HashMap对键和值使用弱引用(因为它们都是对象),这样当hasnmap存储越来越多的键值对时,HashMap就可以避免内存不足的问题。 但问题是:如果密钥和值在这段时间内被GC处理,那么如何使用hashmap中的get方法获取密钥-值对 比如说, String key=new String("GC"); String value=new String("GC"); hashmap.put(key,value); 在执行了一定的代码之后,jav

我最近读了一本关于java内存建模的书,书中说:HashMap对键和值使用弱引用(因为它们都是对象),这样当hasnmap存储越来越多的键值对时,HashMap就可以避免内存不足的问题。

但问题是:如果密钥和值在这段时间内被GC处理,那么如何使用hashmap中的get方法获取密钥-值对

比如说,

String key=new String("GC");
String value=new String("GC");
hashmap.put(key,value);
在执行了一定的代码之后,java GC有可能获得密钥和值,然后在执行过程中会发生什么:

hashmap.get(key)

由于密钥不再存在于hashmap中?

它是关于WeakHashMap的,因此它会删除不再从映射本身外部引用密钥的条目。只有在GC清除密钥后才会发生,如下所示:

    Map m = new WeakHashMap();
    m.put(new Object(), 1);       // key is referenced only by map itself
    System.out.println(m.size()); // prints 1
    System.gc();     
    Thread.sleep(1); // give GC some time
    System.out.println(m.size()); // prints 0

这本书是错的。HashMap使用强引用。但是有一个WeakHashMap,它的文档解释了它是如何工作的:一个关于
WeakHashMap
WeakReference
SoftReference
的相关问题。谢谢,我认为这本书是错的……然后,我如何检索这个键值对?你不能,它被GCS删除了,那么弱引用或weakhashmap的用例是什么?我不会在程序中使用任何突然指向null的对象……来自有效的Java第6项:“一旦你将一个对象引用放入缓存,很容易忘记它在那里,并在它变得不相关很久之后将它留在缓存中”。解决方案-WeakHashMapSee线程源。它使用带有弱引用键的ThreadLocalMap,当不再使用ThreadLocal(无实时引用)时,entires将自动删除