WeakReference是Java中的一个类,用于创建弱引用对象。在程序中,引用对象占据了内存空间,当引用对象不再被使用时,如果没有手动释放内存,这些对象将继续占据内存资源,可能导致内存泄漏的问题。WeakReference的出现就是为了解决这个问题。
WeakReference是一个泛型类,它可以包装任意类型的对象,并创建一个对该对象的弱引用。相对于强引用,弱引用具有更短的生命周期,并且在GC(垃圾回收)时容易被GC回收。这就意味着,当程序再次需要使用该对象时,如果该对象还存在,可以获取到,否则就需要重新创建。
WeakReference类有两个主要的构造器:WeakReference(T referent)和WeakReference(T referent
ReferenceQueue super T> queue)。前者创建一个纯粹的弱引用对象,后者创建一个弱引用对象,同时还可以指定一个引用队列,用于跟踪被GC回收的对象。
WeakReference类提供了一些方法来操作弱引用对象,比如get()方法用于获取弱引用对象所包装的对象,如果该对象已被GC回收,则返回null。除此之外,还有一个方法enqueue()用于将已被GC回收的对象放入引用队列中。引用队列是一个通过队列实现的FIFO数据结构,用于跟踪被GC回收的对象。
使用WeakReference的主要场景是缓存。当我们需要缓存一些对象时,如果使用强引用,当缓存对象不再被使用时,我们需要手动释放内存。但是使用弱引用,当缓存对象不再被使用时,GC会自动回收内存,避免了内存泄漏的问题。
下面是一个使用WeakReference的示例代码:
```
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
// 创建一个弱引用对象,包装一个字符串
WeakReference
World!");
// 打印弱引用对象所包装的字符串
System.out.println(weakReference.get()); // 输出:Hello
World!
// 手动触发GC
System.gc();
// 输出弱引用对象所包装的字符串,由于GC已回收该对象,输出为null
System.out.println(weakReference.get()); // 输出:null
}
}
```
在上面的代码中,我们创建了一个弱引用对象,包装了一个字符串"Hello
World!",然后通过get()方法获取到该字符串并打印。接着手动触发GC,再次通过get()方法获取到弱引用对象所包装的字符串,此时为null,说明该对象已被GC回收。
总结来说,WeakReference是Java中用于创建弱引用对象的类,它可以避免内存泄漏问题,特别适用于缓存等场景。通过get()方法可以获取到弱引用对象所包装的对象,而通过enqueue()方法可以将已被GC回收的对象放入引用队列中。