Java面试高频知识点总结
📚 Java基础
1. 面向对象三大特性
java
// 封装示例
public class Person {
private String name; // 封装
public String getName() {
return name;
}
}
// 继承示例
class Student extends Person { }
// 多态示例
Animal animal = new Dog(); // 父类引用指向子类对象
2. == 和 equals() 的区别
==
:比较基本类型值或对象内存地址equals()
:通常需要重写,用于比较对象内容
java
String s1 = new String("hello");
String s2 = new String("hello");
s1 == s2; // false(不同对象)
s1.equals(s2); // true(内容相同)
3. String、StringBuffer、StringBuilder
特性 | String | StringBuffer | StringBuilder |
---|---|---|---|
可变性 | 不可变 | 可变 | 可变 |
线程安全 | 安全 | 安全(synchronized) | 不安全 |
性能 | 低(频繁操作) | 中等 | 高 |
使用场景 | 少量字符串操作 | 多线程环境 | 单线程环境 |
📦 Java集合框架
1. HashMap原理(JDK8+)
java
// 数组 + 链表/红黑树结构
static final int TREEIFY_THRESHOLD = 8; // 链表转树阈值
static final int UNTREEIFY_THRESHOLD = 6; // 树转链表阈值
// put过程伪代码
1. 计算key的hash值
2. 如果table为空则初始化
3. 如果桶为空,直接插入
4. 如果桶不为空:
- 键相同则更新值
- 如果是树节点,树插入
- 否则遍历链表插入
5. 链表长度>8时转为红黑树
2. ConcurrentHashMap线程安全实现
- JDK7:分段锁(Segment)
- JDK8+ :
- Node + CAS + synchronized
- 只锁定当前桶(链表头/树根)
- 并发控制更细粒度
3. ArrayList vs LinkedList
操作 | ArrayList | LinkedList |
---|---|---|
随机访问 | O(1) | O(n) |
头部插入 | O(n) | O(1) |
内存占用 | 较小(连续内存) | 较大(节点开销) |
适用场景 | 读多写少 | 写多读少 |
🔁 多线程与并发
1. 线程状态转换
NEW RUNNABLE: start() RUNNABLE BLOCKED: 等待锁 BLOCKED 获得锁 WAITING: wait()/join() WAITING notify()/notifyAll() TIMED_WAITING: sleep(n) TIMED_WAITING 时间到 TERMINATED: run()结束
2. synchronized vs ReentrantLock
特性 | synchronized | ReentrantLock |
---|---|---|
实现机制 | JVM层面 | API层面 |
锁获取方式 | 自动获取释放 | 需要手动lock/unlock |
公平性 | 非公平 | 可公平/非公平(构造函数指定) |
条件变量 | 单一wait/notify | 支持多个Condition |
锁中断 | 不支持 | 支持lockInterruptibly() |
3. 线程池核心参数
java
ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 工作队列
RejectedExecutionHandler handler // 拒绝策略
)
四种拒绝策略:
AbortPolicy
:默认策略,直接抛异常CallerRunsPolicy
:用调用者线程执行任务DiscardPolicy
:静默丢弃任务DiscardOldestPolicy
:丢弃队列最老任务
⚙️ JVM与性能调优
1. 内存区域划分
JVM内存区域
"方法区"
"堆"
"虚拟机栈"
"本地方法栈"
"程序计数器"
2. 垃圾回收算法
- 标记-清除:产生内存碎片
- 复制算法:适合新生代(Eden/Survivor)
- 标记-整理:适合老年代
- 分代收集:新生代(Minor GC) + 老年代(Full GC)
3. 常见GC收集器
收集器 | 区域 | 算法 | 特点 |
---|---|---|---|
Serial | 新生代 | 复制 | 单线程,简单高效 |
ParNew | 新生代 | 复制 | Serial的多线程版本 |
Parallel Scavenge | 新生代 | 复制 | 吞吐量优先 |
CMS | 老年代 | 标记-清除 | 低停顿,并发收集 |
G1 | 全堆 | 分Region+标记-整理 | 可预测停顿,JDK9默认 |
🧩 设计模式
1. 单例模式(双重校验锁)
java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次校验
synchronized (Singleton.class) {
if (instance == null) { // 第二次校验
instance = new Singleton();
}
}
}
return instance;
}
}
2. 工厂模式
java
interface Car {
void drive();
}
class Tesla implements Car { /*...*/ }
class BMW implements Car { /*...*/ }
class CarFactory {
public Car createCar(String type) {
switch(type) {
case "Tesla": return new Tesla();
case "BMW": return new BMW();
default: throw new IllegalArgumentException();
}
}
}
3. Spring中的设计模式
- 工厂模式:BeanFactory
- 代理模式:AOP实现
- 单例模式:默认Bean作用域
- 模板方法:JdbcTemplate
- 观察者模式:ApplicationEvent
✨ Java 8+ 新特性
1. Lambda表达式
java
// 传统写法
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
// Lambda写法
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
2. Stream API
java
List<String> result = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
3. Optional避免NPE
java
Optional<User> user = userService.findById(id);
user.ifPresent(u -> System.out.println(u.getName()));
String name = user.map(User::getName)
.orElse("Unknown");