java 弱引用集合类WeakHashMap

Java集合框架中的WeakHashMap类是Map接口的一种特殊实现。它实现了Map接口,继承了AbstractMap抽象类。它实现了对key的弱引用。如果除了WeakHasMap对象本身对key的引用除外,在没有其它引用指向key,此WeakHashMap对象会在垃圾回收器执行一次回收之后,并且调用了WeakHashMap对象的方法之后将丢弃此key-value对。我们来看一个例子:

/* WeakHashMap */

public static void weakHashMap(){

String a = new String("A_KEY");

String b = new String("B_KEY");

Map weakHashMap = new WeakHashMap();

weakHashMap.put(a, "A_VALUE");

weakHashMap.put(b, "B_VALUE");

weakHashMap.put(null, "NULL_VALUE");

System.out.println("get 1:"+weakHashMap.get(a));

//将a指向null,这样除了weakHasMap对 new String("A_KEY")有引用外,在没有变量引用

a=null;

//调用get()方法能获取到value值,说明A_KEY还没有从集合中删除

System.out.println("get 2:"+weakHashMap.get(new String("A_KEY")));

//启动垃圾回收器

System.gc();

System.out.println("System.gc()");

System.out.println("get 3:"+weakHashMap.get(new String("A_KEY")));

System.out.println("打印weakHasMap中的元素......");

for(Iterator> it = weakHashMap.entrySet().iterator();it.hasNext();){

Entry entry = it.next();

System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());

}

}

以上代码输出结果:

get 1:A_VALUE

get 2:A_VALUE

System.gc()

get 3:null

打印weakHasMap中的元素......

key:null value:NULL_VALUE

key:B_KEY value:B_VALUE

WeakHashMap是通过expungeStaleEntries()方法实现移除只有weakHashMap自身才引用的key。WeakHashMap很多方法都直接或间接的调用了expungeStaleEntries()方法(比如size()、get()、put()方法)。

在上例中get 2的时候“A_KEY”的唯一一个引用已经是weakHashMap自身,但是expungeStaleEntries()并不知道这件事。

通过执行System.gc();,计算除了“A_KEY”的唯一一个引用已经是weakHashMap自身,知道了这件事。

get 3的时候expungeStaleEntries()方法就会删除这个“A_KEY“。有兴趣的童鞋可以看一下WeakHashMap的源码。

我们再来看一个例子

public static void main(String args[]){

WeakHashMap map = new WeakHashMap();

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();

}

}     运行结果是:     Map Size:3     1     2     3     Map Size:2     null     2     3     Map Size:2     null     2     3     (一直循环)     要注意String的特殊性,“2”是被放在常量池中的,所以没有被回收。

java 弱引用 集合_java 弱引用集合类WeakHashMap相关推荐

  1. java中有hash集合_Java(1.8)集合类中的HashMap

    Map接口没有继承任何其他接口,它存储的是Key-Value对,并且Key不能重复. 下面就是Map的所有接口: Map接口的所有方法 在HashMap 内部每个Key-Value对都用一个Node对 ...

  2. java中的集合_Java 集合介绍,常用集合类

    JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器.但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了 ...

  3. java 中的集合_JAVA中的集合

    JAVA中集合,是java中的基础概念,今天接着跟讲课准备课件的机会,重新整理一下关于JAVA中的集合的概念. 集合的概念 java中的集合类是用来存放对象的 集合相当于一个容器,里面包容着一组对象- ...

  4. java面试题:集合_Java:选择正确的集合

    java面试题:集合 这是在您的应用程序中选择Set , List或Map的正确实现的快速指南. 最好的通用或"主要"实现可能是ArrayList,LinkedHashMap和Li ...

  5. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  6. java c 引用区别_Java的引用c++的引用和C指针的区别

    Java的引用本质上就是C中的指针,而c++的引用则完全不同:有一个类 class Point { int x; int y; } 同样的一个Point p; 在Java中p表示一个引用,它等同于C语 ...

  7. java引用复制_Java中引用的浅复制和深复制

    Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy; // ...

  8. java循环引用讲解_Java循环引用

    在正在进行的项目中,人们编写了服务类来访问DAO. 几乎每个业务对象都具有使用自己的DAO的自己的服务. 在某些服务上,我们使用对其他服务的引用. 目前,人们正在实例化构造函数中所需的服务. 但是现在 ...

  9. java对象是 什么的集合_java持有对象-集合类

    面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...

最新文章

  1. 企业不要求工程师资格认证_谁说工程师不能成为企业家?
  2. BufferedReader和PrintWriter读写中文的问题
  3. python【力扣LeetCode算法题库】5- 最长回文子串
  4. html背景过大,html – CSS – 背景大小:封面太大了
  5. clone是深拷贝还是浅拷贝_go-clone:深拷贝 Go 数据结构
  6. 福玛特机器人评测_深度爆料扫地机器人地宝福玛特D820评测好不好?怎么样呢?内幕曝光测评...
  7. 数据库中的范式和反范式详解!
  8. CodeForces - 967D Resource Distribution(贪心+二分+构造)
  9. yytextview多种格式_iOS YYText的使用笔记一(YYTextView图文编辑器)
  10. Git 分支管理-git stash 和git stash pop
  11. cookie 和 token 都存放在 header 中,为什么不会劫持 token?____token和cookie的区别
  12. 浅谈Entity Framework中的数据加载方式
  13. 有什么拍照识别植物的软件?建议收藏这几个软件
  14. websocket原理与应用
  15. (六)R语言生物序列比对——Needleman-Wunsch全局比对算法
  16. 基于Python+Sqlite实现(图形化)民航售票管理系统【100010198】
  17. Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
  18. c mysql注册登录_C语言实现注册登录系统
  19. 如何减少开发中的 Bug
  20. Common Vector Operators(常见的向量操作)

热门文章

  1. grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
  2. 缓冲区溢出_了解Java缓冲池
  3. php对连接加密后传,PHP 加密解密和解决URL传输问题
  4. mysql嵌套实战_艰难的mysql嵌套表结果挑战
  5. 开源前后端分离在线考试系统
  6. 皮一皮:一直情绪不稳的原因终于找到了!
  7. API 分页设计与实现探讨
  8. 皮一皮:网络延迟的好处...
  9. 4 个使用率非常高的 Linux 监控工具
  10. Github 2020年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...