答:Exception 和 Error 都继承 Throwable。Exception 主要表示程序可能需要处理的异常;Error 通常表示运行环境或虚拟机遇到严重问题。是否必须捕获,不能只看“是不是 Exception”:RuntimeException 及其子类,以及 Error 及其子类,都属于非受检异常。
答:finalize() 是旧式对象终结机制的回调,不能保证何时执行,也不能保证程序退出前一定执行。Java 21 已把它标记为“弃用并计划移除”,不应再用于释放文件、连接或锁。它也不是 C++ 那种随对象销毁确定执行的析构函数。
答:fail-fast 指迭代器发现不允许的结构修改时,尽早抛出 ConcurrentModificationException。所谓 fail-safe 并不是 Java 集合规范中的统一分类:有人用它指快照迭代,也有人把弱一致迭代算进去。面试时应说明具体集合的迭代语义,不能一概说“安全失败就是复制集合”。
答:Iterator 是通用的向前迭代接口,主要提供 hasNext、next 和可选的 remove。ListIterator 面向 List,在此基础上增加向后遍历、获取游标位置,以及可选的 add、set。需要双向移动或在遍历中插入列表元素时,ListIterator 更合适。
答:equals() 定义两个对象在业务上是否相等,hashCode() 帮助哈希容器缩小查找范围。它们必须遵守同一条约定:如果两个对象 equals() 为 true,hashCode() 就必须相同;哈希值相同的对象则未必相等。重写 equals() 时通常也必须重写 hashCode()。
答:异常处理结束后,Exception 对象不会被立即销毁。如果它不再通过任何强引用路径可达,就可能在之后被垃圾收集;如果仍被日志队列、缓存、其他异常的 cause 或业务对象引用,它就继续存活。是否进入过 catch,不决定它的生命周期。
答:finally 是 try 语句的一部分,用来在控制流离开 try/catch 时执行收尾逻辑;finalize() 是已弃用的对象终结方法,执行时机没有保证。前者属于程序控制流程,后者属于不可靠的旧式资源清理机制,两者没有调用上的关联。
答:System.gc() 和 Runtime.getRuntime().gc() 都是在建议 JVM 尝试回收不再使用的对象。System.gc() 的作用等同于调用后者,但它们都不是“立即回收指定对象”的命令,也不能保证马上腾出多少内存或触发哪一种收集过程。
答:throw 是语句,用来在当前执行位置抛出一个异常对象;throws 写在方法或构造器声明上,说明它可能向调用方传播哪些异常。throw 会改变执行流程,throws 本身不创建异常,也不表示方法每次调用都一定抛异常。
答:在本文使用的 Java 21 常规启动模式下,启动入口应为 public static void main(String[] args),也可以把参数写成 String... args。将它改成 private 后,类本身可以编译,但标准 java 启动器不会把它作为合规入口来启动程序。