Java基础面试题(基础篇)

1. Java 为什么是“平台无关”的?

答: Java 源码先编译成字节码(.class),再由不同平台上的 JVM 执行。只要平台有对应 JVM,同一份字节码就能运行,这就是“Write Once, Run Anywhere”。

2. JDK、JRE、JVM 的区别是什么?

答:

  • JVM:执行字节码的虚拟机。
  • JRE:JVM + 核心类库,用于运行 Java 程序。
  • JDK:JRE + 编译工具(javac)+ 调试打包工具,用于开发 Java 程序。

一句话:开发用 JDK,运行最小可用 JRE,本质执行者是 JVM。

3. ==equals() 有什么区别?

答:

  • ==:比较的是地址(引用类型)或值(基本类型)。
  • equals():默认也是比较地址,但很多类(如 String)重写后比较内容。

面试延伸:重写 equals() 时通常要同时重写 hashCode(),否则在哈希容器中会出现逻辑不一致。

4. hashCode()equals() 为什么必须一起看?

答:HashMap/HashSet 中,先看 hashCode 定位桶,再用 equals 判断是否同一个对象。若两个对象 equals=truehashCode 不同,会导致同逻辑对象被重复存储。

5. String 为什么不可变?

答:

  • 便于字符串常量池复用,节省内存。
  • 天然线程安全。
  • 可作为哈希键(hashCode 稳定)。
  • 安全性更高(如类加载路径、网络地址不易被篡改)。

6. StringStringBuilderStringBuffer 的区别?

答:

  • String:不可变,频繁拼接性能差。
  • StringBuilder:可变,线程不安全,单线程拼接首选。
  • StringBuffer:可变,方法加同步锁,线程安全但慢一些。

7. 面向对象三大特性是什么?

答:

  • 封装:隐藏实现细节,暴露必要接口。
  • 继承:提高代码复用,体现“is-a”关系。
  • 多态:同一父类引用调用子类实现,提升扩展能力。

8. 重载(Overload)和重写(Override)区别?

答:

  • 重载:同类中方法名相同、参数列表不同,编译期多态。
  • 重写:子类覆盖父类同签名方法,运行期多态。

重写规则常问:返回值协变、访问权限不能更严格、异常范围不能更大。

9. 抽象类和接口怎么选?

答:

  • 抽象类适合“有共性实现”的父类模型。
  • 接口适合定义“能力规范”,强调解耦。

实践里常见:核心骨架用抽象类,可插拔能力用接口。

10. final 关键字有哪些用法?

答:

  • final 变量:值不能再改。
  • final 方法:不能被重写。
  • final 类:不能被继承(如 String)。

11. static 有什么特点?

答: static 成员属于类而不属于对象,可通过类名直接访问;静态方法不能直接访问实例成员,因为它在对象创建前就可调用。

12. Java 异常体系怎么回答更完整?

答:

  • Throwable 下分 ErrorException
  • Exception 分为受检异常(编译期强制处理)和运行时异常(RuntimeException 及子类)。

面试建议:业务代码优先抛有语义的自定义异常,避免无意义 throws Exception

13. try-catch-finally 的执行规则?

答: 正常情况下都会执行 finally(除非 JVM 退出、线程被强杀等极端场景)。即使 try/catchreturn,也会先执行 finally

14. ListSetMap 的核心区别?

答:

  • List:有序、可重复。
  • Set:通常不重复(依赖 equals/hashCode)。
  • Map:键值对,键唯一。

15. ArrayListLinkedList 如何选型?

答:

  • ArrayList:随机访问快,尾部追加高效,扩容有拷贝成本。
  • LinkedList:中间插入删除理论上快,但随机访问慢且节点额外内存开销大。

多数业务优先 ArrayList,除非明确高频中间插删且有迭代器定位。

16. HashMap 底层原理(JDK8)怎么说?

答: 数组 + 链表 + 红黑树。哈希冲突时先链表,链表长度到阈值且数组容量足够时树化,提高极端场景查询性能。

高频补充:负载因子默认 0.75,在空间和时间之间做折中。

17. 为什么重写 equals 必须重写 hashCode

答: 因为哈希容器先按 hashCode 分桶,再按 equals 判等。若逻辑相等对象哈希不同,会破坏去重与查找正确性。

18. 什么是泛型?有什么好处?

答: 泛型是参数化类型,主要作用:

  • 编译期类型检查,减少 ClassCastException
  • 消除强转,提高可读性。
  • 提高代码复用能力。

常问点:Java 泛型是“类型擦除”实现,运行时很多泛型信息会被擦除。

19. Object 类常用方法有哪些?

答:

  • toString():对象字符串表示。
  • equals():对象逻辑比较。
  • hashCode():哈希值。
  • getClass():运行时类型。
  • wait()/notify()/notifyAll():线程协作。
  • clone():对象拷贝(需配合 Cloneable)。

20. 深拷贝和浅拷贝区别?

答:

  • 浅拷贝:只复制对象本身,内部引用共享。
  • 深拷贝:递归复制引用对象,副本之间互不影响。

面试延伸:序列化方式可实现深拷贝,但要关注性能开销。

21. 反射是什么?优缺点?

答: 反射是在运行时动态获取类信息并操作字段/方法。

  • 优点:灵活、可扩展,框架中大量使用(Spring、MyBatis)。
  • 缺点:性能较直接调用差、可读性弱、破坏封装风险更高。

22. 注解(Annotation)常见用途?

答:

  • 生成文档(如 @Override)。
  • 编译检查。
  • 运行时配合反射做框架配置(IOC、AOP、参数校验等)。

23. 线程和进程的区别?

答:

  • 进程是资源分配的基本单位。
  • 线程是 CPU 调度的基本单位,同进程线程共享堆和方法区等资源。

24. synchronizedvolatile 的区别?

答:

  • volatile 保证可见性和有序性,不保证原子性。
  • synchronized 保证可见性、有序性和原子性(通过互斥锁)。

一句话:volatile 适合状态标记,synchronized 适合临界区保护。

25. sleep()wait() 的区别?

答:

  • sleep()Thread 的静态方法,不释放锁。
  • wait()Object 方法,必须在同步块中调用,调用后释放锁,等待 notify/notifyAll 唤醒。

面试快答模板(30秒版)

如果面试官让你简述“Java基础能力”,可以这样答:

Java 基础我会从四块来回答:
第一是语言核心,比如面向对象、重载重写、equals/hashCode、字符串与异常体系;
第二是集合框架,重点是 ArrayListHashMap 的底层机制和选型;
第三是泛型、反射、注解这些框架基础能力;
第四是并发入门,包括线程模型、synchronized/volatilewait/sleep 区别。
这些问题我不仅能解释概念,也能结合真实场景给出选型和避坑点。

总结

基础篇最重要的是:

  • 不只记概念,要能说“为什么这样设计”。
  • 不只会定义,要能说“实际怎么选型”。
  • 不只会背答案,要能接住“追问”。

把这 25 题讲顺,Java 基础面试的通过率会明显提高。