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