新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下:

1 private static String test(){

2 String a = new String("a");

3 WeakReference b = new WeakReference(a);

4 WeakHashMap weakMap = new WeakHashMap();

5 weakMap.put(b.get(), 1);

6 a = null;

7 System.gc();

8 String c = "";

9 try{

10 c = b.get().replace("a", "b");

11 return c;

12 }catch(Exception e){

13 c = "c";

14 return c;

15 }finally{

16 c += "d";

17 return c + "e";

18 }

19 }

运行结果是“cde”。

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

先说下一点Java GC内容

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

WeakReference

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

WeakReference weakref = new WeakReference();

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

weakref.get();

所以在上述代码中,经过a=null; System.gc()后,在WeakReference b = new WeakReference(a);中a为空已经被系统收回了,而b已经没有强引用指向了,所以b也被系统GC收回了。所以当代码运行到c = b.get().replace("a", "b");时,由于b.get()为null,会抛出异常。

WeakHashMap

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

import java.util.WeakHashMap;

public class WeakHashMapTest {

public static void main(String[] args) {

WeakHashMap w= new WeakHashMap();

//三个key-value中的key 都是匿名对象,没有强引用指向该实际对象

w.put(new String("语文"),new String("优秀"));

w.put(new String("数学"), new String("及格"));

w.put(new String("英语"), new String("中等"));

//增加一个字符串的强引用

w.put("java", new String("特别优秀"));

System.out.println(w);

//通知垃圾回收机制来进行回收

System.gc();

System.runFinalization();

//再次输出w

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

}

}

输出结果:{java=特别优秀, 数学=及格, 英语=中等, 语文=优秀}

第二次输出w:{java=特别优秀}

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

打印出代码中的变量

1 private static String test(){

2 String a = new String("a");

3 //System.out.println(a);

4 WeakReference b = new WeakReference(a);

5 //System.out.println(b.get());

6 WeakHashMap weakMap = new WeakHashMap();

7 weakMap.put(b.get(), 1);

8 a = null;

9 System.out.println("GC前b.get():"+b.get());

10 System.out.println("GC前weakMap:"+weakMap);

11 System.gc();

12 System.out.println("GC后"+b.get());

13 System.out.println("GC后"+weakMap);

14 String c = "";

15 try{

16 c = b.get().replace("a", "b");

17 System.out.println("C:"+c);

18 return c;

19 }catch(Exception e){

20 c = "c";

21 System.out.println("Exception");

22 return c;

23 }finally{

24 c += "d";

25 return c + "e";

26 }

27 }

运行后结果为:

GC前b.get():a

GC前weakMap:{a=1}

GC后null

GC后{}

Exception

cde

可见,在System.gc()前后的WeakReference和WeakHashMap的变化。

Java中异常处理中try,catch,finally的关系

java 的异常处理中,

在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,

如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;

如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return(如果return后是语句或者函数,eg:return b+=10; or return functionA();,先执行return后的语句或者函数),而再去执行 finally 代码块里的代码,

若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;

若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。

在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了。

现在分析上述代码:

System.gc()后b.get()和weakMap均为null

try中抛出异常,在catch中捕获异常

执行c = "c",执行到return c,但是并不立即return,执行finally

执行 c +="d"; return c + "e",finally代码块中有return语句就不会返回catch中执行return了。

所以最终结果是return "cde"

java referencemap_Java中关于WeakReference和WeakHashMap的理解相关推荐

  1. java weakhashmap_Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: 1 private staticString test(){2 String a = new String("a&q ...

  2. java referencemap_Java中TypeReference用法说明

    来源于:https://blog.csdn.net/zhuzj12345/article/details/102914545 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeR ...

  3. 学习Java过程中那些知道名字却不理解含义的大集合

    每次和其他人讨论的时候总会出现,别人说一个术语或者一个英文简称我总是一脸懵逼,脑袋里的想法就是:听过很多次这个词,但就是不理解是什么意思.所以总结了一下我遇到的一些词,并查询了一些资料终于把它们弄懂了 ...

  4. (008) java后台开发之java程序中的控制结构

    转自:https://course.tianmaying.com/java-basic+control-flow# 博客应用综合实例 接下来我们来设计一下博客应用,让它可以管理博客. 用户可以输入以下 ...

  5. Java中的 WeakReference 和 SoftReference

    我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...

  6. java中的softreference_Java中的 WeakReference 和 SoftReference

    我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...

  7. Java/Android中的引用类型及WeakReference应用实践

    一.背景 一般意义上而言,Java/Android中的引用类型包括强引用.软引用.弱引用.虚引用.不同的引用类型具有各自适用的应用场景,并与JVM的GC直接相关. 作为Java/Android中的引用 ...

  8. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  9. java reference_java中的4种reference的差别和使用场景(含理论、代码和执行结果)...

    JDK 1.2之后,对引用进行了扩充,引入了强.软.若.虚四种引用,被标记为这四种引用的对象,在GC时分别有不同的意义: a> 强引用(Strong Reference).就是为刚被new出来的 ...

  10. Java 8中HashMap冲突解决

    Java 8中HashMap冲突解决 目录(?)[+] 在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素.在最坏的情况下,这种方 ...

最新文章

  1. GIT - 拉取其他仓库的某个分支的代码
  2. 消息队列怎么保证消息有没有重复消费(幂等性)?
  3. android sdk版本控制,1. 统一SDK版本管理配置
  4. 计算机知识幼儿园,幼儿园中班计算机教学工作计划
  5. python怎么创建txt文件啊_python根据txt文本批量创建文件夹
  6. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)
  7. 摄像头拍摄后对图片进行图像处理-python(空域增强)
  8. centos上升级node_在centos7安装nodejs并升级nodejs到最新版本
  9. 美妆海报不会做? PSD分层模板轻松掌握大咖思路!
  10. pip install rrdtool
  11. Ros学习笔记(五)创建Ros服务
  12. 省级面板数据(2003-2019)二十:道路长度、面积、用水、污水、废气、保护区等(stata或excel版本)
  13. 单片机技术应用实训装置
  14. 最新勒索软件WannaCrypt病毒感染前后应对措施
  15. 杀毒软件开发,原理、设计、编程实战
  16. 报错:Exception opening socket
  17. 计算机硬盘启动改u为盘启动不了,如果计算机BIOS启动项找不到硬盘应该怎么办...
  18. jQuery 一次定时器_记一次腾讯微信面试
  19. wifi设置及一些有趣的应用
  20. 【WebLogic使用】1.WebLogic的下载与安装

热门文章

  1. MyBatis学习(三)--MyBatis配置文件简介
  2. 这些 iOS 面试基础题目,你都深入了解吗?
  3. 36_入门泛型的基本应用
  4. 怎样当一个企业舍不得的人
  5. Android类参考---Fragment(二)
  6. delphi编程来记录QQ的聊天记录
  7. javascript 闭包和原型
  8. 有了net send,谁还用IM?
  9. (5)数据分析-T检验
  10. CS224n--Lecture 1 Introduction and Word Vectors