`

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弱引用与WeakHashMap

     《Java 理论与实践: 用弱引用堵住内存泄漏》一文也指出了使用全局的Map作为缓存容器时发生的内存泄露问题,介绍了如何使用hprof工具来找出内存泄露,并分析了如何使用弱引用来防止内存泄露,还分析了

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    清华妹子的Java仓库(进阶学习路线)

    本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习入门者进阶。 Java学习 本仓库记录了我的Java学习进阶...

    Java编程WeakHashMap实例解析

    主要介绍了Java编程WeakHashMap实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

    WeakHashMap的使用方法详解

    主要介绍了WeakHashMap的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

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

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

    解析WeakHashMap与HashMap的区别详解

    本篇文章是对WeakHashMap与HashMap的区别进行了详细的分析介绍,需要的朋友参考下

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作...

    java集合框架 解析

    java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 4.2. SortedMap接口 4.3. AbstractMap抽象类 4.4. HashMap类和TreeMap类 4.4.1. HashMap类 4.4.2. TreeMap类 4.5. LinkedHashMap类 4.6. ...

    Java集合类操作优化经验总结

    本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解...

    超全Java集合框架讲解.md

    超全Java集合框架讲解 - 超全Java集合框架讲解 - 集合框架总览 - Iterator Iterable ListIterator - Map 和 Collection 接口 - Map 集合体系详解 - HashMap - LinkedHashMap - TreeMap - WeakHashMap - ...

    javabitset源码-JerrySoundCode:杰瑞声码

    java bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) ...

    Thinking in Java 4th Edition

    Java SE5 and SE6 .................. 2 Java SE6 ......................................... 2 The 4th edition........................ 2 Changes .......................................... 3 Note on the ...

    picketlink-jbas-common-2.6.0.CR4.zip

    Java-WeakIdentityHashMap.zip,weakhashmap identityhashmapa独立库的组合,用于weakidantityhashmap实现内/外字段

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

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

    各种集合的总结

    总结了集合中常用的一点点,希望可以共享 List:LinkedList,ArrayList,Vector(Stack),Set Map:Hashtable,HashMap,WeakHashMap

    javalruleetcode-dsal:数据结构与算法个人整理

    java lru leetcode 基础算法 快速排序: 随机枢纽元快排、三路快排、三数中值快排 归并排序: 自顶向下归并、自底向上归并、链表的归并排序 堆排序: 下沉构建堆、赋值确定位置下沉 二分查找: 查找第一次后最后一次出现...

Global site tag (gtag.js) - Google Analytics