WeakReference and WeakHashMap
弱引用通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统北村是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收-正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class WeakReferenceTest {
public static void main(String[] args){
Stringstr = newString("Java");
Stringstr1 = newString("Java");
SoftReference<String>sr = newSoftReference<String>(str1);
WeakReference<String>wr = newWeakReference<String>(str);
str= null;
str1= null;
System.out.println(sr.get());
System.out.println(wr.get());
System.gc();
System.runFinalization();
System.out.println(sr.get());
System.out.println(wr.get());
}
}
Output:
Java
Java
Java
null
不要使用String str = “Java”;这样就看不到运行效果,因为采用这样定义的字符串系统会缓存这个字符串直接量(会使用强引用来引用它),系统不会回收被缓存的字符串常量。
弱引用具有很大的不确定性,因为每次垃圾回收机制执行时都会回收弱引用的对象,而垃圾回收机制的运行又不受程序员的控制,因此程序获取弱引用所引用的Java对象时必须小心空指针异常-通过弱引用所获取的Java对象可能是null.
由于垃圾回收的不确定性,当程序希望从弱引用中取出被引用对象时,可能这个被引用对象已经被释放了。如果程序需要使用那个被引用的对象,则必须重新创建新对象。
public class WeakReferenceTest {
public static void main(String[] args){
Stringstr = newString("Java");
Stringstr1 = newString("Java");
SoftReference<String>sr = newSoftReference<String>(str1);
WeakReference<String>wr = newWeakReference<String>(str);
str= null;
str1= null;
System.out.println(sr.get());
System.out.println(wr.get());
System.gc();
System.runFinalization();
if(wr.get() == null){
str= new String("Java");
wr= newWeakReference<String>(str);
System.out.println(wr.get());
}
System.out.println(sr.get());
System.out.println(wr.get());
}
}
Output:
Java
Java
Java
Java
Java
与weakReference功能类似的还有WeakHashMap,当程序有大量的java对象需要使用弱引用来引用时,可以考虑使用weakHashMap来保存它们。
import java.util.WeakHashMap;
class CrazyKey{
String name;
public CrazyKey(String name){
this.name =name;
}
public inthashCode(){
return name.hashCode();
}
public boolean equals(Object obj){
if(obj==this){
returntrue;
}
if(obj!=null && obj.getClass() == CrazyKey.class){
returnname.equals(((CrazyKey)obj).name);
}
returnfalse;
}
public String toString(){
return "CrazyKey[name=" + name +"]";
}
}
public class WeakHashMapTest {
public static void main(String[] args)throws InterruptedException{
WeakHashMap<CrazyKey,String>map = newWeakHashMap<CrazyKey,String>();
for(int i=0;i<10;i++){
map.put(new CrazyKey(i+1+""),"value"+(i+11));
}
System.out.println(map);
System.out.println(map.get(new CrazyKey("2")));
System.gc();
Thread.sleep(50);
System.out.println(map);
System.out.println(map.get(new CrazyKey("2")));
}
}
Output:
{CrazyKey[name=8]=value18,CrazyKey[name=9]=value19, CrazyKey[name=4]=value14, CrazyKey[name=5]=value15,CrazyKey[name=6]=value16, CrazyKey[name=7]=value17, CrazyKey[name=10]=value20,CrazyKey[name=1]=value11, CrazyKey[name=2]=value12, CrazyKey[name=3]=value13}
value12
{}
null
在垃圾回收机制运行之前,WeakHashMap的功能与普通HashMap并没有太大的区别,它们的功能相似。但一旦垃圾回收机制被执行,WeakHashMap中所有key-value就都会被清空,除非某些Key还有强引用在引用它们。
WeakReference and WeakHashMap的更多相关文章
- Java中关于WeakReference和WeakHashMap的理解
新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...
- 【转】Java中关于WeakReference和WeakHashMap的理解
新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对WeakHashMap进行学习.我们先对WeakHashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用WeakHashMap.第1部分 WeakHashMap介绍 ...
- WeakHashMap介绍
WeakHashMap简介 WeakHashMap 继承于AbstractMap,实现了Map接口. 和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key ...
- Java中WeakHashMap实现原理深究
一.前言 我发现Java很多开源框架都使用了WeakHashMap,刚开始没怎么去注意,只知道它里面存储的值会随时间的推移慢慢减少(在 WeakHashMap 中,当某个“弱键”不再正常使用时,会被从 ...
- 0014 Java学习笔记-集合-HashMap集合
主要的方法 + 构造方法: * HashMap(); - 默认大小16,负载因子0.75 * HashMap(int initialCapacity); * HashMap(int initialCa ...
- ReferenceQueue的使用
转:http://www.iflym.com/index.php/java-programe/201407140001.html 1 何为ReferenceQueue 在java的引用体系中,存在着强 ...
- Java核心编程快速学习
Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...
- Thread类源码剖析
目录 1.引子 2.JVM线程状态 3.Thread常用方法 4.拓展点 一.引子 说来也有些汗颜,搞了几年java,忽然发现竟然没拜读过java.lang.Thread类源码,这次特地拿出来晒一晒. ...
随机推荐
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- Web API 数据流使用
ASP.NET Web API 应用教程(一) ——数据流使用 相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web AP ...
- 【Android进阶】Activity的四种加载模式
Activity的四种加载模式: 1.standard :系统的默认模式,一次跳转即会生成一个新的实例.假设有一个activity命名为Act1, 执行语句:startActivity(new Int ...
- 【剑指offer学习】求和为定值的两个数(拓展)
接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有 ...
- 在SQL2008中,如何让id自动生成并自动递增?如何让时间默认生成?
id自动递增: 如果是用语句操作,这样定义:ID INT IDENTITY,如果是要生成一对数字,这样定义:ID INT IDENTITY(1,1) 如果要在SQL Server的表中设置 ...
- Codeforces Round #252 (Div. 2) 441B. Valera and Fruits
英语不好就是坑啊.这道题把我坑残了啊.5次WA一次被HACK.第二题得分就比第一题高10分啊. 以后一定要加强英语的学习,要不然就跪了. 题意:有一个果园里有非常多树,上面有非常多果实,为了不然成熟的 ...
- 在 Ubuntu 12.04 上安装 GitLab7.x
安装环境: 操作系统: Ubuntu 12.4 LTS 英文 数据库: postgresql webserver: nginx 能够说到7.x的时候,GitLab的文档已经相当完好 ...
- cocos2d-x删除本地存储的文件UserDefault.xml方法——白费
许多其他的精彩分享:http://blog.csdn.net/u010229677 首先获取UserDefault的存储位置.然后remove就可以: remove( UserDefault::get ...
- LINQ之路系列文章导读
本系列文章将会分为3篇来进行阐述,如下: LINQ之路(1):LINQ基础 LINQ之路(2):LINQ to SQL本质 LINQ之路(3):LINQ扩展
- ubuntu-14.04 系统安装mysql-5.6.21
1.安装mysql前准备工作 (1).从官网下载mysql-5.6.21.tar.gz (2).tar -zxvf mysql-5.6.21-tar.gz 会生成mysql-5.6.21的目录 ...