Java中的引用类型以及区别的特点

在java红有四种引用类型,分别是强引用、软引用、弱引用、虚引用。他们的主要区别是控制对象生命周期和垃圾回收的行为

1. 强引用(Strong Reference)

  • 特点:最常见的引用类型。只要强引用存在,对象永远不会被垃圾回收。

  • 使用场景:日常开发中的普通对象引用。

  • 代码示例:

java 复制代码
Object obj = new Object(); // 强引用
obj = null; // 手动断开引用后,对象可被回收

2. 软引用(Soft Reference)

  • 特点:内存不足时会被回收(OOM 前触发)。适合实现内存敏感缓存。

  • 使用场景:缓存图片、临时数据等。

  • 代码示例:

java 复制代码
import java.lang.ref.SoftReference;

// 创建强引用对象
String strongRef = new String("Hello, Soft Reference!");
// 包装为软引用
SoftReference<String> softRef = new SoftReference<>(strongRef);

strongRef = null; // 断开强引用

// 获取对象(内存充足时返回对象,不足时返回 null)
String value = softRef.get();
if (value != null) {
    System.out.println(value); // 输出: Hello, Soft Reference!
} else {
    System.out.println("Object has been collected");
}

3. 弱引用 (Weak Reference)

  • 特点:无论内存是否充足,下一次 GC 时立即回收。

  • 使用场景:实现弱关联(如 WeakHashMap 的键)。

  • 代码示例:

java 复制代码
import java.lang.ref.WeakReference;

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);

obj = null; // 断开强引用
System.gc(); // 触发 GC

// 弱引用对象会被回收
System.out.println(weakRef.get()); // 输出: null

4. 虚引用 (Phantom Reference)

  • 特点:

    • 无法通过 get() 获取对象(始终返回 null)。

    • 对象被回收时,通过 ReferenceQueue 收到通知。

  • 使用场景:跟踪对象被回收的时机(如资源清理)。

java 复制代码
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

ReferenceQueue<Object> queue = new ReferenceQueue<>();
Object obj = new Object();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);

obj = null; // 断开强引用
System.gc();

// 检查引用队列(对象回收后,虚引用会入队)
if (queue.poll() != null) {
    System.out.println("Object has been finalized and resources cleaned");
}

总之,他们的区别是,在内存回收的时机上不同,由上至下依次更容易被回收,强引用无法回收,可获取对象、软引用内存不足时回收,可获取对象、弱引用下一次GC时回收,可获取对象、虚引用下一次GC时被回收,无法获取对象

相关推荐
励志要当大牛的小白菜28 分钟前
ART配对软件使用
开发语言·c++·qt·算法
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
爱装代码的小瓶子3 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw4 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
Maybe_ch4 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王4 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
双力臂4045 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空5 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring