2026-10-18 08:32:33
以下是针对美团Java面试154道题的核心知识点梳理与解答:
一、Java集合(22题)ArrayList vs Vector
线程安全:Vector所有方法同步,ArrayList非线程安全。
扩容机制:ArrayList默认扩容1.5倍,Vector默认2倍。
性能:ArrayList因无同步开销,性能更高。
ArrayList vs Vector vs LinkedList
ArrayList:基于动态数组,随机访问快(O(1)),插入/删除中间元素慢(O(n))。
Vector:线程安全版ArrayList,性能较低。
LinkedList:基于双向链表,插入/删除快(O(1)),随机访问慢(O(n))。
快速失败(fail-fast) vs 安全失败(fail-safe)
fail-fast:迭代时检测到集合被修改(如ConcurrentModificationException),如ArrayList迭代器。
fail-safe:基于副本操作,不抛异常,如CopyOnWriteArrayList。
HashMap数据结构与原理
数据结构:JDK8前为数组+链表,JDK8后链表长度≥8时转为红黑树。
工作原理:通过hash()计算键的哈希值,定位桶位置;冲突时采用链表或树解决。
扩容条件:当元素数≥容量*负载因子(默认0.75)时扩容为2倍。
List/Map/Set存取特点
List:允许重复,按插入顺序存储,通过索引访问。
Map:键值对存储,键唯一,通过键访问值。
Set:元素唯一,无序(HashSet)或有序(TreeSet)。
Set重复判断
equals():判断逻辑相等性,覆盖equals()的类需同时覆盖hashCode()。
==:判断内存地址是否相同。
规则:若x.equals(y)==true,则x.hashCode()必须等于y.hashCode(),反之不成立。
Heap vs Stack
Heap:存储对象实例,由GC管理,空间大。
Stack:存储局部变量和方法调用,线程私有,空间小。
集合类框架接口
核心接口:Collection(List/Set)、Map。
扩展接口:Queue、Deque、SortedMap等。
HashSet vs TreeSet
HashSet:基于HashMap,无序,性能高(O(1))。
TreeSet:基于红黑树,有序(自然排序或Comparator),性能低(O(log n))。
LinkedHashMap原理
继承HashMap,通过双向链表维护插入顺序或访问顺序(LRU缓存)。
类加载过程
加载:读取.class文件,生成Class对象。
验证:检查文件格式、符号引用等。
准备:分配内存并初始化静态变量。
解析:将符号引用转为直接引用。
初始化:执行静态代码块和静态变量赋值。
GC机制与对象存活判断
可达性分析:从GC Roots(如栈引用、静态变量)出发,不可达对象标记为可回收。
回收算法:标记-清除、复制、标记-整理、分代收集。
垃圾回收器
Serial:单线程,适用于客户端。
Parallel:多线程,注重吞吐量。
CMS/G1:并发收集,减少停顿时间。
内存泄漏与拷贝
内存泄漏:对象仍被引用但无法使用(如静态集合)。
深拷贝:复制对象及所有引用对象(需实现Cloneable)。
浅拷贝:仅复制对象本身(如Object.clone())。
System.gc()与finalize()
System.gc():建议JVM执行GC,不保证立即执行。
finalize():对象被回收前调用,通常用于资源释放(已过时)。
Synchronized原理
锁对象:实例锁(对象头Mark Word)或类锁(Class对象)。
可重入性:同一线程可重复获取锁。
优化:锁膨胀(偏向锁→轻量级锁→重量级锁)、锁消除、锁粗化。
CAS与乐观锁
CAS:比较并交换(Compare-And-Swap),通过Unsafe类实现。
乐观锁:假设无冲突,冲突时重试(如AtomicInteger)。
缺点:ABA问题、自旋开销。
ReentrantLock vs Synchronized
ReentrantLock:支持公平锁、超时、可中断,需手动释放。
Synchronized:非公平锁,自动释放,代码简洁。
线程池核心参数
corePoolSize:核心线程数。
maximumPoolSize:最大线程数。
keepAliveTime:空闲线程存活时间。
workQueue:任务队列(如LinkedBlockingQueue)。
IoC与DI
IoC:控制反转,由容器管理对象生命周期。
DI:依赖注入,通过构造器/Setter注入依赖。
Bean生命周期
实例化→属性赋值→Aware接口回调→BeanPostProcessor前置处理→初始化→BeanPostProcessor后置处理→使用→销毁。
自动装配模式
byName:按属性名匹配Bean。
byType:按类型匹配。
constructor:按构造器参数类型匹配。
核心特性
自动配置:根据依赖自动配置Bean。
Starter依赖:简化依赖管理(如spring-boot-starter-web)。
Actuator:监控端点(如/health、/metrics)。
热部署
Spring Loaded或DevTools:修改代码后自动重启。
非阻塞I/O:通过Channel和Selector实现多路复用。
零拷贝:减少数据在内核空间与用户空间的拷贝(如FileRegion.transferTo())。
数据结构与应用场景
String:缓存、计数器。
Hash:存储对象字段。
List:消息队列、最新消息排行。
Set:标签、共同关注。
ZSet:排行榜、延迟队列。
持久化
RDB:定时快照,适合备份。
AOF:记录写操作,适合数据安全要求高的场景。
单例模式:饿汉式、懒汉式(双重检查锁)。
工厂模式:简单工厂、工厂方法、抽象工厂。
观察者模式:事件驱动(如GUI监听)。
策略:通过LRU算法或访问频率筛选热点数据,结合Redis的过期时间自动淘汰冷数据。
以上内容覆盖了美团Java面试的核心知识点,建议结合实际项目经验深入理解。