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

Java 核心面试题与答案整理(基础、并发、JVM 等)

综述由AI生成Java 开发岗位常见面试考点汇总,涵盖基础语法、集合容器、多线程并发、反射机制、Web 技术栈及主流框架如 Spring Boot、MyBatis 等内容。重点解析了 JDK 与 JRE 区别、equals 与 hashCode 原理、HashMap 实现机制、线程池状态及锁升级过程等高频问题。内容专注于技术知识点的梳理与代码示例说明,适合求职者复习参考或工程师查漏补缺。

链路追踪发布于 2026/3/15更新于 2026/6/1020 浏览
Java 核心面试题与答案整理(基础、并发、JVM 等)

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
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

x 和 y 指向常量池同一对象,故为 true;z 在堆中开辟新空间,故为 false。equals 默认比较引用,但 String 等类重写了该方法进行值比较。

equals 解读 Object 类的默认实现等同于 ==。

class Cat {
    public Cat(String name) { this.name = name; }
    private String name;
    public String getName() { return name; }
}
Cat c1 = new Cat("王磊");
    ();
System.out.println(c1.equals(c2)); 
Cat
c2
=
new
Cat
"王磊"
// false

输出为 false,因为未重写 equals 时比较的是地址。String 类重写了 equals,将比较逻辑改为字符序列对比。

总结:基本类型用 == 比值,引用类型 == 比地址,equals 通常被重写为比值。

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

不对。hashCode 相等仅代表哈希桶位置可能相同,不代表内容一致。

String str1 = "通话";
String str2 = "重地";
System.out.println(str1.hashCode() + " | " + str2.hashCode());
System.out.println(str1.equals(str2));

执行结果哈希值相同但 equals 返回 false,说明散列冲突是存在的。

4. final 在 Java 中有什么作用?
  • 修饰类:该类不能被继承。
  • 修饰方法:该方法不能被子类重写。
  • 修饰变量:成为常量,必须初始化且不可修改。
5. Java 中的 Math.round(-1.5) 等于多少?

等于 -1。Math.round 采用四舍五入规则,负数 0.5 向绝对值大的方向取整(即向下),正数 0.5 向上。

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

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

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

主要有 String、StringBuffer、StringBuilder。

  • String:不可变对象,每次修改都会生成新对象。
  • StringBuffer:可变,线程安全(synchronized),性能略低。
  • StringBuilder:可变,非线程安全,单线程下性能最高。

频繁修改字符串建议使用 StringBuilder,多线程场景选 StringBuffer。

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 vs implements。
  • 构造函数:抽象类有,接口无。
  • 多重性:类可实现多接口,但只能继承一个抽象类。
  • 访问修饰符:接口方法默认为 public,抽象类方法任意。
15. Java 中 IO 流分为几种?

按功能分:输入流、输出流。 按类型分:字节流(8 位)、字符流(16 位)。

16. BIO、NIO、AIO 有什么区别?
  • BIO:同步阻塞 IO,传统模式,简单但并发能力弱。
  • NIO:同步非阻塞 IO,基于 Channel 和 Selector,支持多路复用。
  • 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:集合接口,List/Set 的父接口。
  • 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(key, value) 时计算 hash 值定位 bucket。发生 hash 冲突时,链表存储(JDK8+ 超过阈值转为红黑树)。

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

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

25. ArrayList 和 LinkedList 的区别是什么?
  • 结构:动态数组 vs 双向链表。
  • 随机访问:ArrayList O(1),LinkedList O(n)。
  • 增删:中间增删 LinkedList 效率更高(无需移动元素)。
26. 如何实现数组和 List 之间的转换?
  • 数组转 List:Arrays.asList(array)
  • List 转数组:list.toArray()
String[] array = {"a", "b"};
List<String> list = Arrays.asList(array);
27. ArrayList 和 Vector 的区别是什么?
  • 线程安全:Vector 使用 synchronized 同步,ArrayList 非同步。
  • 扩容:Vector 翻倍,ArrayList 增加 50%。
28. Array 和 ArrayList 有何区别?
  • 类型:Array 存基本类型和对象,ArrayList 只存对象。
  • 大小:Array 固定,ArrayList 动态。
29. 在 Queue 中 poll() 和 remove() 有什么区别?
  • 都返回并移除第一个元素。
  • 空队列时,poll() 返回 null,remove() 抛异常。
30. 哪些集合类是线程安全的?

Vector, Hashtable, Stack。JDK 1.5 后推荐使用 ConcurrentHashMap 替代 Hashtable。

31. 迭代器 Iterator 是什么?

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

32. Iterator 怎么使用?有什么特点?
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String obj = it.next();
}

特点:Fail-Fast 机制,遍历时修改集合会抛 ConcurrentModificationException。

33. Iterator 和 ListIterator 有什么区别?
  • ListIterator 专用于 List,支持双向遍历。
  • ListIterator 可添加、替换元素及获取索引。
34. 怎么确保一个集合不能被修改?

使用 Collections.unmodifiableCollection() 包装成只读集合。

多线程

35. 并行和并发有什么区别?
  • 并行:多核同时处理多个任务。
  • 并发:单核时间片轮转,宏观上同时执行。
36. 线程和进程的区别?

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

37. 守护线程是什么?

后台服务线程,如 GC 线程。主线程结束时,守护线程随之结束。

38. 创建线程有哪几种方式?
  1. 继承 Thread 类
  2. 实现 Runnable 接口
  3. 实现 Callable 接口
39. 说一下 runnable 和 callable 有什么区别?

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

40. 线程有哪些状态?

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

41. sleep() 和 wait() 有什么区别?
  • 来源:Thread vs Object。
  • 锁:sleep 不释放锁,wait 释放锁。
  • 唤醒:sleep 自动恢复,wait 需 notify/notifyAll。
42. notify() 和 notifyAll() 有什么区别?

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

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

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

44. 创建线程池有哪几种方式?
  • newSingleThreadExecutor(): 单线程顺序执行。
  • newCachedThreadPool(): 缓存线程,适合大量短任务。
  • newFixedThreadPool(int n): 固定线程数。
  • newScheduledThreadPool(): 定时/周期任务。
  • ThreadPoolExecutor(): 最灵活,自定义参数。
45. 线程池都有哪些状态?

RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。

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

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

47. 在 Java 程序中怎么保证多线程的运行安全?
  1. 使用并发包类(ConcurrentHashMap 等)。
  2. synchronized 关键字。
  3. Lock 显式锁。
Lock lock = new ReentrantLock();
lock.lock();
try { /* 业务逻辑 */ } finally { lock.unlock(); }
48. 多线程中 synchronized 锁升级的原理是什么?

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

49. 什么是死锁?

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

50. 怎么防止死锁?
  • 设置超时时间 tryLock。
  • 使用并发工具类代替手写锁。
  • 降低锁粒度,统一加锁顺序。
51. ThreadLocal 是什么?有哪些使用场景?

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

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

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

53. synchronized 和 volatile 的区别是什么?
  • volatile 保证可见性,不保证原子性;synchronized 两者都保证。
  • volatile 不会阻塞线程,synchronized 可能阻塞。
54. synchronized 和 Lock 有什么区别?
  • synchronized 自动释放,Lock 需手动 unlock。
  • Lock 可尝试获取锁,synchronized 不行。
55. synchronized 和 ReentrantLock 区别是什么?

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

56. 说一下 atomic 的原理?

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

反射

57. 什么是反射?

运行时动态获取类信息、调用方法的能力。

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

将对象状态保存到文件或网络传输。常见于 RMI、Socket 通信、持久化存储。

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

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

60. 怎么实现动态代理?

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

目录

  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. 怎么实现动态代理?
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ 继承机制详解:访问控制、同名隐藏与派生类默认成员函数
  • Git 分支管理:从基础概念到团队协作规范
  • C语言网络编程入门:Socket编程、TCP/IP协议与通信实现
  • Mapnik 在 Windows 10 下的源码编译指南
  • 四款主流 AI 编程 IDE 横向评测:从辅助到代理的演进路径
  • AI 绘画提示词实战指南:从基础原理到高效创作
  • Flutter Web 开发解决跨域(CORS)问题指南
  • 阿里 Z-Image-Turbo 文生图镜像部署与性能实测
  • Windows 11 安装 JDK 25:下载、配置环境变量及验证
  • 2025 AI 绘画主流 Prompt 写法结构与进阶技巧实战
  • AI 时代产品经理成长指南
  • Python 真的有必要学吗?基于工作场景的实用性分析
  • 基于子集选择算法的负载均衡方案
  • 缓存算法实战:LRU 与 LFU 的 Java 实现与原理解析
  • Flutter Clean Architecture 架构设计实践
  • DeepSeek 各版本演进历程与优缺点深度解析
  • Java 学习:Comparable 与 Comparator 接口排序逻辑详解
  • AI 辅助小说创作实战:6 款工具深度测评与投稿指南
  • GitHub Copilot 配置核心认知与典型错误规避
  • 电商大模型时代:虚拟试穿技术与行业实践

相关免费在线工具

  • 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