Java四种引用之间的区别?

写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

强度对比:
强引用 > 软引用 > 弱引用 > 虚引用

强引用就是 Java 代码中类似 Object obj = new Object(); 这样的引用。
JDK1.2引入后面 3 个引用的意义在于更方便的进行垃圾回收。

补充

强引用

Java代码中最常见到的。

Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
obj = null;  //一般情况下,Java 对象生命周期结束后 JVM 会自动发现无效的Java 对象并进行垃圾回收,当我们手动将对象引用指向 null,可以加速 GC 的过程

强引用只要还存在,垃圾收集器永远不会回收掉被引用的对象。

除非考虑到垃圾回收,一般情况下我们只需要使用强引用就行了。

软引用

软引用关联着的对象,生命周期持续到系统将要发生 OOM 之前。

在系统将要发生 OOM 之前,就会将会把这些对象列进回收范围之中进行第二次回收。 如果这次回收还没有足够的内存,オ会抛出 OOM 。

java.lang.ref.SoftReference类表示软引用(JDK1.2+)

使用

Object obj = new Object();
SoftReference<Object> softObj = new SoftReference<>(obj);
Object o = softObj.get();

弱引用

弱引用关联的对象生命周期持续到下一次垃圾收集发生之前。

当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

java.lang.ref.WeakReference类表示软引用(JDK1.2+)

使用

Object obj = new Object();
WeakReference<Object> weakObj = new WeakReference<>(obj);
Object o = weakObj.get();

虚引用

虚引用是最弱的一种引用关系。

虚引用的存在,完全不会对一个对象的生存时间构成影响,但同样也无法通过虚引用来取得一个对象实例。

为一个对象关联虚引用的唯一目的就是能在这个对象被收集器回收时收到个系统通知

虚引用要和引用队列一起使用。

java.lang.ref.PhantomReference类表示虚引用(JDK1.2+)

使用

ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantomObj = new PhantomReference<>(new String("hello"), queue);
System.out.println(phantomObj.get());
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
### 回答1: Java 8和Java 17之间有一些主要的差异,其中包括:Java 8引入了新的语言特性,如Lambda表达式,新的日期和时间API,Streams API,新的I / O API,以及其他功能。而Java 17则更多地关注于性能和安全性的改进,并且引入了新的语言特性,如模块化,局部类型推断,新的数字类型,以及其他功能。 ### 回答2: JAVA 8与JAVA 17是两个不同版本的Java开发语言。它们之间存在一些详细的区别。 首先,JAVA 8是Java的第八个主要版本,于2014年发布。它引入了许多重大的新特性和改进,其中最显著的是Lambda表达式和函数式编程的支持。Lambda表达式使得在处理集合和数据流时更加方便和灵活。它还引入了Stream API来简化集合操作。此外,JAVA 8还提供了新的日期和时间API,增强了并发编程能力,并通过默认方法来支持接口的扩展。 而JAVA 17则是Java的第十七个主要版本,于2021年发布。JAVA 17是JAVA 8之后发布的几个版本中的最新版本。与JAVA 8相比,JAVA 17引入了更多的新特性和改进。其中,最显著的是引入了基于模块化的Java平台模块系统(JPMS)。这个系统允许开发者将Java应用程序划分为一系列互相依赖的模块,并提供了更好的模块化管理和隔离性。 此外,JAVA 17还引入了一些其他的新特性,比如垃圾回收器的改进、可嵌入式的垃圾回收器接口、改进的Switch语句、新的JVM统计API等等。 总的来说,JAVA 8是JAVA的一个重要里程碑,引入了许多新特性和改进,而JAVA 17则是在此基础上进一步发展和完善,提供了更多的新特性和改进,使得Java编程更加方便、高效和可靠。它们之间的具体区别在于引入的新特性、改进的功能以及针对性能和开发效率的优化。 ### 回答3: Java 8和Java 17是Java的两个版本,它们之间有许多详细区别: 1. 语法改进:Java 8引入了许多新的语法和特性,如Lambda表达式、函数式接口、方法引用等。而Java 17在Java 8的基础上进一步改进了语法,并添加了新的特性,如模式匹配、提取式方法、记录类等。 2. 性能改进:Java 8引入了许多性能改进,如流式处理、并行流、本地日期时间API等。而Java 17在性能方面也进行了改进,通过JEP 388引入了垃圾回收器和垃圾收集器接口的改进,提高了垃圾回收的效率和性能。 3. 库的改进:Java 8中引入了新的库,如新的日期时间库、CompletableFuture、Option等。而Java 17在库的改进方面也进行了一些更新,如JEP 411引入了新的集合工具类,提供了更多的集合操作方法。 4. 安全性:Java 8引入了新的安全性特性,如安全性增强的键库、安全性增强的随机数生成器等。而Java 17在安全性方面也进行了改进,通过JEP 391提供了更强的加密支持,增强了网络和安全方面的功能。 5. 兼容性:Java 8和Java 17是不同的版本,因此它们之间也存在一定的兼容性差异。一些在Java 8中编写的代码可能需要进行一些调整才能在Java 17中正常运行。 总的来说,Java 8和Java 17之间有许多详细区别Java 17在Java 8的基础上进行了改进和更新,提供了更多的语法特性、性能优化、库改进和安全性增强,同时也存在一定的兼容性差异。这些差异使得Java 17成为了一个更加先进和功能丰富的Java版本。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值