跳到主要内容Java 面试核心知识点与真题解析 | 极客日志Javajava
Java 面试核心知识点与真题解析
Java 面试涵盖基础语法、集合框架、并发编程、Web 技术、数据库及 JVM 等多个核心领域。内容涉及 JDK 与 JRE 区别、equals 与 hashCode 机制、线程状态与锁升级原理、HashMap 实现细节等高频考点。通过实战代码示例与源码分析,帮助开发者理解底层逻辑,应对面试挑战。
本指南整理了 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);
System.out.println(x == z);
System.out.println(x.equals(y));
System.out.println(x.equals(z));
equals 的本质:
默认情况下,equals 等同于 ==,比较引用。但 String、Integer 等类重写了该方法,改为比较值。
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
"王磊"
总结: 基本类型比值,引用类型 == 比地址,equals 通常被重写为比值。
3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。hashCode() 相等只意味着哈希值相同,可能存在哈希冲突,此时 equals() 仍需判断具体值。
String str1 = "通话";
String str2 = "重地";
System.out.println(str1.hashCode() + " | " + str2.hashCode());
System.out.println(str1.equals(str2));
4. final 在 Java 中有什么作用?
- 修饰类:最终类,不可继承。
- 修饰方法:最终方法,不可重写。
- 修饰变量:常量,初始化后不可修改。
5. Java 中的 Math.round(-1.5) 等于多少?
等于 -1。round 方法是向最接近的整数取整,0.5 向上取整,负数同理。
6. String 属于基础的数据类型吗?
不属于。基础类型有 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());
10. String 类的常用方法都有那些?
包括 indexOf, charAt, replace, trim, split, getBytes, length, toLowerCase, toUpperCase, substring, equals 等。
11. 抽象类必须要有抽象方法吗?
不需要。抽象类可以没有抽象方法,但不能直接实例化。
12. 普通类和抽象类有哪些区别?
- 普通类可实例化,抽象类不可。
- 抽象类可含抽象方法,普通类不可。
13. 抽象类能使用 final 修饰吗?
不能。final 禁止继承,而抽象类旨在被继承,两者矛盾。
14. 接口和抽象类有什么区别?
- 继承方式:类实现接口用
implements,继承抽象类用 extends。
- 构造函数:抽象类有,接口无。
- 数量限制:类可实现多个接口,但只能继承一个抽象类。
- 访问修饰:接口方法默认为
public,抽象类方法任意。
15. Java 中 IO 流分为几种?
按功能分:输入流、输出流。
按类型分:字节流(8 位)、字符流(16 位)。
16. BIO、NIO、AIO 有什么区别?
- BIO:同步阻塞 IO,模式简单,并发低。
- NIO:同步非阻塞 IO,基于 Channel,支持多路复用。
- AIO:异步非阻塞 IO,基于事件和回调机制。
17. Files 的常用方法都有哪些?
包括 exists, createFile, delete, copy, move, size, read, write 等。
容器相关
18. Java 容器都有哪些?
- Collection:List (ArrayList, LinkedList), Set (HashSet, TreeSet)。
- Map:HashMap, TreeMap, ConcurrentHashMap 等。
19. Collection 和 Collections 有什么区别?
Collection:集合接口,提供通用操作方法。
Collections:包装类,提供静态工具方法(如排序)。
20. List、Set、Map 之间的区别是什么?
- List:有序,允许重复。
- Set:无序(HashSet),不允许重复。
- Map:键值对,Key 唯一。
21. HashMap 和 Hashtable 有什么区别?
- 线程安全:Hashtable 是线程安全的,HashMap 不是。
- Null 值:HashMap 允许 null 键值,Hashtable 不允许。
- 推荐使用:单线程用 HashMap,多线程用 ConcurrentHashMap。
22. 如何决定使用 HashMap 还是 TreeMap?
需要快速插入删除选 HashMap;需要对 Key 有序遍历选 TreeMap。
23. 说一下 HashMap 的实现原理?
基于 Hash 算法。通过 key.hashCode() 计算 hash 值存入 bucket。发生哈希冲突时,链表存储(JDK 1.8 前)或红黑树存储(冲突较多时)。
24. 说一下 HashSet 的实现原理?
基于 HashMap 实现,底层用 HashMap 保存元素,利用 Key 的唯一性保证 Set 不重复。
25. ArrayList 和 LinkedList 的区别是什么?
- 结构:ArrayList 是动态数组,LinkedList 是双向链表。
- 随机访问:ArrayList 快(下标访问),LinkedList 慢(需遍历)。
- 增删:ArrayList 影响后续索引,LinkedList 只需修改指针。
26. 如何实现数组和 List 之间的转换?
- 数组转 List:
Arrays.asList(array)。
- List 转数组:
list.toArray()。
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();
}
特点:更安全,遍历时修改集合会抛出 ConcurrentModificationException。
33. Iterator 和 ListIterator 有什么区别?
- 范围:Iterator 遍历 Set/List,ListIterator 仅遍历 List。
- 方向:Iterator 单向,ListIterator 双向。
- 功能:ListIterator 支持添加、替换、获取索引。
34. 怎么确保一个集合不能被修改?
使用 Collections.unmodifiableCollection(list) 创建只读集合。
多线程相关
35. 并行和并发有什么区别?
- 并行:多核同时处理多任务。
- 并发:单核时间片轮转,逻辑上同时执行。
36. 线程和进程的区别?
进程是资源分配单位,线程是 CPU 调度单位。一个进程可包含多个线程。
37. 守护线程是什么?
38. 创建线程有哪几种方式?
- 继承 Thread 类。
- 实现 Runnable 接口。
- 实现 Callable 接口。
39. 说一下 runnable 和 callable 有什么区别?
Runnable 无返回值,Callable 有返回值且可抛出异常。
40. 线程有哪些状态?
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
41. sleep() 和 wait() 有什么区别?
- 来源:sleep 在 Thread,wait 在 Object。
- 锁:sleep 不释放锁,wait 释放锁。
- 唤醒:sleep 自动恢复,wait 需 notify/notifyAll。
42. notify() 和 notifyAll() 有什么区别?
notify 唤醒一个等待线程,notifyAll 唤醒所有。
43. 线程的 run() 和 start() 有什么区别?
start 启动线程,run 执行逻辑。start 只能调用一次,run 可多次调用。
44. 创建线程池有哪几种方式?
常见方法包括 newSingleThreadExecutor, newCachedThreadPool, newFixedThreadPool 等。最核心的是直接使用 ThreadPoolExecutor 构造器。
45. 线程池都有哪些状态?
RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。
46. 线程池中 submit() 和 execute() 方法有什么区别?
execute 仅接受 Runnable,submit 接受 Runnable 和 Callable(可获返回值)。
47. 在 Java 程序中怎么保证多线程的运行安全?
- 使用并发包类(如 ConcurrentHashMap)。
- 使用 synchronized 锁。
- 使用 Lock 手动锁。
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 需手动释放。
- Lock 可尝试获取锁,synchronized 不行。
55. synchronized 和 ReentrantLock 区别是什么?
ReentrantLock 更灵活,但需手动解锁;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 侧重控制逻辑,纯 Java 文件。
65. JSP 有哪些内置对象?作用分别是什么?
request, response, pageContext, session, application, out, config, page, exception。
66. 说一下 JSP 的 4 种作用域?
page, request, session, application。
67. session 和 cookie 有什么区别?
- 存储位置:session 在服务端,cookie 在客户端。
- 安全性:session 更安全,cookie 易被篡改。
- 容量:cookie 有限制,session 取决于服务器内存。
相关免费在线工具
- 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