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类源码,这次特地拿出来晒一晒. ...
随机推荐
- c++日历改进版
#include<iostream> # include<fstream> #include<time.h> #include<string> #inc ...
- Linux下一个Nginx安装步骤
一个.下载pcre 官网下载:http://www.pcre.org/ # wget http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre ...
- .NET 并行(多核)编程系列之七 共享数据问题和解决概述
原文:.NET 并行(多核)编程系列之七 共享数据问题和解决概述 .NET 并行(多核)编程系列之七 共享数据问题和解决概述 前言:之前的文章介绍了了并行编程的一些基础的知识,从本篇开始,将会讲述并行 ...
- yate.conf
但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...
- Win7 补丁装不上怎么办?
检查系统盘文件系统是否出错: 打开管理员命令行程序(Win+R,输入 cmd 确认) 如果系统盘是 C 盘,命令行窗口输入 chkdsk C: /f 对提示输入’y’ 重启等待 系统文件检查: 打开管 ...
- ssh远程登录报错REMOTE HOST IDENTIFICATION HAS CHANGED!解决方式及原因
注意,文档中的ip和指纹已经替换为了ip.ip.ip.ip 和aa:... ,以免引起不必要的误会. icode@test:~/lab/dir/sadf$ ssh remote_name@ip.ip. ...
- 大教堂与集市(The Cathedral and the Bazaar)读书笔记
大教堂与集市The Cathedral and the Bazaar,一本不像计算机方面的计算机书籍 命令式管理,适合和奴隶共事目标共识型管理,适合和自由人共事 心性气层 只要眼多,bug好找 黑客开 ...
- 左右AjaxFileUpload背景返回Json治
项目中用到图片的无刷新上传,因此想到用ajaxUpLoadFile来解决. 第一步,先在上传图片的页面引入你下载到本地的ajaxfileupload.js文件. 文件下载地址:http://downl ...
- Socket连接超时(转)
Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间.这在国外访问weibo时,并且网络环境极差的情况下有可能发生.解决的办法 ...
- FZU 1686 龙之谜 重复覆盖
兑换0,1模型,如.注意,数据的范围 #include <stdio.h> #include <string.h> #include <iostream> #inc ...