java 弱引用 集合_java 弱引用集合类WeakHashMap
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相关推荐
- java中有hash集合_Java(1.8)集合类中的HashMap
Map接口没有继承任何其他接口,它存储的是Key-Value对,并且Key不能重复. 下面就是Map的所有接口: Map接口的所有方法 在HashMap 内部每个Key-Value对都用一个Node对 ...
- java中的集合_Java 集合介绍,常用集合类
JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器.但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了 ...
- java 中的集合_JAVA中的集合
JAVA中集合,是java中的基础概念,今天接着跟讲课准备课件的机会,重新整理一下关于JAVA中的集合的概念. 集合的概念 java中的集合类是用来存放对象的 集合相当于一个容器,里面包容着一组对象- ...
- java面试题:集合_Java:选择正确的集合
java面试题:集合 这是在您的应用程序中选择Set , List或Map的正确实现的快速指南. 最好的通用或"主要"实现可能是ArrayList,LinkedHashMap和Li ...
- java 定义map集合_java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- java c 引用区别_Java的引用c++的引用和C指针的区别
Java的引用本质上就是C中的指针,而c++的引用则完全不同:有一个类 class Point { int x; int y; } 同样的一个Point p; 在Java中p表示一个引用,它等同于C语 ...
- java引用复制_Java中引用的浅复制和深复制
Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy; // ...
- java循环引用讲解_Java循环引用
在正在进行的项目中,人们编写了服务类来访问DAO. 几乎每个业务对象都具有使用自己的DAO的自己的服务. 在某些服务上,我们使用对其他服务的引用. 目前,人们正在实例化构造函数中所需的服务. 但是现在 ...
- java对象是 什么的集合_java持有对象-集合类
面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...
最新文章
- 企业不要求工程师资格认证_谁说工程师不能成为企业家?
- BufferedReader和PrintWriter读写中文的问题
- python【力扣LeetCode算法题库】5- 最长回文子串
- html背景过大,html – CSS – 背景大小:封面太大了
- clone是深拷贝还是浅拷贝_go-clone:深拷贝 Go 数据结构
- 福玛特机器人评测_深度爆料扫地机器人地宝福玛特D820评测好不好?怎么样呢?内幕曝光测评...
- 数据库中的范式和反范式详解!
- CodeForces - 967D Resource Distribution(贪心+二分+构造)
- yytextview多种格式_iOS YYText的使用笔记一(YYTextView图文编辑器)
- Git 分支管理-git stash 和git stash pop
- cookie 和 token 都存放在 header 中,为什么不会劫持 token?____token和cookie的区别
- 浅谈Entity Framework中的数据加载方式
- 有什么拍照识别植物的软件?建议收藏这几个软件
- websocket原理与应用
- (六)R语言生物序列比对——Needleman-Wunsch全局比对算法
- 基于Python+Sqlite实现(图形化)民航售票管理系统【100010198】
- Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
- c mysql注册登录_C语言实现注册登录系统
- 如何减少开发中的 Bug
- Common Vector Operators(常见的向量操作)
热门文章
- grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
- 缓冲区溢出_了解Java缓冲池
- php对连接加密后传,PHP 加密解密和解决URL传输问题
- mysql嵌套实战_艰难的mysql嵌套表结果挑战
- 开源前后端分离在线考试系统
- 皮一皮:一直情绪不稳的原因终于找到了!
- API 分页设计与实现探讨
- 皮一皮:网络延迟的好处...
- 4 个使用率非常高的 Linux 监控工具
- Github 2020年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...