java 分析一道关于WeakReference的题目

题目:

import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

public class Test1 {
    public static void main(String[] args) {
        String val = test();
        System.out.println("val:" + val);
    }

    private static String test(){
        String a = new String("a");
        WeakReference<String> b = new WeakReference<String>(a);
        WeakHashMap<String, Integer> weakMap = new WeakHashMap<String, Integer>();
        weakMap.put(b.get(), 1);
        a = null;
        System.gc();
        String c = "";
        try{
            c = b.get().replace("a", "b");
            return c;
        }catch(Exception e){
            c = "c";
            return c;
        }finally{
            c += "d";
            return c + "e";
        }
    }
}

![]()

该题关键在考察WeakReference和WeakHashMap的理解。

先说下一点Java GC内容

在Java里, 当一个对象object被创建时,它被放在Heap里。当GC运行的时候,如果发现没有任何引用指向object,object就会被回收以腾出内存空间。或者换句话说,一个对象被回收,必须满足两个条件:1)没有任何引用指向它 2)GC被运行.

WeakReference

当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果GC运行, 那么这个对象就会被回收。weak reference的语法是:

WeakReference<T> weakref  = new WeakReference<T>();

当要获得WeakReference的object时, 首先需要判断它是否已经被GC回收,若被收回,则下列返回值为空:

weakref.get();

所以在上述代码中,经过a=null; System.gc()后,当代码运行到c = b.get().replace("a", "b");时,由于b.get()为null,会抛出异常。

WeakHashMap

WeakHashMap其实和HashMap用法类似,它们之间唯一的区别就是:HashMap中的key保存的是实际对象的强引用,因此只要对象不被销毁,即该key所对应的key-value都不会被垃圾回收机制回收。但是WeakHashMap保存的实际对象是弱引用,这意味着只要该对象没有被强对象引用就有可能会被垃圾回收机制回收对应的Key-value。示例如下:

import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

public class WeakHashMapTest {
    public static void main(String[] args) {
        WeakHashMap weakMap = new WeakHashMap();

        //三个key-value中的key 都是匿名对象,没有强引用指向该实际对象
        weakMap.put(new String("语文"),new String("优秀"));
        weakMap.put(new String("数学"), new String("及格"));
        weakMap.put(new String("英语"), new String("中等"));

        //增加一个字符串的强引用
        weakMap.put("java", new String("特别优秀"));

        System.out.println(weakMap);

        //通知垃圾回收机制来进行回收
        System.gc();
        System.runFinalization();

        //再次输出w
        System.out.println("第二次输出:"+weakMap);
    }
}

![]()

所以在最开始的代码中WeakHashMap<String, Integer> weakMap = new WeakHashMap<String, Integer>(); weakMap没有强引用指引,所以在执行System.gc()后weakMap被系统GC收回。

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

本周热议
鉴影记录
SpringCloud(1) - 入门概述
python每日一练之单元测试
k8s之etcd集群部署
zookeeper 实现一个简单的服务注册与发现(C++) 三:服务发现
zookeeper 实现一个简单的服务注册与发现(C++) 二:注册
zookeeper 实现一个简单的服务注册与发现(C++) 一:与zk保持连接
Java+MySQL笔记
一些零散笔记
TCP/IP协议栈相关知识点总结
Dart学习手册
9.ubuntu文件文本编码的查看与转换,乱码问题
C++输入输出流
扩展2
69-django-forms组件源码刨析、cookie与session
67-django-前后端传数据编码格式、ajax传json格式数据、ajax传文件数据、ajax与sweetalert结合二次确认、django自带的序列化组件、批量插入、分页器
66-django-模型层之choices参数、多对多三种创建方式、数据库三大设计范式、Ajax
64-django-模型层(ORM语法)单表查询、常见十几种查询方法、双下划线查询、多表操作、外键字段增删改查、跨表查询
62-django-无名有名分组反向解析、路由分发、名称空间、伪静态、pycharm虚拟环境、django版本区别、视图层之三板斧、JsonResponse、form表单上传文件、FBV与CBV
61-django-数据增删改、orm创建表关系、django请求生命周期流程图、路由层之路由匹配、无名分组、有名分组
HaowuliaoA

微信扫码关注 HaowuliaoA 订阅号

友情链接

支付猫
链才网-区块链英才
phpEnv集成环境
广州翻译公司
Lion技术博客
花香诱人醉
LyApi框架
凉风有信
快斗博客
佩晨的博客
蛙导
layui
WebIM
layer
layDate
申请友链
QQ联系