跳到主要内容Java 核心面试题与实战解析 | 极客日志Javajava
Java 核心面试题与实战解析
本文整理了 Java 面试核心知识点,涵盖基础语法、集合框架、多线程并发、反射机制、Web 技术等内容。重点解析了 JDK 与 JRE 差异、equals 与==对比、HashMap 原理、线程池状态及锁升级机制等高频考点。通过代码示例与原理剖析,帮助开发者理解底层实现,提升面试应对能力。适合准备 Java 后端岗位的技术人员参考复习。
Java 基础
JDK 和 JRE 有什么区别?
JDK(Java Development Kit)是开发工具包,提供了开发环境和运行环境;JRE(Java Runtime Environment)是运行环境,仅包含运行所需组件。
简单来说,JDK 包含了 JRE,还多了编译器 javac 以及调试分析工具。如果只需运行程序,装 JRE 即可;若要编写代码,则必须安装 JDK。
== 和 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 比较的是内容。
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 = new ();
System.out.println(c1.equals(c2));
Cat
"王磊"
Object 类的 equals 源码本质就是 return (this == obj)。而 String 类重写了 equals,实现了字符数组的内容比对。
总结:== 对基本类型比值,引用类型比地址;equals 默认比地址,多数类重写后比值。
两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。hashCode 相等只代表哈希桶位置可能相同,不代表对象内容相等。
String str1 = "通话";
String str2 = "重地";
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(str1.equals(str2));
散列表中哈希冲突是常态,需结合 equals 进一步判断。
final 在 Java 中有什么作用?
- 修饰类:最终类,不可继承。
- 修饰方法:不可重写。
- 修饰变量:常量,初始化后不可修改。
Java 中的 Math.round(-1.5) 等于多少?
等于 -1。数轴上中间值 0.5 向右取整,正 0.5 向上,负 0.5 向下舍入。
String 属于基础的数据类型吗?
不属于。基础类型有 8 种(byte, boolean, char, short, int, float, long, double),String 是对象。
Java 中操作字符串都有哪些类?它们之间有什么区别?
主要有 String、StringBuffer、StringBuilder。
- String 是不可变对象,每次修改生成新对象。
- StringBuffer 和 StringBuilder 可变,基于原有对象操作。
- 区别在于线程安全:StringBuffer 同步安全,StringBuilder 非同步但性能更高。单线程推荐 StringBuilder,多线程推荐 StringBuffer。
String str="i"与 String str=new String('i')一样吗?
不一样。前者分配在常量池,后者在堆内存开辟新空间。
如何将字符串反转?
使用 StringBuilder 或 StringBuffer 的 reverse() 方法。
StringBuilder sb = new StringBuilder();
sb.append("abcdefg");
System.out.println(sb.reverse());
String 类的常用方法都有那些?
- indexOf(), charAt(): 索引与字符访问。
- replace(), trim(): 替换与去空格。
- split(): 分割成数组。
- getBytes(), length(): 字节转换与长度。
- toLowerCase(), toUpperCase(): 大小写转换。
- substring(), equals(): 截取与比较。
抽象类必须要有抽象方法吗?
不需要。抽象类可以没有抽象方法,但不能直接实例化。
普通类和抽象类有哪些区别?
- 普通类无抽象方法,可直接实例化。
- 抽象类可有抽象方法,不可直接实例化。
抽象类能使用 final 修饰吗?
不能。final 禁止继承,abstract 鼓励继承,二者矛盾。
接口和抽象类有什么区别?
- 实现方式:extends vs implements。
- 构造函数:抽象类有,接口无。
- 数量限制:类可多实现接口,单继承抽象类。
- 访问修饰符:接口方法默认 public,抽象类任意。
Java 中 IO 流分为几种?
按功能分输入/输出流;按类型分字节流/字符流。字节流 8 位传输,字符流 16 位传输。
BIO、NIO、AIO 有什么区别?
- BIO:同步阻塞,传统 IO,并发低。
- NIO:同步非阻塞,Channel 通讯,支持多路复用。
- AIO:异步非阻塞,基于事件回调机制。
Files 的常用方法都有哪些?
exists(), createFile(), createDirectory(), delete(), copy(), move(), size(), read(), write()。
容器
Java 容器都有哪些?
- Collection: List (ArrayList, LinkedList, Vector), Set (HashSet, TreeSet)
- Map: HashMap, TreeMap, ConcurrentHashMap
Collection 和 Collections 有什么区别?
Collection 是集合接口,Collections 是包装工具类,提供静态方法如 sort。
List、Set、Map 之间的区别是什么?
主要看元素有序性和重复性。List 有序可重复,Set 无序不可重复,Map 键唯一。
HashMap 和 Hashtable 有什么区别?
- null 值:HashMap 允许 key/value 为 null,Hashtable 不允许。
- 线程安全:Hashtable 同步安全,HashMap 非安全。
- 推荐使用:单线程用 HashMap,多线程用 ConcurrentHashMap。
如何决定使用 HashMap 还是 TreeMap?
频繁增删查用 HashMap;需要按键排序遍历用 TreeMap。
说一下 HashMap 的实现原理?
基于 Hash 算法。put 时计算 hash 值存入 bucket。hash 冲突时用链表或红黑树存储。冲突少用链表,多用红黑树。
说一下 HashSet 的实现原理?
底层基于 HashMap,利用 HashMap 的 key 来保证元素唯一性。
ArrayList 和 LinkedList 的区别是什么?
- 结构:动态数组 vs 双向链表。
- 随机访问:ArrayList 快,LinkedList 慢。
- 增删:非首尾操作 LinkedList 快,ArrayList 需移动下标。
如何实现数组和 List 之间的转换?
- 数组转 List:Arrays.asList(array)
- List 转数组:list.toArray()
ArrayList 和 Vector 的区别是什么?
Vector 线程安全(synchronized),扩容翻倍;ArrayList 非安全,扩容 50%。性能上 ArrayList 更优。
Array 和 ArrayList 有何区别?
Array 存基本类型和对象,大小固定;ArrayList 只存对象,自动扩容,API 更丰富。
在 Queue 中 poll() 和 remove() 有什么区别?
都返回并删除第一个元素。poll() 空时返回 null,remove() 空时抛异常。
哪些集合类是线程安全的?
Vector, Hashtable, Stack。JDK 1.5+ 并发包提供了 ConcurrentHashMap 等替代方案。
迭代器 Iterator 是什么?
遍历 Collection 的接口,取代 Enumeration,支持移除元素。
Iterator 怎么使用?有什么特点?
通过 iterator() 获取,hasNext() 判断,next() 取值。特点是安全,遍历时修改集合会抛 ConcurrentModificationException。
Iterator 和 ListIterator 有什么区别?
ListIterator 专用于 List,支持双向遍历及增删改元素索引。
怎么确保一个集合不能被修改?
使用 Collections.unmodifiableCollection() 创建只读集合。
多线程
并行和并发有什么区别?
并行是多核同时处理;并发是单核时间片轮转,逻辑上同时执行。
线程和进程的区别?
进程是资源分配单位,线程是 CPU 调度单位。一个进程至少一个线程。
守护线程是什么?
后台服务线程,如 GC 线程。主线程结束,守护线程随之结束。
创建线程有哪几种方式?
- 继承 Thread 重写 run
- 实现 Runnable 接口
- 实现 Callable 接口
说一下 runnable 和 callable 有什么区别?
Runnable 无返回值,Callable 有返回值且可抛异常。
线程有哪些状态?
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
sleep() 和 wait() 有什么区别?
- 来源:Thread vs Object。
- 锁:sleep 不释放,wait 释放。
- 唤醒:sleep 自动恢复,wait 需 notify。
notify() 和 notifyAll() 有什么区别?
notify 唤醒一个等待线程,notifyAll 唤醒所有。
线程的 run() 和 start() 有什么区别?
start() 启动新线程执行 run();run() 只是普通方法调用,不会开启新线程。
创建线程池有哪几种方式?
常见七种:newSingleThreadExecutor, newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newWorkStealingPool 等。最核心的是 ThreadPoolExecutor。
线程池都有哪些状态?
RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。
线程池中 submit() 和 execute() 方法有什么区别?
execute 只能接 Runnable,submit 可接 Runnable 和 Callable(带返回值)。
在 Java 程序中怎么保证多线程的运行安全?
- 使用并发包类(concurrent)
- synchronized 锁
- Lock 手动锁
多线程中 synchronized 锁升级的原理是什么?
偏向锁 -> 轻量级锁 -> 重量级锁。目的是减少锁竞争带来的性能消耗。
什么是死锁?
怎么防止死锁?
- 设置超时时间 tryLock
- 使用并发工具类
- 降低锁粒度
- 减少同步块
ThreadLocal 是什么?有哪些使用场景?
为每个线程提供独立变量副本。常用于数据库连接、Session 管理。
说一下 synchronized 底层实现原理?
monitorenter/monitorexit 指令。Java 6 前是重量级锁,之后引入偏向锁、轻量级锁优化性能。
synchronized 和 volatile 的区别是什么?
volatile 保证可见性,不保证原子性;synchronized 两者都保证。volatile 不阻塞,synchronized 可能阻塞。
synchronized 和 Lock 有什么区别?
synchronized 自动释放,Lock 需手动 unlock。Lock 可尝试获取锁,synchronized 不行。
synchronized 和 ReentrantLock 区别是什么?
ReentrantLock 更灵活,需手动释放;synchronized 语法糖,简单但灵活性低。
说一下 atomic 的原理?
利用 CAS (Compare And Swap) 和 volatile 保证原子操作,避免 synchronized 开销。
反射
什么是反射?
什么是 Java 序列化?什么情况下需要序列化?
保存对象状态到文件或网络传输。RMI、套接字通信、持久化时需要。
动态代理是什么?有哪些应用?
运行时生成代理类。Spring AOP、Hibernate、RPC 常用。
怎么实现动态代理?
JDK 原生(基于接口)和 CGLIB(基于继承子类)。
对象拷贝
为什么要使用克隆?
保留当前对象状态,避免 new 出来的对象属性为初始值。
如何实现对象克隆?
- 实现 Cloneable 接口重写 clone()
- 实现 Serializable 接口序列化和反序列化(深度克隆)
深拷贝和浅拷贝区别是什么?
浅拷贝只复制对象本身和值类型成员;深拷贝递归复制所有成员对象。
Java Web
JSP 和 servlet 有什么区别?
JSP 侧重视图,Servlet 侧重控制逻辑。JSP 本质是 Servlet。
JSP 有哪些内置对象?作用分别是什么?
request, response, pageContext, session, application, out, config, page, exception。分别封装请求、响应、上下文、会话、全局配置等。
说一下 JSP 的 4 种作用域?
page(页面)、request(请求)、session(会话)、application(全局)。
session 和 cookie 有什么区别?
- 存储:服务器端 vs 浏览器端。
- 安全: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