【面试题精讲】Java中的五种引用类型

2023-11-02 09:50:54 浏览数 (2)

!! 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址[1]

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。[2]

1. 什么是引用类型?

引用类型是指在 Java 中,用于引用(指向)某个对象的类型。Java 中共有五种引用类型,包括强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)和自定义引用类型。

2. 为什么需要引用类型?

Java 中的对象都是通过引用指向的,而不是直接操作对象本身。引用类型的存在可以帮助我们更灵活地管理内存,解决对象的生命周期管理问题。不同类型的引用可以根据需求来决定对象是否活跃,是否可以被垃圾回收。

3. 引用类型的实现原理

3.1 强引用(Strong Reference)
  • 强引用是最常见的引用类型,使用最普遍的引用方式。通过 new操作符创建的对象默认就是强引用。
  • 强引用的对象在任何时间都不会被垃圾回收器回收,只有在没有任何强引用指向这个对象时,才会被回收。
  • 强引用的对象会一直保存在内存中,直到程序结束或者手动置空。
  • 强引用的使用场景:大部分的对象都是通过强引用来引用的,如普通的对象引用和静态变量引用。
3.2 软引用(Soft Reference)
  • 软引用是比弱引用强一点的引用类型。通过软引用创建的对象在内存足够的情况下不会被垃圾回收器回收,只有在内存不够时才会被回收。
  • 当内存空间不足时,垃圾回收器会回收软引用关联的对象,以释放内存,以保证系统的健壮性。
  • 软引用的使用场景:适合做缓存、图片加载等场景,可以在内存不足时释放一些非必要的对象,以避免内存溢出。
3.3 弱引用(Weak Reference)
  • 弱引用是比软引用更弱的引用类型。通过弱引用创建的对象在任何时候都可能被垃圾回收器回收。
  • 只要垃圾回收器发现了某个对象只有弱引用指向它,就会立即回收这个对象。弱引用被垃圾回收时,Java 虚拟机会自动把这个弱引用加入到与之关联的 ReferenceQueue 队列中。
  • 弱引用的使用场景:适合一些非关键的缓存场景,当需要立即释放对象内存时,可以使用弱引用。
3.4 虚引用(Phantom Reference)
  • 虚引用是 Java 中最弱的引用类型。通过虚引用创建的对象在任何时候都可能被垃圾回收器回收。
  • 虚引用的主要目的是在对象被垃圾回收器回收时收到一个系统通知,通过虚引用关联的 ReferenceQueue 来实现。
  • 虚引用本身并不能通过它访问到对象,因此虚引用必须和引用队列(ReferenceQueue)一起使用。
  • 虚引用的使用场景:主要用于管理直接内存映射的释放,如 NIO 中的 DirectByteBuffer。
3.5 自定义引用类型

除了上述四种常见的引用类型外,我们也可以根据自己的需求定义自己的引用类型。自定义引用类型可以根据实际情况来管理对象的生命周期,实现更加灵活的引用策略。

4. 引用类型的使用示例

下面以软引用为例,来展示引用类型的使用示例:

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

public class ReferenceExample {
    public static void main(String[] args) {
        String str = new String("Hello World");
        SoftReference<String> softReference = new SoftReference<>(str);
        str = null; // 手动置空强引用
        System.out.println(softReference.get()); // 输出:Hello World
    }
}

5. 引用类型的优点

  • 可以帮助我们更灵活地管理内存,解决对象的生命周期管理问题。
  • 不同类型的引用可以根据需求来决定对象是否活跃,是否可以被垃圾回收。

6. 引用类型的缺点

  • 过度使用引用类型可能导致内存泄漏和性能问题,需要根据具体情况和需求来选择适当的引用类型。

7. 引用类型的使用注意事项

  • 需要根据具体场景选择合适的引用类型,避免内存泄漏和性能问题。
  • 当使用软引用、弱引用和虚引用时,需要结合 ReferenceQueue 来实现更灵活的引用策略。

8. 总结

引用类型是 Java 中用于引用对象的类型,包括强引用、软引用、弱引用、虚引用和自定义引用类型。每种引用类型在对象被垃圾回收的时机和方式上略有区别,可以根据需求选择合适的引用类型来管理对象的生命周期。引用类型可以帮助我们更灵活地管理内存,但过度使用可能导致内存泄漏和性能问题,需谨慎使用。

写在最后

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。[3]

学习建议

这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。

参考资料

[1]

首发博客地址: https://blog.zysicyj.top/

[2]

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。: https://store.amazingmemo.com/chapterDetail/1685324709017001

[3]

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。: https://store.amazingmemo.com/chapterDetail/1685324709017001

本文由 mdnice 多平台发布

0 人点赞