Java 中的弱引用类

Sheeraz Gul 2022年5月31日
Java 中的弱引用类

弱引用是一种强度不足以使对象保留在内存中的引用。本教程演示了 Java 中弱引用的使用。

Java 中的弱引用类

在 Java 中,java.lang.ref.WeakReference 类利用垃圾收集器来确定可达性,所以我们不需要自己做。Java 中的弱引用类有以下方法。

方法 描述
get() 此方法返回引用对象的所指对象。
clear() 该方法用于清除引用对象。
enqueue() 该方法用于将引用对象添加到队列中;该对象需要在队列中注册。
isEnqueued() 这个方法告诉引用对象是否已经入队;它可以是垃圾收集器或程序本身。

首先,让我们尝试一个简单的例子来实现 Java 弱引用类。

package delftstack;

import java.lang.ref.WeakReference;
public class Weak_Reference {
    public static void main(String[] args) {
        // creating a strong object
		Demo_Class Strong_Object = new Demo_Class();

        // creating a weak reference of demo_class
        WeakReference<Demo_Class> Weak_Object = new WeakReference<>(Strong_Object);
        System.out.println("Call the show info function using  the strong object");
        Strong_Object.Show_Info();

        System.out.println("Setting the object to null");
        Strong_Object = null;
        Strong_Object = Weak_Object.get();

        System.out.println( "Call the show info function using  the weak object");
        Strong_Object.Show_Info();
    }
}
class Demo_Class {
    void Show_Info() {
        System.out.println(">>This is the info from demo class<<");
    }
}

上面的代码创建了一个 Demo_Class 的强对象和一个同一个类的弱对象,并调用 Show_Info 函数。见输出:

Call the show info function using  the strong object
>>This is the info from demo class<<
Setting the object to null
Call the show info function using  the weak object
>>This is the info from demo class<<

现在让我们尝试使用上述方法的示例。

package delftstack;

import java.lang.ref.WeakReference;
public class Weak_Reference {
    public static void main(String[] args) {
        Demo_Class Strong_Object = new Demo_Class();
        WeakReference<Demo_Class> Weak_Object = new WeakReference<Demo_Class>(Strong_Object);

        System.out.println( "Retrieve object from weak reference using get()");
        Weak_Object.get().Show_Info();

        System.out.println( "queue object using enqueue()");
        System.out.println(Weak_Object.enqueue());

        System.out.println( "Check if reference is queued using isEnqueued()");
        System.out.println(Weak_Object.isEnqueued());
    }
}
class Demo_Class {
    void Show_Info() {
        System.out.println("Show_Info() from Demo_Class is called.");
    }
}

上面的代码在 Demo_Class 的弱对象上使用了上面描述的所有方法。见输出:

Retrieve object from weak reference using get()
Show_Info() from Demo_Class is called.
queue object using enqueue()
false
Check if reference is queued using isEnqueued()
false
Author: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook