详解Java的四种引用方式及其区别
在Java中,引用通常被用来表示一个对象实例或者一个对象实例的地址信息,Java提供了四种引用方式,分别是强引用、软引用、弱引用和虚引用。本文将详细讲解这四种引用方式以及它们之间的区别。
1. 强引用(Strong Reference)
在Java中,最普通的引用是强引用(Strong Reference),它也是默认的引用类型。如果一个对象具有强引用,那么JVM就不会回收这个对象,即使在内存不足的情况下也不会回收。可通过 new
关键字来声明一个引用对象,它将被视为强引用。
示例代码:
Object obj = new Object(); // 强引用
2. 软引用(Soft Reference)
如果一个对象只具有软引用(Soft Reference),那么在内存不足的情况下,JVM可能会将这个对象回收。软引用对象可以通过 java.lang.ref.SoftReference
类来创建。
示例代码:
SoftReference<String> str = new SoftReference<>(new String("Soft Reference"));
3. 弱引用(Weak Reference)
如果一个对象只具有弱引用(Weak Reference),那么当垃圾回收器扫描到这个对象时,无论内存是否充足,都会将这个对象回收。弱引用对象可以通过 java.lang.ref.WeakReference
类来创建。
示例代码:
WeakReference<String> str= new WeakReference<>(new String("Weak Reference"));
4. 虚引用(Phantom Reference)
虚引用(Phantom Reference)是所有引用类型中最弱的一个。它可以用来跟踪对象被垃圾回收的状态,却不会对对象的生命周期产生影响,即无法使用虚引用来获取一个对象的引用,通过 java.lang.ref.PhantomReference
类来创建。
示例代码:
PhantomReference<String> str = new PhantomReference<>(new String("Phantom Reference"), referenceQueue);
5. 引用队列(Reference Queue)
引用队列(Reference Queue)是用来保存被回收的引用对象。在对象被垃圾回收器回收之前,引用会被加入到引用队列中,使用户可以知道它们何时被回收。引用队列可以通过调用 java.lang.ref.Reference
类的 get()
方法获取。
示例代码:
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
PhantomReference<String> str = new PhantomReference<>(new String("Phantom Reference"), referenceQueue);
Reference<? extends String> reference;
try {
reference = referenceQueue.remove();
} catch (InterruptedException e) {
e.printStackTrace();
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java的四种引用方式及其区别 - Python技术站