本篇文章汇总了Java面试过程中常见的笔试问题及其答案,涵盖了Java基础、面向对象特性、数据类型和容器、异常处理、多线程、内存模型、基本语法、高级特性以及集合框架等多个核心知识点。以下是对这些知识点的详细解读:
1. **面向对象的特征**:包括封装、继承、多态性。封装是将数据和操作数据的方法组合在一起,确保数据的安全性;继承使得子类可以从父类继承属性和行为,减少代码重复;多态性允许不同类型的对象对同一消息作出响应,提高了代码的灵活性。
2. **Java数据类型**:虽然String不是基本数据类型,但它是不可变的字符序列,常用于文本处理。int和Integer虽都表示整数,但Integer是包装类,提供了自动装箱和拆箱功能,而int是原始类型,性能更高。
3. **String与StringBuilder/ StringBuffer**:String是不可变的,修改会产生新的对象,而StringBuilder/ StringBuffer可变,提供高效地追加和修改操作。
4. **运行时异常与一般异常**:运行时异常是程序逻辑错误,需要开发者捕获或抛出;一般异常则包括编译时异常,如IOException,程序可以忽略,也可以处理。
5. **ArrayList, Vector, LinkedList**:ArrayList适合随机访问,插入和删除在末尾效率高;Vector与ArrayList类似,但线程安全;LinkedList适合频繁的插入和删除操作,但查找性能较差。
6. **Collection与Collections**:Collection是泛型接口,定义了集合的基本操作;Collections是静态工具类,提供了一些针对Collection的操作方法。
7. **&和&&运算符**:&是按位与,用于操作二进制位;&&是逻辑与,用于条件判断。
8. **HashMap与Hashtable**:HashMap是非同步的,性能更好,但不允许null键值对;Hashtable是同步的,且不允许null键值对。
9. **final, finally, finalize**:final修饰变量/方法表示不可变或结束,finally块常用于确保资源关闭;finalize是垃圾回收器调用的清理方法。
10. **sleep()与wait()**:sleep暂停当前线程,而wait使当前线程等待,直到被其他线程唤醒;它们都需要在synchronized上下文中使用。
11. **Overload与Override**:Overload是方法重载,根据参数列表差异提供多个方法;Override是方法重写,子类覆盖父类方法实现多态。
12. **Error与Exception**:Error是严重错误,通常由JVM引起;Exception是程序运行时异常,需要处理。
13. **同步与异步**:同步用于控制多个线程的执行顺序,如synchronized关键字;异步则允许并发执行,通过回调或Future/Promise机制完成。
14. **抽象类与接口**:抽象类可以包含实现代码,接口仅定义方法签名;抽象类可以继承类,接口可以多重继承。
15. **堆与栈**:堆是内存分配给所有对象的地方,栈是存放函数调用帧和局部变量的地方,两者管理方式和生命周期不同。
16. **Static Nested Class与Inner Class**:Static Nested Class独立于其外部类,有自己的生命周期;Inner Class依赖外部类实例存在。
17. **assert**:用于开发阶段检查条件,确保代码符合预期;生产环境默认禁用。
18. **垃圾收集(GC)**:Java自动管理内存,当对象不再被引用时,GC会回收内存,防止内存泄漏。
19. **运算符问题**:示例代码展示了短整型溢出的问题,以及Math.round()方法的使用,涉及类型转换和结果计算。
20. **Java语言特性**:Java没有关键字"goto",线程启动使用start()方法而非run(),并举例说明常见的运行时异常。
21. **接口继承关系**:接口可以继承接口,抽象类可以实现接口但不能继承实体类,实体类不能实现接口。
22. **集合接口继承关系**:List, Set, Map均继承自Collection接口,抽象方法的属性讨论了static、native和synchronized修饰的限制。
23. **Array与String的length()方法**:数组和String都有length()方法,用于获取元素个数。
24. **Set的重复元素检查**:Set内部不允许重复元素,通常通过equals()方法判断元素是否相等,而非==操作符。