博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WeakReference and WeakHashMap
阅读量:6688 次
发布时间:2019-06-25

本文共 2851 字,大约阅读时间需要 9 分钟。

弱引用通过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还有强引用在引用它们。

转载地址:http://ehzoo.baihongyu.com/

你可能感兴趣的文章
Editplus的配置说明:Web服务器设置和用户工具栏设置
查看>>
JAVA RPC:从上手到爱不释手
查看>>
详细介绍Java中的堆、栈和常量池
查看>>
Go环境变量
查看>>
用Doxygen优化Inkpad的模块关系
查看>>
Delphi 数据类型列表
查看>>
eclipse 创建maven Web项目
查看>>
Angular之父子路由
查看>>
llvm每日谈之三 如何创建一个LLVM工程
查看>>
高性能Web服务之tomcat基础应用详解(一)
查看>>
处理logs,进行分析web展示。
查看>>
8月第二周B2B类网站排名:金泉网跃升第四
查看>>
9月第3周游戏运营类网站/频道:91.com下降7位
查看>>
Memcached Multiget
查看>>
1月第二周.COM增7.1万 亚洲域名.ASIA净减2.4万
查看>>
Swift的学习Day03(操作符)
查看>>
3月第2周全球域名商TOP15:中国占据3个席位
查看>>
yii2.0 修改默认控制器
查看>>
解决apache无法启动:undefined symbol: apr_ldap_ssl_init
查看>>
Linux网络字节序
查看>>