跳到主要内容Java 核心面试题与实战解析 | 极客日志Javajava
Java 核心面试题与实战解析
Java 面试涵盖基础语法、集合框架、多线程并发、JVM 原理及主流框架等核心领域。内容梳理了 JDK 与 JRE 区别、equals 与 hashCode 机制、HashMap 底层实现、线程池状态管理及锁升级原理等高频考点。通过对比分析 synchronized 与 Lock、BIO/NIO/AIO 模型差异,帮助开发者巩固理论基础并应对实际场景中的性能与安全挑战,适合准备技术面试的工程师系统复习。
RustyLab1 浏览 Java 核心面试题与实战解析
面试准备不仅是背诵知识点,更是对技术深度的理解。本文梳理了 Java 开发中高频考察的核心领域,涵盖基础语法、集合框架、并发编程、JVM 原理及主流框架等,旨在帮助开发者系统性地巩固知识体系。
Java 基础
JDK 和 JRE 有什么区别?
JDK(Java Development Kit)是开发工具包,提供了编译环境和运行环境;JRE(Java Runtime Environment)则是运行环境。简单来说,JDK 包含了 JRE,还多了编译器 javac 以及调试分析工具。如果你只需要运行程序,安装 JRE 即可;若要编写代码,则必须安装 JDK。
== 和 equals 的区别是什么?
== 对基本类型比较值,对引用类型比较地址。equals 默认也是比较地址,但 String、Integer 等类重写了该方法,使其变为值比较。
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,即使内容相同,比较结果也为 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
"王磊"
两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。哈希冲突是常见现象,hashCode 相等不代表对象内容相等。
String str1 = "通话";
String str2 = "重地";
System.out.println(str1.hashCode() + " | " + str2.hashCode());
System.out.println(str1.equals(str2));
final 在 Java 中有什么作用?
- 修饰类:该类不能被继承。
- 修饰方法:该方法不能被重写。
- 修饰变量:成为常量,初始化后不可修改。
Math.round(-1.5) 等于多少?
等于 -1。round 方法是向最接近的整数取整,0.5 时向正无穷方向取整,所以负 0.5 直接舍弃。
String 属于基础的数据类型吗?
不属于。Java 有 8 种基本数据类型(byte, boolean, char, short, int, float, long, double),String 是对象。
操作字符串都有哪些类?它们之间有什么区别?
主要有 String、StringBuffer、StringBuilder。
- String:不可变对象,每次修改都会生成新对象。
- StringBuffer:可变,线程安全,性能稍低。
- StringBuilder:可变,非线程安全,性能最高。
单线程下推荐 StringBuilder,多线程推荐 StringBuffer。
String str="i"与 String str=new String('i')一样吗?
不一样。前者分配在常量池,后者分配在堆内存。如果常量池中已有该字符串,new String 会复用还是新建取决于具体实现细节,但通常 new 会创建新对象。
如何将字符串反转?
使用 StringBuilder 或 StringBuffer 的 reverse() 方法。
StringBuilder sb = new StringBuilder("abcdefg");
System.out.println(sb.reverse());
抽象类必须要有抽象方法吗?
接口和抽象类有什么区别?
- 继承方式:类实现接口用 implements,继承抽象类用 extends。
- 构造函数:抽象类可以有,接口不能有。
- 数量限制:类可实现多个接口,但只能继承一个抽象类。
- 访问修饰符:接口方法默认 public,抽象类方法任意。
IO 流分为几种?
按功能分输入流和输出流;按类型分字节流和字符流。字节流处理 8 位数据,字符流处理 16 位字符。
BIO、NIO、AIO 有什么区别?
- BIO:同步阻塞 IO,传统模式,简单但并发能力低。
- NIO:同步非阻塞 IO,基于 Channel 和 Buffer,支持多路复用。
- AIO:异步非阻塞 IO,基于事件和回调机制。
Files 的常用方法有哪些?
包括 exists(), createFile(), delete(), copy(), move(), read(), write() 等,用于文件路径的常规操作。
容器
Java 容器都有哪些?
主要分为 Collection 和 Map 两大体系。
- Collection:List (ArrayList, LinkedList), Set (HashSet, TreeSet)。
- Map:HashMap, TreeMap, ConcurrentHashMap 等。
Collection 和 Collections 有什么区别?
- Collection:集合接口,List、Set 都是其子类。
- Collections:包装类,提供静态方法如排序、同步等。
List、Set、Map 之间的区别是什么?
主要看元素是否有序、是否允许重复。List 有序可重复,Set 无序不可重复,Map 键唯一值可重复。
HashMap 和 Hashtable 有什么区别?
- Null 值:HashMap 允许 key/value 为 null,Hashtable 不允许。
- 线程安全:Hashtable 线程安全,HashMap 非线程安全。
- 推荐:单线程用 HashMap,多线程用 ConcurrentHashMap。
如何决定使用 HashMap 还是 TreeMap?
需要快速插入删除定位选 HashMap;需要对 Key 进行有序遍历选 TreeMap。
HashMap 的实现原理?
基于 Hash 算法。put 时计算 hash 值存入 bucket。发生 hash 冲突时,链表存储;当链表长度超过阈值(通常为 8)且数组长度大于 64 时,转为红黑树以提升查询效率。
ArrayList 和 LinkedList 的区别?
- 底层结构:ArrayList 是动态数组,LinkedList 是双向链表。
- 随机访问:ArrayList 效率高(O(1)),LinkedList 需遍历(O(n))。
- 增删操作:LinkedList 在非首尾位置效率更高,无需移动元素。
如何实现数组和 List 之间的转换?
- 数组转 List:
Arrays.asList(array)。
- List 转数组:
list.toArray()。
哪些集合类是线程安全的?
Vector、Hashtable、Stack 是线程安全的。JDK 1.5 后推荐使用 java.util.concurrent 包下的类,如 ConcurrentHashMap。
Iterator 是什么?
迭代器接口,用于遍历 Collection。相比 Enumeration,它允许在遍历过程中移除元素。
怎么确保一个集合不能被修改?
使用 Collections.unmodifiableCollection(Collection c) 创建只读视图,任何修改操作将抛出异常。
多线程
并行和并发有什么区别?
- 并行:多核处理器同时处理多个任务。
- 并发:单核 CPU 通过时间片轮转交替执行多个任务。
线程和进程的区别?
进程是资源分配的最小单位,线程是 CPU 调度的最小单位。一个进程可包含多个线程。
守护线程是什么?
运行在后台的特殊线程,如垃圾回收线程。当所有用户线程结束时,守护线程也会自动结束。
创建线程有哪几种方式?
- 继承 Thread 类并重写 run 方法。
- 实现 Runnable 接口。
- 实现 Callable 接口(可返回结果)。
sleep() 和 wait() 有什么区别?
- 所属类:sleep 属于 Thread,wait 属于 Object。
- 锁释放:sleep 不释放锁,wait 释放锁。
- 唤醒:sleep 时间到自动恢复,wait 需 notify/notifyAll 唤醒。
线程池创建有哪几种方式?
newSingleThreadExecutor:单线程顺序执行。
newCachedThreadPool:缓存线程,适合大量短任务。
newFixedThreadPool:固定大小线程数。
newScheduledThreadPool:定时或周期性任务。
ThreadPoolExecutor:最原始的方式,推荐手动配置参数以控制资源。
线程池都有哪些状态?
RUNNING(接受任务)、SHUTDOWN(不接受新任务)、STOP(中断任务)、TIDYING(清理中)、TERMINATED(已终止)。
submit() 和 execute() 方法有什么区别?
execute 仅执行 Runnable 无返回值;submit 可执行 Runnable 和 Callable,能获取 Future 返回值。
怎么保证多线程的运行安全?
- 使用并发包类(如 AtomicReference)。
- 使用 synchronized 关键字。
- 使用 Lock 接口(如 ReentrantLock)。
synchronized 锁升级的原理?
Java 6 优化了 synchronized,引入偏向锁、轻量级锁、重量级锁三级状态。无竞争时偏向锁,少量竞争升级为轻量级自旋,竞争激烈时升级为重量级锁(依赖操作系统互斥量)。目的是减少性能消耗。
什么是死锁?
两个或多个线程互相持有对方需要的锁,导致永久阻塞。防止死锁可设置超时时间、降低锁粒度或使用并发工具类。
ThreadLocal 是什么?
为每个线程提供独立的变量副本,常用于数据库连接管理或 Session 保存,避免线程间数据污染。
synchronized 和 volatile 的区别?
- 范围:volatile 修饰变量,synchronized 修饰类/方法/块。
- 原子性:volatile 不能保证原子性,synchronized 可以。
- 阻塞:volatile 不会阻塞线程,synchronized 可能会。
synchronized 和 Lock 有什么区别?
synchronized 是 JVM 层面,自动释放锁;Lock 是 API 层面,需手动 lock/unlock,灵活性更高但易忘释放导致死锁。
atomic 的原理?
利用 CAS (Compare And Swap) 和 volatile 保证原子操作,避免 synchronized 的高开销。
反射
什么是反射?
运行时动态获取类的属性、方法信息并调用的机制。Spring AOP、ORM 框架广泛使用。
什么是 Java 序列化?
将对象状态保存到文件或网络传输。RMI、Socket 通信常需此功能。
动态代理是什么?
运行时动态生成代理类。JDK 代理基于接口,CGLIB 基于继承子类。应用包括 Spring AOP、RPC。
对象拷贝
为什么要使用克隆?
深拷贝和浅拷贝区别?
- 浅拷贝:只复制对象本身和值类型成员,引用类型共享。
- 深拷贝:递归复制所有成员,完全独立。
Java Web
JSP 和 servlet 有什么区别?
JSP 本质是 Servlet,侧重视图展示;Servlet 侧重控制逻辑。JSP 中 Java 和 HTML 混合,Servlet 中逻辑与页面分离。
JSP 有哪些内置对象?
request, response, pageContext, session, application, out, config, page, exception。共 9 个。
session 和 cookie 有什么区别?
- 存储位置:session 在服务端,cookie 在浏览器。
- 安全性:cookie 易被篡改,session 更安全。
- 容量:cookie 有大小限制,session 受服务端内存限制。
注:以上内容涵盖了 Java 面试中的核心考点,实际应用中请结合具体业务场景深入理解。
相关免费在线工具
- 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