每天一个Java面试题——Java的四大引用是?

2024-08-06 10:52:47 浏览数 (2)

前言

在Java中,引用类型主要有四种:强引用、软引用、弱引用和虚引用。它们之间的区别主要体现在垃圾回收器对它们的处理方式上。本文分别介绍这四种引用类型,并给出相应的代码示例。

1. 强引用(Strong Reference)

强引用是最常见的引用类型,我们平时使用的普通对象引用就是强引用。只要对象具有强引用,垃圾回收器就永远不会回收它。即使内存不足,也会导致程序抛出OutOfMemoryError异常。

代码语言:javascript复制
Object obj = new Object(); // 强引用

2. 软引用(Soft Reference)

软引用是一种比强引用稍微弱一些的引用类型。只有在系统将要发生内存溢出之前,才会被垃圾回收器回收。如果内存足够,垃圾回收器就不会回收它。软引用通常用于实现内存敏感的缓存。

代码语言:javascript复制
import java.lang.ref.SoftReference;

public class SoftReferenceDemo {
    public static void main(String[] args) {
        SoftReference<Object> softRef = new SoftReference<>(new Object()); // 软引用
        System.out.println("软引用:"   softRef.get());
        System.gc(); // 提示JVM进行垃圾回收
        System.out.println("软引用:"   softRef.get());
    }
}

3. 弱引用(Weak Reference)

弱引用是一种比软引用更弱的引用类型。只要垃圾回收器发现它,就会立即回收。弱引用主要用于实现规范的映射关系。

代码语言:javascript复制
import java.lang.ref.WeakReference;

public class WeakReferenceDemo {
    public static void main(String[] args) {
        WeakReference<Object> weakRef = new WeakReference<>(new Object()); // 弱引用
        System.out.println("弱引用:"   weakRef.get());
        System.gc(); // 提示JVM进行垃圾回收
        System.out.println("弱引用:"   weakRef.get());
    }
}

4. 虚引用(Phantom Reference)

虚引用是四种引用类型中最弱的一种。它与垃圾回收过程没有直接关系,主要用于跟踪对象被垃圾回收器回收的活动。必须和引用队列一起使用。

代码语言:javascript复制
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceDemo {
    public static void main(String[] args) {
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue); // 虚引用
        System.out.println("虚引用:"   phantomRef.get());
        System.gc(); // 提示JVM进行垃圾回收
        PhantomReference<Object> clearedPhantomRef = (PhantomReference<Object>) referenceQueue.poll();
        System.out.println("虚引用:"   clearedPhantomRef.get());
    }
}

区别

1、生命周期:强引用的对象一直存活直到显式地被回收;软引用的对象在内存不足时可以被回收;弱引用的对象在下一次垃圾回收时会被回收;虚引用的对象对对象的生命周期没有任何影响。

2、垃圾回收:强引用阻止垃圾回收;软引用允许垃圾回收在内存不足时进行;弱引用在垃圾回收时总是被回收;虚引用对垃圾回收没有直接影响,但可以用来得知对象何时被回收。

3、用途:强引用用于普通的对象引用;软引用适用于内存敏感的缓存;弱引用适用于映射表,可以自动清理不再使用的对象;虚引用主要用于跟踪对象的回收。

4、访问对象:强引用可以直接访问对象;软引用和弱引用需要通过get()方法访问对象,如果对象已经被回收,则返回null;虚引用无法直接访问对象,get()方法总是返回null。

小结

强引用、软引用、弱引用和虚引用之间的主要区别在于它们对垃圾回收器的抵抗力。强引用最强,软引用次之,弱引用再次之,虚引用最弱。根据实际需求选择合适的引用类型,可以提高程序的性能和内存管理效率。

0 人点赞