2025 Java面试大全技术文章(面试题2)
Java核心语法
数据类型与包装类
Java的8种基本数据类型对应包装类:byte-Byte
、short-Short
、int-Integer
、long-Long
、float-Float
、double-Double
、char-Character
、boolean-Boolean
。包装类提供对象操作能力,如集合存储和泛型使用。
自动装箱与拆箱原理
装箱调用valueOf()
方法,拆箱调用xxxValue()
方法。Integer缓存-128~127的实例,高频复用。
Integer a = 100; // 自动装箱 Integer.valueOf(100)
int b = a; // 自动拆箱 a.intValue()
String、StringBuffer、StringBuilder区别
String
不可变,每次操作生成新对象StringBuffer
线程安全(synchronized修饰)StringBuilder
非线程安全,性能更高
final关键字作用场景
- 修饰类:不可继承
- 修饰方法:不可重写
- 修饰变量:基本类型值不可变,引用类型地址不可变
面向对象特性
多态的实现机制
基于JVM方法调用指令:
invokestatic
:调用静态方法invokevirtual
:调用实例方法(多态核心)invokeinterface
:调用接口方法invokespecial
:调用构造函数、私有方法等
抽象类与接口的异同
维度 | 抽象类 | 接口 |
---|---|---|
方法实现 | 可包含具体方法 | Java8后默认方法 |
变量 | 无限制 | 默认public static final |
继承 | 单继承 | 多实现 |
设计目的 | 代码复用 | 行为契约 |
JVM深度剖析
内存模型与GC算法
- 堆分区:新生代(Eden+S0+S1)、老年代
- GC算法:
- 标记-清除(产生碎片)
- 标记-整理(老年代常用)
- 复制算法(新生代)
类加载机制
双亲委派模型流程:
- 加载:获取二进制字节流
- 验证:文件格式、元数据等
- 准备:分配内存并初始化默认值
- 解析:符号引用转直接引用
- 初始化:执行
<clinit>
方法
OOM问题排查
java.lang.OutOfMemoryError: Java heap space
:堆内存不足java.lang.OutOfMemoryError: Metaspace
:元空间溢出java.lang.OutOfMemoryError: unable to create new native thread
:线程数超限
并发编程体系
AQS实现原理分析
核心结构:
state
:同步状态(如ReentrantLock的重入次数)CLH队列
:线程等待队列
关键方法:
public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}
ThreadLocal内存泄漏防范
使用弱引用避免Key内存泄漏,但需手动remove()
清理Value。
并发容器源码解读
ConcurrentHashMap
JDK8改进:
- 数组+链表+红黑树
CAS+synchronized
替代分段锁- 扩容时协助迁移
Spring核心技术
IOC容器启动流程
- 初始化
BeanDefinitionReader
- 解析配置生成
BeanDefinition
- 执行
BeanFactoryPostProcessor
- 实例化单例Bean(依赖注入、初始化回调)
AOP动态代理实现
- JDK动态代理:基于接口
- CGLIB:基于子类继承
public Object getProxy() {return Enhancer.create(target.getClass(), (MethodInterceptor)(obj, method, args, proxy) -> {System.out.println("Before method");Object result = proxy.invokeSuper(obj, args);System.out.println("After method");return result;});
}
分布式系统设计
CAP理论公式
分布式系统最多满足两个特性:
一致性(C) + 可用性(A) + 分区容错性(P) ≤ 2
Kafka高可用设计
- 分区副本机制(ISR列表)
- 生产者ACK配置(0/1/all)
- 消费者偏移量管理
分布式ID生成方案
- UUID:无序,索引效率低
- 数据库自增序列:存在单点瓶颈
- Snowflake算法:
- 1位符号位 + 41位时间戳 + 10位机器ID + 12位序列号
系统设计案例
短链服务设计
- 哈希算法:MD5截取/自增ID转62进制
- 301/302重定向选择
- 缓存预热策略
秒杀系统架构
- 分层削峰:页面静态化+读写分离+队列缓冲
- 库存扣减:Redis原子操作或分布式锁
- 限流策略:令牌桶/漏桶算法
Java新特性
虚拟线程(Java21)
轻量级线程,由JVM调度:
Thread.startVirtualThread(() -> {System.out.println("Virtual thread running");
});
GraalVM原生镜像
通过AOT编译生成独立可执行文件:
native-image -jar app.jar