当前位置: 首页 > news >正文

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

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

  1. 强引用(Strong Reference)

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

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

  • 代码示例:

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

  2. 软引用(Soft Reference)

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

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

  • 代码示例:

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 的键)。

  • 代码示例: 

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 收到通知。

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

    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时被回收,无法获取对象

    http://www.dtcms.com/a/224252.html

    相关文章:

  • 第十四章 MQTT订阅
  • 【数据结构】字符串操作整理(C++)
  • MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
  • Spring Cache核心原理与快速入门指南
  • Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)
  • day61—DFS—省份数量(LeetCode-547)
  • 27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践
  • 前端八股HTTP和https大全套
  • Socket编程之TCP套件字
  • 【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
  • 【Hot 100】55. 跳跃游戏
  • 如何获得Python的requirement.txt
  • C#数字金额转中文大写金额:代码解析
  • 流媒体基础解析:从压缩到传输的基本了解
  • springMVC-9数据格式化
  • JavaScript 模板字面量标签函数:解锁字符串处理的终极武器
  • Kafka数据怎么保障不丢失
  • Git入门到精通:30分钟掌握核心技巧
  • 《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》​
  • Excel快捷键
  • STM32 串口通信①:USART 全面理解 + 代码详解
  • 2025年- H62-Lc170--34.在排序数组中查找元素的第一个和最后一个位置(2次二分查找,标记向左寻找,标记向右寻找)--Java版
  • Visual Stuido笔记:C++二进制兼容性之间的兼容性
  • 六.MySQL增删查改
  • Day41
  • 2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版
  • 112 Gbps 及以上串行链路的有效链路均衡
  • 在Spring Boot中集成Redis进行缓存
  • Linux.docker.k8s基础概念
  • 设计模式——建造者设计模式(创建型)