每日一道面试题之Java中都有哪些引用类型?

简介: 每日一道面试题之Java中都有哪些引用类型?

在 Java 中,引用类型指向的数据在堆中分配,而基本类型的变量和对象的引用变量存储在栈内存中,但引用类型实际的对象存储在堆内存中。

Java 中有以下四种引用类型

强引用(Strong Reference):

Java中默认声明的就是强引用,它是最常用的引用类型只要强引用存在,那么垃圾回收器将永远不会回收被引用的对象。如果想被回收,可以将对象置为null。

比如,使用 new关键字创建的对象,所产生的引用就是强引用,例如:

// 强引用
Object obj = new Object();

软引用(Soft Reference):

内存足够的时候,软引用不会被回收,软引用在系统内存不够时,才会被垃圾回收器回收。

当垃圾回收器决定要回收内存时,只会回收软引用对象所指向的堆内存对象,并且只有在内存不足时才会进行回收,如果回收了软引用对象之后仍然没有足够的内存,就会出现内存溢出异常。例如:

// 软引用
SoftReference<Object> softRef = new SoftReference<Object>(obj); 

弱引用(Weak Reference):

弱引用不会阻止其所指向的对象被回收当垃圾回收器扫描到弱引用时,无论 JVM 内存是否足够,都会将引用指向的对象回收,例如:

 // 弱引用
WeakReference<Object> weakRef = new WeakReference<Object>(obj);

虚引用(Phantom Reference):

最弱的引用类型虚引用不能单独使用,必须和引用队列(ReferenceQueue)结合使用。

当垃圾回收器把一个对象回收时,如果这个对象有一个虚引用,则会将这个虚引用加入到与之关联的引用队列中程序可以通过判断引用队列中是否加入了引用,来判断被引用的对象是否将要被垃圾回收,这样可以在对象被回收之前采取一些必要的措施

例如:

// 虚引用
PhantomReference<Object> phantomRef = new PhantomReference<Object>(obj, queue); 

Java 中的引用类型都可以通过一些工厂方法创建,比如 java.lang.ref.SoftReferencejava.lang.ref.WeakReferencejava.lang.ref.PhantomReference,这些引用类型可以有效地管理内存,避免内存泄漏。

相关文章
|
4天前
|
SQL Java
java面试题笔试常见选择题大全含答案
java面试题笔试常见选择题大全含答案
|
4天前
|
SQL JavaScript Java
java程序员面试题大全含答案(2018--2019)
java程序员面试题大全含答案(2018--2019)
|
4天前
|
设计模式 开发框架 Java
java设计模式面试题大全含答案
java设计模式面试题大全含答案
|
4天前
|
缓存 安全 Java
Java线程面试题含答案
Java线程面试题含答案
|
3天前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
11 0
|
4天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案
|
4天前
|
存储 Java
java面试题大全带答案_面试题库_java面试宝典2018
java面试题大全带答案_面试题库_java面试宝典2018
|
4天前
|
SQL 前端开发 Java
2019史上最全java面试题题库大全800题含答案(面试宝典)(4)
2019史上最全java面试题题库大全800题含答案(面试宝典)
|
4天前
|
SQL Java 数据库连接
2019史上最全java面试题题库大全800题含答案(面试宝典)(2)
2019史上最全java面试题题库大全800题含答案(面试宝典)
|
4天前
|
存储 设计模式 Java
java实习生面试题_java基础面试_java面试题2018及答案_java面试题库
java实习生面试题_java基础面试_java面试题2018及答案_java面试题库