前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一个Java面试题——Java的四大引用是?

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

作者头像
灬沙师弟
发布2024-08-06 10:52:47
990
发布2024-08-06 10:52:47
举报
文章被收录于专栏:Java面试教程

前言

在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。

小结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 1. 强引用(Strong Reference)
      • 2. 软引用(Soft Reference)
        • 3. 弱引用(Weak Reference)
          • 4. 虚引用(Phantom Reference)
            • 区别
            • 小结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档