跳到主要内容Java 面试核心考点梳理:基础、并发与容器篇 | 极客日志Javajava
Java 面试核心考点梳理:基础、并发与容器篇
Java 面试涉及基础语法、集合框架、多线程并发、IO 流及 Web 技术等核心领域。内容涵盖 JDK 与 JRE 区别、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));
x 和 y 指向常量池同一对象,故为 true;z 通过 new 开辟新空间,地址不同。而 equals 默认比较引用,但 String 等类重写了该方法进行值比较。
equals 的源码逻辑
Object 类的 equals 本质就是 ==。String 类重写了它,实现了字符数组的内容比对。因此两个内容相同的 String 对象,equals 返回 true。
注意:篇幅有限,后续将涵盖 JVM、MyBatis、Redis 等专题笔记,如需完整资料请自行查阅相关技术文档。
3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。hashCode 相等仅表示哈希值相同,不代表对象内容相等。例如'通话'和'重地'可能产生相同的 hash 值,但 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,多线程推荐 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,实现接口用 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 等)、Set(HashSet, TreeSet 等);Map 下含 HashMap, TreeMap, ConcurrentHashMap 等。
19. Collection 和 Collections 有什么区别?
Collection 是集合接口,所有集合类的父接口;Collections 是工具类,提供排序、同步等静态方法。
20. List、Set、Map 之间的区别是什么?
- List:有序,允许重复。
- Set:无序(HashSet),不允许重复。
- Map:键值对存储,Key 唯一。
21. HashMap 和 Hashtable 有什么区别?
- 空值支持:HashMap 允许 null 键值,Hashtable 不允许。
- 线程安全:Hashtable 线程安全,HashMap 非线程安全。
- 推荐使用:单线程用 HashMap,多线程用 ConcurrentHashMap。
22. 如何决定使用 HashMap 还是 TreeMap?
需要快速插入删除选 HashMap;需要对 Key 有序遍历选 TreeMap。
23. 说一下 HashMap 的实现原理?
基于 Hash 算法。put 时计算 key 的 hashCode 确定 bucket 位置。若 hash 冲突,链表法存储(Java 8+ 冲突多时转为红黑树)。
24. 说一下 HashSet 的实现原理?
底层基于 HashMap 实现,利用 HashMap 的 Key 唯一性来保证元素不重复。
25. ArrayList 和 LinkedList 的区别是什么?
- 结构:ArrayList 动态数组,LinkedList 双向链表。
- 随机访问:ArrayList 快,LinkedList 慢。
- 增删:非首尾操作 LinkedList 快,ArrayList 需移动指针。
26. 如何实现数组和 List 之间的转换?
- 数组转 List:Arrays.asList(array)
- List 转数组:list.toArray()
27. ArrayList 和 Vector 的区别是什么?
Vector 线程安全(synchronized),扩容 1 倍;ArrayList 非线程安全,扩容 50%,性能更优。
28. Array 和 ArrayList 有何区别?
Array 存基本类型和对象,大小固定;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.iterator() 获取。特点是安全,遍历时修改集合会抛出 ConcurrentModificationException。
33. Iterator 和 ListIterator 有什么区别?
ListIterator 专用于 List,支持双向遍历及添加、替换元素等操作。
34. 怎么确保一个集合不能被修改?
使用 Collections.unmodifiableCollection() 创建只读集合。
多线程
35. 并行和并发有什么区别?
并行是多核同时处理;并发是单核时间片轮转,逻辑上同时执行。
36. 线程和进程的区别?
进程是资源分配单位,线程是 CPU 调度单位。一个进程可包含多个线程。
37. 守护线程是什么?
后台服务线程,如 GC 线程。主线程结束后,守护线程随之结束。
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() 需 notify 唤醒。
42. notify() 和 notifyAll() 有什么区别?
notify() 唤醒一个等待线程;notifyAll() 唤醒所有等待线程。
43. 线程的 run() 和 start() 有什么区别?
start() 启动新线程执行 run();run() 只是普通方法调用,不会新建线程。
44. 创建线程池有哪几种方式?
Executors 提供五种工厂方法,最底层是 ThreadPoolExecutor。包括 newFixedThreadPool, newCachedThreadPool 等。建议直接使用 ThreadPoolExecutor 自定义参数。
45. 线程池都有哪些状态?
RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。
46. 线程池中 submit() 和 execute() 方法有什么区别?
execute() 仅接受 Runnable;submit() 接受 Runnable 和 Callable,可获取返回值。
47. 在 Java 程序中怎么保证多线程的运行安全?
- 使用并发包类(如 ConcurrentHashMap)
- synchronized 关键字
- Lock 显式锁
48. 多线程中 synchronized 锁升级的原理是什么?
Java 6 后优化为偏向锁 -> 轻量级锁 -> 重量级锁。目的是减少锁竞争带来的性能开销。
49. 什么是死锁?
线程互相持有对方需要的锁,导致互相等待无法继续执行。
50. 怎么防止死锁?
- 设置超时时间 tryLock
- 使用并发工具类代替手写锁
- 降低锁粒度
- 避免嵌套锁
51. ThreadLocal 是什么?有哪些使用场景?
为每个线程提供独立变量副本。常用于数据库连接管理、Session 管理等。
52. 说一下 synchronized 底层实现原理?
基于 monitorenter/monitorexit 指令。早期依赖操作系统互斥锁,Java 6 后引入三种锁优化性能。
53. synchronized 和 volatile 的区别是什么?
volatile 保证可见性,不保证原子性;synchronized 保证可见性和原子性。volatile 不阻塞线程。
54. synchronized 和 Lock 有什么区别?
synchronized 自动释放锁,Lock 需手动 release。Lock 可尝试获取锁,synchronized 不行。
55. synchronized 和 ReentrantLock 区别是什么?
ReentrantLock 更灵活,支持公平锁、中断等待等,但需手动释放。
56. 说一下 atomic 的原理?
基于 CAS (Compare And Swap) 和 volatile,保证原子操作,性能优于 synchronized。
反射
57. 什么是反射?
58. 什么是 Java 序列化?什么情况下需要序列化?
将对象状态保存为字节流。用于网络传输、RMI、持久化存储等场景。
59. 动态代理是什么?有哪些应用?
运行时生成代理类。应用包括 Spring AOP、Hibernate 查询、RPC 等。
60. 怎么实现动态代理?
JDK 原生代理基于接口,CGLIB 基于继承子类。
对象拷贝
61. 为什么要使用克隆?
62. 如何实现对象克隆?
- 实现 Cloneable 接口重写 clone()
- 实现 Serializable 接口通过序列化反序列化
63. 深拷贝和浅拷贝区别是什么?
浅拷贝只复制基本值和引用地址;深拷贝递归复制所有对象。
Java Web
64. JSP 和 servlet 有什么区别?
JSP 侧重视图,Servlet 侧重控制逻辑。JSP 本质是 Servlet。
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 取决于服务端配置。
相关免费在线工具
- 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