Java中,4种对象引用之间的区别是什么?

简介: 一位工作4年的小伙伴面试被问到这样一道题,说Java中,4种对象引用之间的区别是什么?这道面试题问得比较偏门,更多应用在一些底层类库或者是框架中,涉及到的知识点包括JVM、GC等,一般人确实很少关注。

一位工作4年的小伙伴面试被问到这样一道题,说Java中,4种对象引用之间的区别是什么?这道面试题问得比较偏门,更多应用在一些底层类库或者是框架中,涉及到的知识点包括JVM、GC等,一般人确实很少关注。


那既然都问到我这里来了,还是要给大家分享一下我的理解。


Java中的4种引用类型主要是指强、软、弱、虚,

6af44b238c243ee65a737d6d979c3df9.jpg

它们主要是体现对象不同的可达性状态和对GC的影响。下面我给大家详细地分析一下我对这四种引用类型的理解。

811a709014094b7cead486ff1326adde.jpg

1、强引用:只要引用关系还在,对象就永远不会被回收。


其实就是指普通对象的引用,只要还有引用关系存在,就表示对象还活着,垃圾收集器无法回收这一类对象。只有在没有其他引用关系或者超过引用作用域,再或者是将对象引用强制赋值为null的情况下,垃圾收集器才会去回收这个对象。

3c5e666d0ef44067f2c597095f9f9ed9.jpg

2、软引用:非必须存活的对象,JVM会在内存溢出前对其进行回收。


是一种相对于强引用来说弱一些的引用。可以让对象豁免一些垃圾收集的操作。只有当JVM判断内存不足的时候,才会试图回收引用指向的对象。那软引用通常是用来实现内存敏感的一些缓存,如果还有空闲内存就可以暂时保留缓存,当内存不足的时候会清理掉。这样就可以保证使用缓存的同时,不会耗尽内存。

f878346cf9d0507c05dceacef3d18360.jpg

3、弱引用:非必须存活的对象,不管内存是否够用,下次GC一定回收。


弱引用是相对于强引用而言的,它是允许存在引用关联的情况下,能被垃圾回收的对象。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现只具有弱引用的对象的时候,不管当前的内存空间是否足够,垃圾回收器都会回收这个内存。

f7feb4e9ff9270c9413a861b7ba003b0.jpg

4、虚引用:等同于没有引用,对象被回收时会收到通知。


虚引用不会决定对象的生命周期,它提供一种确保对象被finalize以后,去做某些事情的机制。当垃圾回收期准备去回收一个对象的时候,如果发现他还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中,程序可以通过判断引用队列是否已经加入虚引用,来决定被引用对象是否要被垃圾回收器回收。然后,我们就可以在引用对象被回收之前执行一些必要的操作。所以,虚引用必须和引用队列一起使用,

f9ab37a202df322263f107849b7d011f.jpg

以上的分享还是比较官方,举个通俗例子,大家就会更容易理解。


强引用就好比电视剧中的男主角,怎么都死不了。


软引用就像女主角,虽有一段经历,还是没走到最后。


弱引用就是男二号,注定用来牺牲的。


虚引用就是路人甲了。


以上就是我对Java中4种引用对象的理解。有兴趣的小伙伴,可以更进一步去研究一下。


我是被编程耽误的文艺Tom,关注我,面试不再难!

9106b97c16b34d06af118b23d081cde9.gif

相关文章
|
3天前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
14 3
|
3天前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
16天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
15 4
|
1天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
1天前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
32 3
|
3天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
3天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
3天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
12 3
|
4天前
|
安全 Java 编译器
Java中String、StringBuilder和StringBuffer的区别
Java中String、StringBuilder和StringBuffer的区别