[Java、Android面试]_08_强软弱虚四种引用及应用场景
本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。
整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注+收藏
文章目录
- 1. 强引用(默认的引用形式)
- 2. 软引用
- 3. 弱引用
- 4. 虚引用
引用在java中是非常常见的,四种应用概况如下:
1. 强引用(默认的引用形式)
Andorid中默认的引用形式,当一个对象被强引用时,GC不会回收该对象,只有当该引用被释放后,对象才能被释放。
1.String str = "Hello World";
应用场景:
绝大部分都是强引用。
2. 软引用
GC可能会回收只被软引用的对象,但不一定会被回收。软引用常被用于缓存数据,当
内存不足时,回收部分缓存数据,避免OutOfMemory.
软引用在内存充足时,不会被回收,内存不足时会被回收,通常用来做数据缓存。
1.SoftReference<Bitmap> softRef = new SoftReference<>(bitmap);
应用场景:
数据缓存。
3. 弱引用
弱引用是一种比软引用更弱的引用类型。弱引用指向的对象在下一次垃圾回收时会被回收。弱引用通常用于解决内存泄漏问题,特别是处理容易造成循环引用的场景。当对象只被弱引用指向时,垃圾回收器会更容易回收该对象。
1.WeakReference<Context> weakRef = new WeakReference<>(context);
在下一次垃圾回收时,无论内存是否足够,都会被回收;
应用场景:
一般用于避免内存泄漏;如,使用弱引用来注册回调函数,避免回调函数持
有的强应用导致无法被回收。
4. 虚引用
虚引用是最弱的引用类型。虚引用的存在主要是为了监控对象被垃圾回收的过程。虚引用无法通过get()方法获取到对象的实例,而只能通过PhantomReference类提供的相关方法来进行操作。在垃圾回收器准备回收一个对象时,会将其放入引用队列中,通过监听引用队列,可以了解到对象被回收的时机。
1.ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
2.PhantomReference<MyObject> phantomRef = new PhantomReference<>(myObject, queue);
应用场景:
用于跟踪对象的销毁过程,虚引用必须与引用队列一起使用,以便在对象被回收时得到通知。