跳到主要内容Java 面试核心知识点与高频问题解析 | 极客日志Javajava
Java 面试核心知识点与高频问题解析
Java 面试考察点广泛,包括基础类型与对象引用、集合框架底层原理、多线程同步机制、IO 模型差异、反射与序列化流程,以及 Web 组件生命周期。重点解析 HashMap 扩容策略、线程池参数配置、synchronized 锁升级过程及 volatile 可见性保证。内容覆盖从入门到进阶的核心知识点,帮助开发者梳理技术体系,应对实际面试场景。
云朵棉花糖1 浏览 本文整理了 Java 开发中的核心面试问题,涵盖基础语法、集合框架、多线程并发、Web 开发及常用框架等关键领域。以下内容按知识模块分类,便于针对性复习。
Java 基础
1. JDK 和 JRE 有什么区别?
JDK(Java Development Kit)是开发工具包,提供开发环境和运行环境;JRE(Java Runtime Environment)是运行环境,仅包含运行所需组件。
简单来说,JDK 包含了 JRE,还多了编译器 javac 以及调试分析工具。如果只需运行程序,安装 JRE 即可;若要编写代码,则需安装 JDK。
2. == 和 equals 的区别是什么?
== 解读
基本类型比较值是否相同,引用类型比较内存地址是否一致。
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x == y);
System.out.println(x == z);
System.out.println(x.equals(y));
System.out.println(x.equals(z));
x 和 y 指向常量池同一对象,故为 true;new String() 开辟新空间,== 结果为 false;equals 比较内容,均为 true。
equals 解读
默认情况下 equals 等同于 ==,但 String、Integer 等类重写了该方法进行值比较。
自定义类未重写时,即使值相同,equals 也返回 false:
class Cat {
public Cat(String name) { this.name = name; }
private String name;
public String getName() { return name; }
}
Cat c1 = new Cat("王磊");
Cat c2 ();
System.out.println(c1.equals(c2));
=
new
Cat
"王磊"
Object 源码中 equals 实现为 return (this == obj)。而 String 重写了逻辑,逐字符比较 value 数组。
总结:== 对基本类型比值,引用类型比地址;equals 默认比地址,多数类重写后比值。
3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。hashCode 相等仅代表哈希桶位置可能相同,不等于对象内容相等。
String str1 = "通话";
String str2 = "重地";
System.out.println(str1.hashCode() + " | " + str2.hashCode());
System.out.println(str1.equals(str2));
输出显示两者 hash 值相同但 equals 为 false,这是散列表冲突的正常现象。
4. final 在 Java 中有什么作用?
- 修饰类:该类不能被继承。
- 修饰方法:该方法不能被子类重写。
- 修饰变量:成为常量,必须初始化且不可修改。
5. Java 中的 Math.round(-1.5) 等于多少?
等于 -1。数轴上中间值 0.5 向右取整,正 0.5 向上,负 0.5 直接舍弃。
6. String 属于基础的数据类型吗?
不属于。基础类型有 8 种(byte, boolean, char, short, int, float, long, double),String 是对象。
7. Java 中操作字符串都有哪些类?它们之间有什么区别?
主要有 String、StringBuffer、StringBuilder。
- String 是不可变对象,每次修改生成新对象。
- StringBuffer 和 StringBuilder 可变,基于原对象操作。
- 区别在于线程安全: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());
10. String 类的常用方法都有那些?
indexOf(), charAt(), replace(), trim(), split(), getBytes(), length(), toLowerCase(), toUpperCase(), substring(), equals() 等。
11. 抽象类必须要有抽象方法吗?
不需要。抽象类可以没有抽象方法,但不能直接实例化。
12. 普通类和抽象类有哪些区别?
- 普通类不能有抽象方法,可直接实例化。
- 抽象类可含抽象方法,不可直接实例化。
13. 抽象类能使用 final 修饰吗?
不能。final 禁止继承,abstract 要求被继承,二者矛盾。
14. 接口和抽象类有什么区别?
- 继承方式:extends vs implements。
- 构造函数:抽象类有,接口无。
- 数量限制:类可实现多接口,但只能继承一个抽象类。
- 访问修饰符:接口方法默认为 public,抽象类方法任意。
15. Java 中 IO 流分为几种?
按功能分输入/输出流;按类型分字节流/字符流。字节流 8 位传输,字符流 16 位传输。
16. BIO、NIO、AIO 有什么区别?
- BIO:同步阻塞,传统模式,并发能力低。
- NIO:同步非阻塞,Channel 通讯,支持多路复用。
- AIO:异步非阻塞,基于事件回调机制。
17. Files 的常用方法都有哪些?
exists(), createFile(), createDirectory(), delete(), copy(), move(), size(), read(), write() 等。
容器
18. Java 容器都有哪些?
分为 Collection 和 Map 两大类。Collection 下含 List(ArrayList, LinkedList 等)、Set(HashSet, TreeSet 等);Map 下含 HashMap, TreeMap 等。
19. Collection 和 Collections 有什么区别?
Collection 是集合接口,List/Set 是其子类;Collections 是包装类,提供静态工具方法(如排序)。
20. List、Set、Map 之间的区别是什么?
主要看元素有序性和重复性。List 有序可重复,Set 无序不可重复,Map 键唯一。
21. HashMap 和 Hashtable 有什么区别?
- 允许 null:HashMap 允许 key/value 为 null,Hashtable 不允许。
- 线程安全:Hashtable 线程安全,HashMap 非安全。
- 推荐使用:单线程用 HashMap,多线程用 ConcurrentHashMap。
22. 如何决定使用 HashMap 还是 TreeMap?
需要快速插入删除选 HashMap;需要对 Key 有序遍历选 TreeMap。
23. 说一下 HashMap 的实现原理?
基于 Hash 算法。put 时计算 key.hashCode() 确定 bucket 位置。hash 冲突时用链表或红黑树存储。冲突少用链表,多用红黑树。
24. 说一下 HashSet 的实现原理?
基于 HashMap 实现,底层用 HashMap 保存元素,Key 即为 Set 元素,Value 为固定 Object。
25. ArrayList 和 LinkedList 的区别是什么?
- 结构:ArrayList 动态数组,LinkedList 双向链表。
- 随机访问:ArrayList 快,LinkedList 慢。
- 增删:非首尾操作 LinkedList 快,ArrayList 需移动数据。
频繁读取选 ArrayList,频繁增删选 LinkedList。
26. 如何实现数组和 List 之间的转换?
数组转 List:Arrays.asList(array)。
List 转数组:list.toArray()。
27. ArrayList 和 Vector 的区别是什么?
Vector 线程安全(synchronized),扩容 1 倍;ArrayList 非安全,扩容 50%。性能上 ArrayList 更优。
28. Array 和 ArrayList 有何区别?
Array 存基本类型和对象,大小固定;ArrayList 只存对象,大小自动扩展,内置方法更多。
29. 在 Queue 中 poll() 和 remove() 有什么区别?
都返回并删除第一个元素。poll() 为空返回 null,remove() 抛异常。
30. 哪些集合类是线程安全的?
Vector, Hashtable, Stack。JDK 1.5 后并发包提供了 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);
}
特点:安全,遍历时修改集合会抛 ConcurrentModificationException。
33. Iterator 和 ListIterator 有什么区别?
- 范围:Iterator 遍历 Set/List,ListIterator 仅 List。
- 方向:Iterator 单向,ListIterator 双向。
- 功能:ListIterator 可添加、替换元素及获取索引。
34. 怎么确保一个集合不能被修改?
使用 Collections.unmodifiableCollection() 创建只读集合。
多线程
35. 并行和并发有什么区别?
并行:多核同时处理多个任务。
并发:单核时间片轮流执行,逻辑上同时。
36. 线程和进程的区别?
进程是资源分配单位,线程是 CPU 调度单位。一个进程至少一个线程。
37. 守护线程是什么?
后台服务线程,如 GC 线程。用户线程结束时 JVM 退出,守护线程不阻止。
38. 创建线程有哪几种方式?
- 继承 Thread 重写 run。
- 实现 Runnable 接口。
- 实现 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 唤醒所有。notifyAll 将线程移回锁池竞争。
43. 线程的 run() 和 start() 有什么区别?
start() 启动新线程执行 run();run() 只是普通方法调用。start() 只能调用一次。
44. 创建线程池有哪几种方式?
Executors 提供七种工厂方法,最核心的是 ThreadPoolExecutor。包括 newSingleThreadExecutor, newCachedThreadPool, newFixedThreadPool 等。建议直接使用 ThreadPoolExecutor 构造器控制参数。
45. 线程池都有哪些状态?
RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。
46. 线程池中 submit() 和 execute() 方法有什么区别?
execute 仅接受 Runnable,submit 接受 Runnable 和 Callable(可获返回值)。
47. 在 Java 程序中怎么保证多线程的运行安全?
- 使用并发包安全类。
- synchronized 锁。
- Lock 手动锁。
48. 多线程中 synchronized 锁升级的原理是什么?
Java 6 后优化了 synchronized。偏向锁 -> 轻量级锁(自旋)-> 重量级锁。目的是减少性能消耗。
49. 什么是死锁?
50. 怎么防止死锁?
- 设置超时时间 tryLock。
- 使用并发包代替手写锁。
- 降低锁粒度,减少同步块。
51. ThreadLocal 是什么?有哪些使用场景?
为每个线程提供独立变量副本。常用于数据库连接、Session 管理。
52. 说一下 synchronized 底层实现原理?
monitorenter/monitorexit 指令。Java 6 前依赖操作系统互斥锁(重量级),6 后引入三种锁优化。
53. synchronized 和 volatile 的区别是什么?
- 作用:volatile 修饰变量,synchronized 修饰类/方法/块。
- 原子性:volatile 不保证,synchronized 保证。
- 阻塞:volatile 不阻塞,synchronized 可能阻塞。
54. synchronized 和 Lock 有什么区别?
- 范围:synchronized 更广,Lock 仅代码块。
- 释放:synchronized 自动,Lock 需手动。
- 查询:Lock 可判断是否获取成功。
55. synchronized 和 ReentrantLock 区别是什么?
ReentrantLock 灵活但需手动释放,synchronized 简单自动释放。Java 6 后 synchronized 性能已大幅改进。
56. 说一下 atomic 的原理?
利用 CAS (Compare And Swap) 和 volatile 保证原子操作,避免 synchronized 开销。
反射
57. 什么是反射?
58. 什么是 Java 序列化?什么情况下需要序列化?
保存对象状态到文件或网络。用于持久化、RMI 传输、Socket 通信。
59. 动态代理是什么?有哪些应用?
运行时生成代理类。应用:Spring AOP、Hibernate、RPC。
60. 怎么实现动态代理?
JDK 原生(基于接口)和 CGLIB(基于继承)。
对象拷贝
61. 为什么要使用克隆?
62. 如何实现对象克隆?
- 实现 Cloneable 接口重写 clone()。
- 实现 Serializable 接口通过序列化反序列化(深度克隆)。
63. 深拷贝和浅拷贝区别是什么?
浅拷贝只复制对象本身和值类型成员;深拷贝复制所有成员变量(包括引用对象)。
Java Web
64. JSP 和 servlet 有什么区别?
JSP 是 Servlet 的简化版,侧重视图;Servlet 侧重控制逻辑。JSP 本质也是 Servlet。
65. JSP 有哪些内置对象?作用分别是什么?
request, response, pageContext, session, application, out, config, page, exception。共 9 个,分别封装请求、响应、上下文、会话等信息。
66. 说一下 JSP 的 4 种作用域?
page(页面内), request(请求内), session(会话内), application(全局)。数据生命周期依次递增。
67. session 和 cookie 有什么区别?
- 存储:session 服务端,cookie 客户端。
- 安全:cookie 易伪造,session 更安全。
- 容量:cookie 有限制,session 取决于服务端。
- 多样性:session 可存 Redis/DB,cookie 仅限浏览器。
相关免费在线工具
- 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