跳转到主内容
思享编程网:思考分享,玩转编程世界!

Java中的WeakReference到底是个啥?怎么用?

嘿,小伙伴们,今天咱们来聊聊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 +
                            

相关文章