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

Java 核心面试指南:基础、并发与集合实战

涵盖 Java 基础语法、集合框架、多线程并发、IO 流及 Web 开发等核心知识点。内容包含 JDK 与 JRE 区别、equals 与 hashCode 机制、String 不可变性原理、HashMap 底层实现、线程池状态管理、synchronized 锁升级过程等高频考点。适合求职者系统复习,帮助理解 JVM 内存模型与并发安全策略,提升面试通过率。

游戏玩家发布于 2026/3/15更新于 2026/6/1118 浏览
Java 核心面试指南:基础、并发与集合实战

Java 基础

1. JDK 和 JRE 有什么区别?

JDK(Java Development Kit)是开发工具包,提供了开发环境和运行环境;JRE(Java Runtime Environment)是运行环境,仅包含运行所需组件。

简单来说,JDK 包含了 JRE。如果你需要编写 Java 程序,必须安装 JDK;若只需运行程序,安装 JRE 即可。JDK 中还包含了编译器 javac 以及调试分析工具。

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;new String() 开辟了新的堆内存,所以为 false。equals 默认比较引用,但 String 等类重写了该方法以比较值。

equals 源码解读: Object 类的默认实现如下:

public boolean equals(Object obj) {
    return (this == obj);
}

String 类重写了 equals 方法,将引用比较改为内容比较。

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

不对。hashCode 相等只说明哈希值相同,不代表对象内容相等。

String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(), str2.hashCode()));
System.out.println(str1.equals(str2));

输出结果中两者 hash 值可能相同,但 equals 返回 false。散列表中哈希冲突是常见现象。

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

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

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

等于 -1。Math.round 采用四舍五入规则,负数 0.5 时向下取整。

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

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

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

主要有 String、StringBuffer、StringBuilder。

  • String:不可变对象,每次修改都会生成新对象。
  • StringBuffer:可变,线程安全,性能略低。
  • 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(): 分割字符串。
  • length(): 获取长度。
  • toLowerCase()/toUpperCase(): 大小写转换。
  • substring(): 截取子串。
  • equals(): 比较内容。

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

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

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

  • 普通类可包含具体方法,可直接实例化。
  • 抽象类可包含抽象方法,不能直接实例化。

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

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

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

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

15. Java 中 IO 流分为几种?

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

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

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

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

  • exists(): 检测路径是否存在。
  • createFile()/createDirectory(): 创建文件/目录。
  • delete(): 删除。
  • copy()/move(): 复制/移动。
  • read()/write(): 读写。

容器

18. Java 容器都有哪些?

主要分为 Collection 和 Map 两大类。

  • Collection:List(ArrayList, LinkedList, Vector, Stack)、Set(HashSet, LinkedHashSet, TreeSet)。
  • Map:HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap, Hashtable。

19. Collection 和 Collections 有什么区别?

  • Collection:集合接口,List/Set 的父接口。
  • Collections:包装类,提供静态工具方法(如排序)。

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

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

21. HashMap 和 Hashtable 有什么区别?

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

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

  • 插入/删除/定位频繁:选 HashMap(O(1))。
  • 需要按键排序遍历:选 TreeMap(红黑树结构)。

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

基于 Hash 算法。put(key, value) 时计算 key.hashCode() 确定 bucket 位置。若 hash 冲突,链表法存储;Java 8 后冲突较多时转为红黑树。

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

底层基于 HashMap。所有元素作为 key 存入 HashMap,value 为固定对象 PRESENT。因此不支持重复值。

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

  • 结构:ArrayList 动态数组,LinkedList 双向链表。
  • 随机访问:ArrayList 快(索引访问),LinkedList 慢(需遍历)。
  • 增删:中间增删 LinkedList 快(无需移动元素),ArrayList 慢。

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

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

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

  • 线程安全:Vector 使用 synchronized,线程安全;ArrayList 不安全。
  • 扩容:Vector 扩容翻倍,ArrayList 增加 50%。
  • 性能:ArrayList 优于 Vector。

28. Array 和 ArrayList 有何区别?

  • 类型:Array 存基本类型和对象,ArrayList 仅存对象。
  • 大小:Array 固定,ArrayList 动态扩展。
  • 方法:ArrayList 提供更多集合操作方法。

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

  • 都返回并移除第一个元素。
  • 空队列时:poll() 返回 null,remove() 抛异常。

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

Vector、Hashtable、Stack 是线程安全的。JDK 1.5 后推荐使用 java.util.concurrent 包下的类,如 ConcurrentHashMap。

31. 迭代器 Iterator 是什么?

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

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

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String obj = it.next();
    System.out.println(obj);
}

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

33. Iterator 和 ListIterator 有什么区别?

  • 范围:Iterator 遍历 Set/List,ListIterator 仅遍历 List。
  • 方向:Iterator 单向,ListIterator 双向。
  • 功能:ListIterator 支持添加、替换元素及获取索引。

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

使用 Collections.unmodifiableCollection() 创建只读视图,任何修改操作将抛出 UnsupportedOperationException。

多线程

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

  • 并行:多核 CPU 同时处理多个任务。
  • 并发:单核 CPU 通过时间片轮转交替执行多个任务。

36. 线程和进程的区别?

进程是资源分配的最小单位,线程是调度的最小单位。一个进程可包含多个线程,共享进程资源。

37. 守护线程是什么?

后台运行的线程,不阻止 JVM 退出。例如垃圾回收线程。

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

  1. 继承 Thread 类并重写 run()。
  2. 实现 Runnable 接口。
  3. 实现 Callable 接口(可返回值)。

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

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

40. 线程有哪些状态?

  • NEW:未启动。
  • RUNNABLE:正在执行或等待 CPU。
  • BLOCKED:等待锁。
  • WAITING:无限期等待。
  • TIMED_WAITING:限时等待。
  • TERMINATED:执行结束。

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

  • 来源:sleep 属 Thread,wait 属 Object。
  • 锁:sleep 不释放锁,wait 释放锁。
  • 唤醒:sleep 自动恢复,wait 需 notify/notifyAll。

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

notify() 唤醒一个等待线程,notifyAll() 唤醒所有。通常建议用 notifyAll 避免死锁风险。

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

start() 启动新线程执行 run();直接调用 run() 只是普通方法调用,不会开启新线程。

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

主要使用 Executors 工厂类或 ThreadPoolExecutor 构造函数。

  • newSingleThreadExecutor:单线程顺序执行。
  • newCachedThreadPool:缓存线程池,按需创建。
  • newFixedThreadPool:定长线程池。
  • 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 锁升级的原理是什么?

Java 6 优化了 synchronized,引入偏向锁、轻量级锁、重量级锁。

  • 偏向锁:无竞争时记录线程 ID,减少同步开销。
  • 轻量级锁:自旋尝试获取锁。
  • 重量级锁:自旋失败后挂起线程,依赖操作系统互斥量。 目的是减少性能消耗。

49. 什么是死锁?

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

50. 怎么防止死锁?

  • 设置超时时间(tryLock)。
  • 使用并发工具类代替手写锁。
  • 降低锁粒度。
  • 尽量缩小同步块范围。

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

为每个线程提供独立的变量副本,避免线程间数据共享。 典型场景:数据库连接管理、Session 管理。

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

基于 monitorenter/monitorexit 指令。早期依赖操作系统互斥锁(重量级),Java 6 后引入三种锁状态优化性能。

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

  • 作用:volatile 修饰变量,synchronized 修饰代码块/方法。
  • 原子性:volatile 不保证原子性,synchronized 保证。
  • 可见性:两者都保证可见性。
  • 阻塞:volatile 不阻塞,synchronized 可能阻塞。

54. synchronized 和 Lock 有什么区别?

  • 灵活性:Lock 更灵活,可中断、可超时。
  • 释放:synchronized 自动释放,Lock 需手动 unlock。
  • 异常处理:synchronized 异常自动释放,Lock 需 finally 保证释放。

55. synchronized 和 ReentrantLock 区别是什么?

ReentrantLock 需手动加锁解锁,支持公平锁、条件变量;synchronized 语法糖,使用简单。Java 6 后 synchronized 性能已大幅提升。

56. 说一下 atomic 的原理?

基于 CAS(Compare And Swap)和 volatile 实现无锁并发,避免 synchronized 上下文切换开销。

反射

57. 什么是反射?

运行时动态获取类信息(属性、方法)并调用的机制。

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

将对象状态保存为字节流。场景:网络传输(Socket/RMI)、持久化存储(文件/DB)。

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

运行时动态生成代理类。应用:Spring AOP、Hibernate 查询、RPC。

60. 怎么实现动态代理?

  • JDK 动态代理:基于接口。
  • CGLIB 动态代理:基于继承子类。

对象拷贝

61. 为什么要使用克隆?

保留对象当前状态,避免外部修改影响原对象。

62. 如何实现对象克隆?

  1. 实现 Cloneable 接口,重写 clone()。
  2. 实现 Serializable,通过序列化反序列化实现深度克隆。

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

  • 浅拷贝:复制对象本身及基本类型字段,引用类型字段仍指向原对象。
  • 深拷贝:递归复制所有层级对象,完全独立。

Java Web

64. JSP 和 servlet 有什么区别?

JSP 本质是 Servlet,侧重视图展示;Servlet 侧重控制逻辑。JSP 编译后也是 Servlet。

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

  • request:封装请求参数。
  • response:封装响应。
  • session:用户会话。
  • application:全局上下文。
  • out:输出流。
  • config:配置信息。
  • pageContext:页面上下文。
  • page:当前页面对象。
  • exception:异常对象。

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

  • page:页面内有效。
  • request:请求内有效。
  • session:会话内有效。
  • application:整个应用有效。

67. session 和 cookie 有什么区别?

  • 存储位置:session 在服务端,cookie 在客户端。
  • 安全性:session 更安全,cookie 易被篡改。
  • 容量:cookie 有限制,session 取决于服务器内存。
  • 用途:session 适合敏感数据,cookie 适合轻量标识。

目录

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

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

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

更多推荐文章

查看全部
  • Java 顺序表实现杨辉三角思路与代码
  • 渗透测试全流程解析与实战方法
  • 面试高频缓存算法:LRU 与 LFU 原理及 Java 实现
  • 分治算法详解:快速排序、归并排序与快速选择
  • ChatGPT Go 在亚洲 16 国上线及三大使用限制
  • 10 款主流网络爬虫工具深度对比与选型指南
  • 强化学习基础:动态规划算法原理与实现
  • 用 Vibe Coding 实现 AI 全自动代码生成与交付
  • SKResNet 架构详解:融合选择性卷积与残差结构
  • Llama-Factory 模型服务负载均衡实战配置
  • OpenCode 接入 Kimi K2.5 配置与实战指南
  • C++ 轻量级搜索引擎实战:正/倒排索引构建详解
  • 动态规划路径类 DP 入门:3 道经典例题详解
  • C++ 算法实战:排序子序列划分与 LIS 优化
  • HarmonyOS Next DevEco Studio 端云一体化开发业务介绍
  • 基于大语言模型和 RAG 的知识库问答系统
  • 大语言模型人类对齐五大核心算法:SFT、RLHF、DPO、PPO、GRPO
  • next-ai-draw-io:基于 Next.js 的 AI 绘图工具搭建指南
  • AIGC 核心技术解析:Transformer、GPT 与 BERT 工作原理
  • OpenClaw 龙虾 AI 全能助手安装配置指南

相关免费在线工具

  • 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

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online