嘿,小伙伴们,今天咱们来聊聊Java中的一个有趣的概念——WeakReference。你是不是也好奇过,这个在面试中能加分的技术到底是个啥?怎么用?别急,看完这篇文章,你就能对这些疑问有个清晰的答案了。
什么是WeakReference?
首先,咱们得明白,Java中的对象都是在Heap里创建的。当GC运行时,如果没有引用指向某个对象,那么这个对象就会被回收,以腾出内存空间。简单来说,一个对象被回收需要满足两个条件:1)没有任何引用指向它;2)GC被运行。
手动置空对象的烦恼
在写代码的时候,我们常常需要手动将引用置空,以保证对象在下次GC运行时被回收。比如:
Object c = new Car();
c = null;
但是,手动置空对象是一件既繁琐又违背自动回收理念的事情。对于简单对象来说,Java会自动处理引用的回收。但是,对于缓存中的对象,情况就不同了。因为缓存中的对象是程序运行所需要的,所以只要程序在运行,缓存中的引用就不会被GC回收。这会导致内存占用越来越大,而对象又无法被自动回收。
WeakReference的登场
为了解决这个问题,Java引入了WeakReference。它是一种特殊的引用,当对象仅被WeakReference指向,而没有其他StrongReference指向时,如果GC运行,那么这个对象就会被回收。它的语法如下:
WeakReference weakCar = new WeakReference(car);
要获取WeakReference引用的对象,需要先判断它是否已经被回收:
weakCar.get();
如果此方法返回空,那么说明WeakReference指向的对象已经被回收了。
实战案例
下面是一个简单的例子,展示了WeakReference的使用:
package weakreference;
/**
* @author wison
*/
public class Car {
private double price;
private String colour;
public Car(double price, String colour){
this.price = price;
this.colour = colour;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
public String toString(){
return colour +
