Java基础面试题, Java 中 final,finally 和 finalize 各有什么区别?
Java基础面试题, Java 中 final,finally 和 finalize 各有什么区别?
QA
Step 1
Q:: Java 中 final、finally 和 finalize 各有什么区别?
A:: 在 Java 中,final
、finally
和 finalize
是三个有不同用途的关键词。
1.
final``:
主要用于声明常量、方法和类。final
变量一旦赋值就不能再修改,final
方法不能被子类重写,final
类不能被继承。
2.
finally``:
finally
块用于处理异常情况,无论异常是否被捕获或者是否抛出,finally
块中的代码总会执行。它通常用于关闭资源,比如文件、数据库连接等,以确保资源不会泄露。
3.
finalize``:
finalize
是一种方法,用于在对象被垃圾回收器回收之前进行清理工作。尽管在 Java 9
以后它被废弃了,但是在 Java 早期版本中被用作释放非 Java 资源(如文件句柄)的最后一道防线。不过,依赖 finalize
不是推荐的做法,应该使用其他资源管理方式,比如 try-with-
resources 或者手动关闭资源。
Step 2
Q:: 什么是垃圾回收器(Garbage Collector),它是如何工作的?
A:: 垃圾回收器(Garbage Collector,GC)是 Java 中内存管理的核心机制之一。它负责自动回收不再被引用的对象的内存,避免内存泄漏。GC 的工作过程包括标记、清除和压缩阶段:
1.
标记阶段:GC 会遍历所有对象,标记出那些仍然在使用的对象。
2.
清除阶段:GC 会清理未被标记的对象的内存,使之可以被再次分配使用。
3.
压缩阶段(可选):一些 GC 实现会对内存进行压缩,将存活的对象移到一起,从而减少内存碎片,提高内存分配的效率。
Java 中常见的垃圾回收器有 Serial GC、Parallel GC、CMS(Concurrent Mark-Sweep)GC 和 G1
GC。
Step 3
Q:: 在 Java 中,为什么推荐使用 try-with-
resources 来管理资源?
A:: 在 Java 7 引入的 try-with-
resources 语句可以自动管理资源的关闭,它与 try-finally
不同,资源在语句结束时自动关闭,无需显式调用 close()
方法。所有实现了 AutoCloseable
接口的资源都可以在 try-with-
resources 中使用。这种方式更安全,因为它保证了即使在异常情况下,资源也能正确地关闭,避免资源泄漏。
Step 4
Q:: 什么是 Java 中的堆(Heap)和栈(Stack)内存,它们的区别是什么?
A:: 堆(Heap)和栈(Stack)是 Java 内存管理的两个关键部分。
1.
堆内存用于存储对象实例。所有对象都在堆内存中分配,堆内存由垃圾回收器管理,程序员不需要显式地释放内存。
2.
栈内存用于存储方法调用和局部变量。每次方法调用时,栈帧被压入栈中,方法执行完后栈帧被弹出。栈内存的分配和释放是自动的,效率非常高。
堆内存比栈内存慢,因为对象的创建和销毁需要依赖垃圾回收器。