`

java WeakHashMap学习(key是弱引用)

    博客分类:
  • java
 
阅读更多
在Java集合中有一种特殊的Map类型:WeakHashMap。 WeakHashMap 继承于AbstractMap,实现了Map接口。 和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是null。 不过WeakHashMap的键是“弱键”,里面存放了键对象的弱引用,当某个键不再正常使用时,会从WeakHashMap中被自动移除。当一个键对象被垃圾回收,那么相应的值对象的引用会从Map中删除。WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。

那么这个“弱键”的原理呢?大致上是通过WeakReference和ReferenceQueue实现的。 WeakHashMap的key是“弱键”,即是WeakReference类型的;ReferenceQueue是一个队列,它会保存被GC回收的“弱键”。实现步骤是: (01) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。 (02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。 (03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键值对;同步它们,就是删除table中被GC回收的键值对。 这就是“弱键”如何被自动从WeakHashMap中删除的步骤了。 和HashMap一样,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法来构造同步的 WeakHashMap。

WeakHashMap源码分析,WeakHashMap维护了一个ReferenceQueue,保存了所有存在引用的Key对象。WeakHashMap.Entry<K,V>中并没有保存Key,只是将Key与ReferenceQueue关联上了。

WeakHashMap<String, String> map = new WeakHashMap<String, String>();
        // 没有引用 所以对被清除
        map.put(new String("1"), "1");
        // 存在常量池 所以不会被收集
        map.put("2", "2");
        String s = new String("3");
        // 还有被引用 所以不会被收集
        map.put(s, "3");
        while (map.size() > 0) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException ignored) {
            }
            System.out.println("Map Size:" + map.size());
            System.out.println(map.get("1"));
            System.out.println(map.get("2"));
            System.out.println(map.get("3"));
            System.gc();
        }


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java很好的学习笔记集合Map,学习代码

    5. WeakHashMap:键使用弱引用,当键不再被引用时,键值对会被自动删除。 Map的遍历方式: 1. for-each循环:使用增强for循环遍历Map的entrySet()。 2. Iterator迭代器:通过Map的entrySet().iterator()获取迭代器...

    详解Java对象的强、软、弱和虚引用+ReferenceQueue

    WeakHashMap是弱引用map,就是Key键是一个弱引用的键,如果Key键被回收,则在get该map中值后,会自动remove掉value。如果Key键始终被强引用,则是无法被回收的;注意Value是被强引用的,所以不要让Value间接的引用了...

    java避免内存泄露

    Map&lt;Key, Value&gt; map = new WeakHashMap(); ``` 3. **合理使用静态变量**:尽量减少静态变量的使用,特别是不要让静态变量引用可变对象。 4. **及时清理监听器和回调函数中的引用**:当不再需要监听器或回调函数...

    java.util包总结

    12. WeakHashMap:键使用弱引用的Map,当键不再被引用时,条目会自动从Map中移除。 13. Timer和TimerTask:定时任务调度,可以安排一次或周期性的任务执行。 14. Bitset:位集,用于高效存储和操作位标志。 15. ...

    ry08-06.pdf

    弱表格(WeakTables),如Java中的WeakHashMap,通常是弱引用使用的典型场景。弱表格中,键(key)与值(value)之间的循环引用会导致垃圾收集器无法收集这些元素,即使它们从外部不再可达。这在某些类型的应用中...

    Java集合类详解总结

    - `WeakHashMap`:基于弱引用的键,适用于缓存场景,当没有强引用指向键时,键会被垃圾回收器回收。 #### ArrayList与LinkedList对比 - `ArrayList`在随机访问时效率高于`LinkedList`,因为`LinkedList`需要从头...

    java 运用映射的相关类(Map)

    除了上述实现类,还有WeakHashMap、IdentityHashMap等特殊用途的Map实现,它们分别处理弱引用和比较对象引用相等的情况。 在实际开发中,选择合适的Map实现类取决于具体需求,如是否需要有序、是否考虑线程安全、...

    Java集合框架完整说明便于了解集合

    TreeMap则按照Key进行排序,而WeakHashMap使用弱引用键,有助于防止内存泄漏。 4. ConcurrentHashMap和Hashtable:ConcurrentHashMap是线程安全的Map,采用了分段锁策略,比Hashtable在多线程环境下表现更优。它在...

    java集合类详解

    - `WeakHashMap`:键是弱引用,这意味着当键对象没有强引用时,键值对会被垃圾回收器回收,适用于缓存场景。 #### 遍历Collection 所有`Collection`的实现都支持`iterator()`方法,用于遍历集合中的元素。通过迭代...

    java中集合的用法与区别.docx

    LinkedHashMap保持了元素的插入顺序,WeakHashMap允许弱引用键,当键不再被引用时,键值对会自动移除。IdentityHashMap使用对象的引用相等性作为判断键是否相同的依据,而非equals()方法的返回值。 在性能方面,...

    JAVA集合类应用.pdf

    `WeakHashMap`则允许键为弱引用,当键不再被引用时,键值对会被自动移除。 选择集合类时,需要考虑以下因素: - **API**:选择符合需求的接口和实现,如需要保持元素排序则选择`SortedSet`或`SortedMap`的实现。 - ...

    Java容器框架 collection集合

    - **WeakHashMap**:弱引用类型,当没有强引用指向键时,键可以被垃圾回收。 - **Hashtable**:线程安全,但由于使用synchronized关键字同步整个映射,在高并发环境下性能较差。 #### 二、Collection接口详解 - ...

    线程死锁CPU过高,请求原因分析

    在Java编程中,WeakHashMap是一种特殊的哈希表,它的键(Key)是弱引用,当键被垃圾回收器清除后,即使有值(Value)存在,该条目也会自动从哈希表中移除。 线程死锁的原因通常包括以下几点: 1. **资源互斥**:每...

    Java集合框架

    `WeakHashMap`是一种特殊的`HashMap`,其键使用弱引用,一旦键不再被引用,就会被垃圾回收。`HashTable`是线程安全的`Map`实现,但不推荐在现代Java中使用,因为它性能较差且不支持`null`值。 在选择集合实现时,...

    WeakObjectPool:用于在对象生命周期中将对象附加到对象(即装饰器)的池

    #弱对象池问题您是否曾经想跟踪一堆对象而不直接引用它们,以免使用弱引用干扰它们的自然生命周期? 您是否曾经尝试过在运行时扩展Java对象?解决方案WeakObjectPool :用于保存和扩展[弱引用的对象]的池( “ ...

    超全Java集合框架讲解.md

    - **`WeakHashMap`**:一种特殊类型的`HashMap`,它使用弱引用作为键。这意味着当键不再被其他地方引用时,它们可以从映射中删除以回收内存。 - **`Hashtable`**:这是最早的`Map`实现之一,它是线程安全的,但效率...

    set,list,map区别与联系.docx

    - **WeakHashMap**和**IdentityHashMap**:特殊类型的Map,WeakHashMap的键使用弱引用,键在不再被引用时会被自动清理;IdentityHashMap使用对象的引用地址而非equals()方法来判断键的相等性。 4. **关联操作** -...

    java中list、set和map 的区别

    - **WeakHashMap**: 这种实现使用弱引用作为键,主要用于缓存场景,当没有强引用指向这些键时,这些键就会被垃圾回收器回收,从而释放内存空间。 - **IdentityHashMap**: 在这种实现中,键的相等性是由`==`操作符而...

Global site tag (gtag.js) - Google Analytics