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

1 private staticString 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 returnc;12 }catch(Exception e){13 c = "c";14 returnc;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。示例如下:

importjava.util.WeakHashMap;

public classWeakHashMapTest {public static voidmain(String[] args) {

WeakHashMap w= newWeakHashMap();//三个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 staticString 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 returnc;19 }catch(Exception e){20 c = "c";21 System.out.println("Exception");22 returnc;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 weakhashmap_Java中关于WeakReference和WeakHashMap的理解相关推荐

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

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

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

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

  3. Java中的 WeakReference 和 SoftReference

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

  4. java中的softreference_Java中的 WeakReference 和 SoftReference

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

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

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

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

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

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

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

  8. Java 8中HashMap冲突解决

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

  9. java util 中set,List 和Map的使用

    Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样对每个元素保存一份,但这是基于"键" ...

最新文章

  1. nodejs文件服务器断点续传,基于Nodejs的大文件上传之断点续传
  2. python flask表单语法_Flask框架如何使用表单
  3. Vue 路由知识三(过渡动画及路由钩子函数)
  4. awk多分隔符功能及wc命令案列及企业级应用
  5. 简单分析KafKa工作原理
  6. matlab 转换为正整数_【MATLAB】专题1笔记 MATLAB基础知识
  7. 一步设置Intellij IDEA 热部署处理方法
  8. javase-字符串次数查找
  9. ChartType 属性 excel图表类型
  10. MongoDB4.0.2集群搭建
  11. 10.22~10.28一周经典题目整理(meeting,BZOJ4377,POJ3659)
  12. FileUtils工具类常用方法
  13. 计算机图形学中的抗锯齿
  14. python应纳税额计算公式_起征点上调至5000后,最新、最简个税计算Excel公式来了!...
  15. word图片靠右_word设置图片边缘透明的方法步骤
  16. 语音用户如何计算机,笔记本电脑语音聊天对方听不清声音该怎么处理
  17. 【渝粤教育】电大中专常见病药物治疗 (2)_1作业 题库
  18. OC循环渐进:文件管理--计算文件大小的五种方式
  19. 游资会带散户炒股吗?
  20. RPC 框架 Kitex 初体验 (虚拟机环境)

热门文章

  1. 2022年山东省职业院校技能大赛网络搭建与应用赛项正式赛题
  2. Linux自建steam饥荒服务器教程
  3. 交互选择界面(c语言)
  4. 【Mysql】 获取表中一段时间范围内的数据
  5. 绿化智能灌溉控制系统解决方案
  6. Java基础教程(自学用,持续更新)
  7. 网络图标显示红叉叉的情况
  8. linux上删除一个目录以及其下文件
  9. 浏览器通过apache访问php文件提示下载问题,更改项目文件目录
  10. CPAL脚本自动化测试 ———— Write函数的使用与输出格式