跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 核心面试题与答案详解

Java 面试涉及基础语法、集合、并发、Web 及框架等多个维度。内容涵盖 JDK 与 JRE 区别、equals 与 hashCode 机制、IO 流分类、线程状态转换、锁升级原理以及 HashMap 实现细节等高频考点。通过实战代码示例与对比分析,帮助开发者理清概念,掌握核心知识点,为技术面试做好充分准备。

指针猎手发布于 2026/3/16更新于 2026/8/2237 浏览
Java 核心面试题与答案详解

Java 基础

1. JDK 和 JRE 有什么区别?

JDK(Java Development Kit)是开发工具包,提供了开发环境和运行环境;JRE(Java Runtime Environment)是运行环境,仅包含运行所需组件。 简单来说,JDK 包含了 JRE,还多了编译器和调试工具。如果只需运行程序,安装 JRE 即可;若要编写代码,则必须安装 JDK。

2. == 和 equals 的区别是什么?

== 解读 基本类型比较值是否相同,引用类型比较内存地址是否一致。

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x == y); // true,指向常量池同一对象
System.out.println(x == z); // false,new 开辟新空间
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

equals 解读 默认情况下 equals 等同于 ==,但 String、Integer 等类重写了该方法进行值比较。

class Cat {
    private String name;
    public Cat(String name) { this.name = name; }
}
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false,未重写时比较引用

String 类源码中实现了字符数组比对,因此返回 true。

3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对。hashCode 相等只说明哈希值相同,可能存在哈希冲突,此时 equals 仍需判断内容。

String str1 = "通话";
String str2 = "重地";
// 执行结果:str1.hashCode() 与 str2.hashCode() 可能相同,但 equals 为 false

4. final 在 Java 中有什么作用?

  • 修饰类:该类不能被继承。
  • 修饰方法:该方法不能被子类重写。
  • 修饰变量:成为常量,初始化后不可修改。

5. Java 中的 Math.round(-1.5) 等于多少?

等于 -1。Math.round 采用四舍五入逻辑,负数 0.5 直接舍弃,正数 0.5 向上取整。

6. String 属于基础的数据类型吗?

不属于。Java 有 8 种基本类型(byte, boolean, char, short, int, float, long, double),String 是对象。

7. Java 中操作字符串都有哪些类?它们之间有什么区别?

主要有 String、StringBuffer、StringBuilder。

  • String:不可变对象,每次修改生成新对象。
  • StringBuffer:可变,线程安全,性能略低。
  • StringBuilder:可变,非线程安全,单线程下性能更高。 频繁修改字符串建议使用 StringBuilder。

8. String str="i"与 String str=new String("i")一样吗?

不一样。前者分配在常量池,后者在堆内存创建新对象。

9. 如何将字符串反转?

使用 StringBuilder 或 StringBuffer 的 reverse() 方法。

StringBuilder sb = new StringBuilder();
sb.append("abcdefg");
System.out.println(sb.reverse()); // gfedcba

10. String 类的常用方法有哪些?

包括 indexOf(), charAt(), replace(), trim(), split(), getBytes(), length(), toLowerCase(), toUpperCase(), substring(), equals() 等。

11. 抽象类必须要有抽象方法吗?

不需要。抽象类可以没有抽象方法,但不能实例化。

12. 普通类和抽象类有哪些区别?

  • 普通类可包含具体方法,抽象类可包含抽象方法。
  • 抽象类不能直接 new,普通类可以。

13. 抽象类能使用 final 修饰吗?

不能。final 禁止继承,abstract 要求继承,二者矛盾。

14. 接口和抽象类有什么区别?

  • 实现方式:类继承抽象类用 extends,实现接口用 implements。
  • 构造函数:抽象类有,接口无。
  • 数量限制:类只能继承一个抽象类,但可实现多个接口。
  • 访问修饰:接口方法默认为 public,抽象类方法任意。

15. Java 中 IO 流分为几种?

按功能分输入流和输出流;按类型分字节流和字符流。字节流处理 8 位数据,字符流处理 16 位字符。

16. BIO、NIO、AIO 有什么区别?

  • BIO:同步阻塞 IO,传统模式,并发能力低。
  • NIO:同步非阻塞 IO,基于 Channel 和多路复用。
  • AIO:异步非阻塞 IO,基于事件和回调机制。

17. Files 的常用方法都有哪些?

exists(), createFile(), createDirectory(), delete(), copy(), move(), size(), read(), write() 等。

容器

18. Java 容器都有哪些?

主要分为 Collection 和 Map 两大类。

  • Collection:List (ArrayList, LinkedList, Vector), Set (HashSet, TreeSet)
  • Map:HashMap, TreeMap, ConcurrentHashMap

19. Collection 和 Collections 有什么区别?

Collection 是集合接口,Collections 是包装类,提供排序等静态工具方法。

20. List、Set、Map 之间的区别是什么?

  • List:有序,允许重复。
  • Set:无序(HashSet),不允许重复。
  • Map:键值对存储,Key 唯一。

21. HashMap 和 Hashtable 有什么区别?

  • null 支持:HashMap 允许 key/value 为 null,Hashtable 不允许。
  • 线程安全:Hashtable 线程安全,HashMap 非线程安全。
  • 推荐:单线程用 HashMap,多线程用 ConcurrentHashMap。

22. 如何决定使用 HashMap 还是 TreeMap?

需要快速插入删除选 HashMap;需要对 Key 有序遍历选 TreeMap。

23. 说一下 HashMap 的实现原理?

基于 Hash 算法。put 时计算 hash 值存入 bucket。hash 冲突时使用链表或红黑树存储。冲突少用链表,多时转红黑树。

24. 说一下 HashSet 的实现原理?

底层基于 HashMap,利用 HashMap 的 key 唯一性来保证元素不重复。

25. ArrayList 和 LinkedList 的区别是什么?

  • 结构:ArrayList 是动态数组,LinkedList 是双向链表。
  • 随机访问:ArrayList 快,LinkedList 慢。
  • 增删:非首尾位置 LinkedList 更快,因为无需移动数组元素。

26. 如何实现数组和 List 之间的转换?

  • 数组转 List:Arrays.asList(array)
  • List 转数组:list.toArray()

27. ArrayList 和 Vector 的区别是什么?

Vector 线程安全(synchronized),扩容翻倍;ArrayList 非线程安全,扩容 50%,性能更优。

28. Array 和 ArrayList 有何区别?

Array 可存基本类型,大小固定;ArrayList 只能存对象,大小动态扩展。

29. 在 Queue 中 poll() 和 remove() 有什么区别?

poll() 返回 null 表示空队列,remove() 抛出异常。

30. 哪些集合类是线程安全的?

Vector, Hashtable, Stack。JDK 1.5 后推荐使用 concurrent 包下的类,如 ConcurrentHashMap。

31. 迭代器 Iterator 是什么?

用于遍历 Collection 的标准接口,取代了 Enumeration,支持移除元素。

32. Iterator 怎么使用?有什么特点?

Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String obj = it.next();
}

特点:遍历时若集合被修改会抛出 ConcurrentModificationException。

33. Iterator 和 ListIterator 有什么区别?

ListIterator 专用于 List,支持双向遍历及增删改操作。

34. 怎么确保一个集合不能被修改?

使用 Collections.unmodifiableCollection() 创建只读视图。

多线程

35. 并行和并发有什么区别?

并行是多核同时处理;并发是单核时间片轮转,逻辑上同时。

36. 线程和进程的区别?

进程是资源分配单位,线程是 CPU 调度单位。一个进程可包含多个线程。

37. 守护线程是什么?

后台服务线程,如垃圾回收线程。主线程结束时,守护线程随之结束。

38. 创建线程有哪几种方式?

  1. 继承 Thread 类
  2. 实现 Runnable 接口
  3. 实现 Callable 接口

39. 说一下 runnable 和 callable 有什么区别?

Callable 有返回值且可抛异常,Runnable 无返回值。

40. 线程有哪些状态?

NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。

41. sleep() 和 wait() 有什么区别?

  • sleep() 属于 Thread,不释放锁;wait() 属于 Object,释放锁。
  • sleep() 自动恢复,wait() 需 notify 唤醒。

42. notify() 和 notifyAll() 有什么区别?

notify() 唤醒一个等待线程,notifyAll() 唤醒所有。

43. 线程的 run() 和 start() 有什么区别?

start() 启动新线程执行 run(),run() 只是普通方法调用。

44. 创建线程池有哪几种方式?

常见工厂方法:newSingleThreadExecutor, newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool 等。最底层是 ThreadPoolExecutor。

45. 线程池都有哪些状态?

RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。

46. 线程池中 submit() 和 execute() 方法有什么区别?

execute() 仅接受 Runnable,submit() 支持 Runnable 和 Callable(可获取返回值)。

47. 在 Java 程序中怎么保证多线程的运行安全?

  1. 使用并发包类(如 AtomicReference)
  2. synchronized 关键字
  3. Lock 显式锁

48. 多线程中 synchronized 锁升级的原理是什么?

偏向锁 -> 轻量级锁 -> 重量级锁。目的是减少锁竞争带来的性能开销。

49. 什么是死锁?

两个或多个线程互相持有对方需要的锁,导致永久阻塞。

50. 怎么防止死锁?

  • 设置超时时间 tryLock
  • 使用并发工具类代替手写锁
  • 降低锁粒度

51. ThreadLocal 是什么?有哪些使用场景?

为每个线程提供独立变量副本。常用于数据库连接管理、Session 管理等。

52. 说一下 synchronized 底层实现原理?

基于 monitorenter/monitorexit 指令。Java 6 后引入偏向锁、轻量级锁优化性能。

53. synchronized 和 volatile 的区别是什么?

volatile 保证可见性和有序性,不保证原子性;synchronized 保证原子性、可见性和有序性。

54. synchronized 和 Lock 有什么区别?

synchronized 自动释放,Lock 需手动 unlock。Lock 可尝试获取锁并知道是否成功。

55. synchronized 和 ReentrantLock 区别是什么?

ReentrantLock 更灵活,支持公平锁、中断响应,但需手动管理生命周期。

56. 说一下 atomic 的原理?

基于 CAS (Compare And Swap) 和 volatile 实现无锁原子操作。

反射

57. 什么是反射?

运行时动态获取类的属性和方法,并调用的机制。

58. 什么是 Java 序列化?什么情况下需要序列化?

将对象状态保存为字节流。用于网络传输、RMI、持久化存储等场景。

59. 动态代理是什么?有哪些应用?

运行时生成代理类。应用包括 Spring AOP、Hibernate 查询、RPC 等。

60. 怎么实现动态代理?

JDK 原生代理(基于接口)和 CGLIB(基于继承子类)。

对象拷贝

61. 为什么要使用克隆?

复制对象状态,避免外部修改影响原对象。

62. 如何实现对象克隆?

  1. 实现 Cloneable 接口并重写 clone()
  2. 序列化反序列化实现深度克隆

63. 深拷贝和浅拷贝区别是什么?

浅拷贝只复制基本类型和引用地址;深拷贝递归复制所有对象。

Java Web

64. JSP 和 servlet 有什么区别?

JSP 侧重视图,本质是 Servlet;Servlet 侧重控制逻辑,纯 Java 代码。

65. JSP 有哪些内置对象?作用分别是什么?

request, response, pageContext, session, application, out, config, page, exception。

66. 说一下 JSP 的 4 种作用域?

page(页面级)、request(请求级)、session(会话级)、application(全局级)。

67. session 和 cookie 有什么区别?

  • 存储位置:session 在服务端,cookie 在浏览器。
  • 安全性:cookie 易被篡改,session 更安全。
  • 容量:cookie 有限制,session 取决于服务端内存。

目录

  1. Java 基础
  2. 1. JDK 和 JRE 有什么区别?
  3. 2. == 和 equals 的区别是什么?
  4. 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
  5. 4. final 在 Java 中有什么作用?
  6. 5. Java 中的 Math.round(-1.5) 等于多少?
  7. 6. String 属于基础的数据类型吗?
  8. 7. Java 中操作字符串都有哪些类?它们之间有什么区别?
  9. 8. String str="i"与 String str=new String("i")一样吗?
  10. 9. 如何将字符串反转?
  11. 10. String 类的常用方法有哪些?
  12. 11. 抽象类必须要有抽象方法吗?
  13. 12. 普通类和抽象类有哪些区别?
  14. 13. 抽象类能使用 final 修饰吗?
  15. 14. 接口和抽象类有什么区别?
  16. 15. Java 中 IO 流分为几种?
  17. 16. BIO、NIO、AIO 有什么区别?
  18. 17. Files 的常用方法都有哪些?
  19. 容器
  20. 18. Java 容器都有哪些?
  21. 19. Collection 和 Collections 有什么区别?
  22. 20. List、Set、Map 之间的区别是什么?
  23. 21. HashMap 和 Hashtable 有什么区别?
  24. 22. 如何决定使用 HashMap 还是 TreeMap?
  25. 23. 说一下 HashMap 的实现原理?
  26. 24. 说一下 HashSet 的实现原理?
  27. 25. ArrayList 和 LinkedList 的区别是什么?
  28. 26. 如何实现数组和 List 之间的转换?
  29. 27. ArrayList 和 Vector 的区别是什么?
  30. 28. Array 和 ArrayList 有何区别?
  31. 29. 在 Queue 中 poll() 和 remove() 有什么区别?
  32. 30. 哪些集合类是线程安全的?
  33. 31. 迭代器 Iterator 是什么?
  34. 32. Iterator 怎么使用?有什么特点?
  35. 33. Iterator 和 ListIterator 有什么区别?
  36. 34. 怎么确保一个集合不能被修改?
  37. 多线程
  38. 35. 并行和并发有什么区别?
  39. 36. 线程和进程的区别?
  40. 37. 守护线程是什么?
  41. 38. 创建线程有哪几种方式?
  42. 39. 说一下 runnable 和 callable 有什么区别?
  43. 40. 线程有哪些状态?
  44. 41. sleep() 和 wait() 有什么区别?
  45. 42. notify() 和 notifyAll() 有什么区别?
  46. 43. 线程的 run() 和 start() 有什么区别?
  47. 44. 创建线程池有哪几种方式?
  48. 45. 线程池都有哪些状态?
  49. 46. 线程池中 submit() 和 execute() 方法有什么区别?
  50. 47. 在 Java 程序中怎么保证多线程的运行安全?
  51. 48. 多线程中 synchronized 锁升级的原理是什么?
  52. 49. 什么是死锁?
  53. 50. 怎么防止死锁?
  54. 51. ThreadLocal 是什么?有哪些使用场景?
  55. 52. 说一下 synchronized 底层实现原理?
  56. 53. synchronized 和 volatile 的区别是什么?
  57. 54. synchronized 和 Lock 有什么区别?
  58. 55. synchronized 和 ReentrantLock 区别是什么?
  59. 56. 说一下 atomic 的原理?
  60. 反射
  61. 57. 什么是反射?
  62. 58. 什么是 Java 序列化?什么情况下需要序列化?
  63. 59. 动态代理是什么?有哪些应用?
  64. 60. 怎么实现动态代理?
  65. 对象拷贝
  66. 61. 为什么要使用克隆?
  67. 62. 如何实现对象克隆?
  68. 63. 深拷贝和浅拷贝区别是什么?
  69. Java Web
  70. 64. JSP 和 servlet 有什么区别?
  71. 65. JSP 有哪些内置对象?作用分别是什么?
  72. 66. 说一下 JSP 的 4 种作用域?
  73. 67. session 和 cookie 有什么区别?
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 动态规划入门:多状态 DP 问题实战(打家劫舍与股票买卖)
  • DeepSeek-R1-Distill-Llama-8B 本地部署与 Docker Compose 服务化
  • 大模型应用(一)核心功能与场景实战指南
  • 学生如何申请并使用 GitHub Copilot 进行编程实践
  • Spring Boot RESTful 接口开发实战指南
  • 贝佐斯比尔盖茨等巨头押注 NASA 工程师打造通用机器人大脑 估值 20 亿美元
  • 高并发、分布式场景下的 ID 生成策略
  • F5 刷新背后:浏览器缓存与渲染机制详解
  • Python 使用 Trae 提示词生成自动化测试框架实战
  • AI 辅助下的多链 imToken 钱包架构设计与安全实践
  • 医疗连续体机器人模块化控制界面设计与 Python 库应用研究
  • OpenAI 发布 GPT-4o:多模态实时交互与性能突破
  • 探索 LoRA 低秩适应技术:提升大语言模型微调效率的方法
  • Qwen3 模型 LoRA 微调实战(使用 LLaMA-Factory)
  • Linux 网络基础:协议分层与数据传输流程
  • 大数据基于Python的在线考试与评估系统设计与实现
  • Vue入门到精通:从零开始学Vue
  • 国内外人工智能大模型(LLMs)发展现状与技术分析
  • 微信小程序基础组件概览
  • VRM4U 插件完整指南:在 Unreal Engine 5 中高效处理 VRM 模型

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online