一、面向对象编程(OOP)
-
四大特性
-
封装、继承、多态、抽象的具体实现与区别?
-
抽象类与接口的区别?何时选择抽象类或接口?
-
重写(Override)和重载(Overload)的规则与区别?
-
-
关键字
-
final
修饰类、方法、变量的作用?能否修饰构造方法? -
static
的作用?静态变量与实例变量的存储位置? -
this
和super
的使用场景?
-
-
其他特性
-
什么是内部类?匿名内部类如何访问外部变量?
-
值传递 vs 引用传递?Java中参数传递的本质是什么?
-
二、集合框架
-
核心类
-
ArrayList
和LinkedList
的底层实现与适用场景? -
HashMap
的底层结构(JDK 1.8前后变化)?哈希冲突如何解决? -
HashSet
如何保证元素唯一性? -
ConcurrentHashMap
如何实现线程安全?分段锁 vs CAS+synchronized?
-
-
其他问题
-
Iterator
的fail-fast机制是什么?如何避免? -
Comparable
和Comparator
的区别?如何实现自定义排序? -
Java 8中
Stream API
的常用操作(如map
、filter
、reduce
)?
-
三、多线程与并发
-
线程基础
-
线程的6种状态(New, Runnable, Blocked, Waiting, Timed Waiting, Terminated)?
-
wait()
、notify()
与sleep()
的区别?为什么wait()
需要释放锁?
-
-
线程安全
-
synchronized
的底层实现(对象头Monitor)?锁升级过程(偏向锁→轻量级锁→重量级锁)? -
ReentrantLock
与synchronized
的区别?公平锁与非公平锁如何实现? -
volatile
的作用(可见性、禁止指令重排)?能否保证原子性?
-
-
线程池
-
ThreadPoolExecutor
的7个核心参数(核心线程数、最大线程数、队列等)? -
线程池的4种拒绝策略(AbortPolicy、CallerRunsPolicy等)?
-
如何合理配置线程池大小?
-
四、JVM与内存管理
-
内存结构
-
JVM内存分区(堆、栈、方法区/元空间、程序计数器等)?
-
堆内存的分代结构(Young/Old Generation)?对象分配过程(Eden→Survivor→Old)?
-
-
垃圾回收(GC)
-
如何判断对象是否可回收(引用计数法 vs 可达性分析)?
-
常见的GC算法(标记-清除、复制、标记-整理)?
-
CMS和G1垃圾回收器的特点与区别?
-
-
性能调优
-
常见的OOM错误(堆溢出、栈溢出、方法区溢出)?如何排查?
-
JVM参数调优(-Xms、-Xmx、-XX:NewRatio等)?
-
五、异常处理
-
异常分类:
Error
和Exception
的区别?受检异常(Checked Exception)与非受检异常(Unchecked Exception)? -
try-catch-finally
的执行顺序?若try
和finally
中都有return
,最终返回哪个? -
try-with-resources
的作用(自动关闭资源)?如何实现(需实现AutoCloseable
接口)?
六、其他核心问题
-
Java 8+新特性
-
Lambda表达式的作用?函数式接口(如
Consumer
、Predicate
)的使用场景? -
Optional
类的作用?如何避免NullPointerException?
-
-
反射与动态代理
-
反射如何获取类的私有方法?反射的性能问题如何优化?
-
JDK动态代理与CGLIB动态代理的区别?
-
-
基础语法
-
String
、StringBuilder
、StringBuffer
的区别?字符串常量池的作用? -
自动装箱与拆箱的原理?
Integer a=127
与Integer b=127
是否相等?为什么? -
==
与equals()
的区别?如何重写equals()
和hashCode()
?
-
高频代码题示例
-
手写单例模式(双重检查锁+volatile)。
-
实现生产者-消费者模型(使用
BlockingQueue
或wait()/notify()
)。 -
反转链表(考察基础算法与指针操作)。
总结
Java基础是面试的核心考察点,建议结合源码(如HashMap、ConcurrentHashMap)和实际场景(如线程池配置)深入理解。对于概念类问题(如OOP特性),需用简洁的语言表达本质;对于底层原理(如JVM、锁机制),需结合图示或代码流程说明。
答案
一、面向对象编程(OOP)
1. 抽象类与接口的区别?
-
抽象类:
-
用
abstract
修饰,可以包含普通方法和抽象方法。 -
单继承,子类通过
extends
继承。 -
适合定义共性逻辑(如模板方法模式)。
-
-
接口:
-
用
interface
定义,Java 8后支持默认方法(default
)和静态方法。 -
多实现,类通过
implements
实现。 -
适合定义行为契约(如策略模式)。
-
2. final
关键字的作用
-
修饰类:类不可被继承(如
String
)。 -
修饰方法:方法不可被重写(如
Object.getClass()
)。 -
修饰变量:变量值不可变(基本类型值不变,引用类型指向对象不变)。
二、集合框架
1. HashMap
的底层实现(JDK 1.8+)
-
结构:数组 + 链表/红黑树(链表长度≥8时转红黑树,≤6时转回链表)。
-
哈希冲突解决:链地址法(拉链法)。
-
扩容机制:默认负载因子0.75,容量翻倍,重新计算哈希分布。
2. ConcurrentHashMap
的线程安全实现
-
JDK 1.7:分段锁(Segment),降低锁粒度。
-
JDK 1.8+:CAS +
synchronized
(仅锁链表头节点/红黑树根节点)。
三、多线程与并发
1. synchronized
和ReentrantLock
的区别
-
实现:
-
synchronized
:JVM层面实现,自动释放锁。 -
ReentrantLock
:API层面实现,需手动lock()
和unlock()
。
-
-
功能:
ReentrantLock
支持公平锁、条件变量(Condition
)、可中断锁。
2. 线程池的拒绝策略
-
AbortPolicy
:直接抛出RejectedExecutionException
(默认)。 -
CallerRunsPolicy
:由提交任务的线程直接执行任务。 -
DiscardOldestPolicy
:丢弃队列中最旧的任务,重新提交新任务。 -
DiscardPolicy
:直接丢弃新任务,不抛异常。
四、JVM与内存管理
1. JVM内存结构
-
堆:存储对象实例(Young/Old Generation)。
-
栈:存储方法调用栈帧(局部变量、操作数栈)。
-
方法区(元空间):存储类信息、常量池(JDK 8后由本地内存管理)。
2. 垃圾回收算法:G1 vs CMS
-
CMS:标记-清除算法,追求低停顿,但存在内存碎片。
-
G1:分Region收集,标记-整理算法,可预测停顿时间(适合大内存)。
五、高频代码题示例
1. 双重检查锁单例模式
java
复制
下载
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
关键点 :volatile
防止指令重排,保证可见性;双重检查减少锁竞争。