【Java核心技术/基础】30道Java集合框架面试题及答案
Java集合框架30道核心面试题与答案
1. Java集合框架的主要组成部分是什么?
答案:
- Collection接口:List、Set、Queue
- Map接口:HashMap、TreeMap等
- 工具类:Collections、Arrays
2. List、Set、Map的区别?
答案:
- List:有序、可重复,通过索引访问
- Set:无序、不可重复
- Map:键值对存储,键不可重复
3. ArrayList和LinkedList的区别?
答案:
- ArrayList:基于动态数组,随机访问快(O(1)),插入删除慢(O(n))
- LinkedList:基于双向链表,随机访问慢(O(n)),插入删除快(O(1))
4. HashMap的工作原理?
答案:
- 基于数组+链表/红黑树实现
- 通过hashCode()计算桶位置
- 使用equals()解决哈希冲突
- JDK8后当链表长度>8时转为红黑树
5. HashMap和HashTable的区别?
答案:
- HashMap:线程不安全,允许null键值,效率高
- HashTable:线程安全,不允许null键值,效率低
6. ConcurrentHashMap的实现原理?
答案:
- JDK7:分段锁(Segment)
- JDK8:CAS + synchronized锁单个桶
- 更好的并发性能
7. HashSet的实现原理?
答案:
- 基于HashMap实现
- 元素存储在HashMap的key中
- value使用固定的Object对象
8. 如何保证集合的线程安全?
答案:
- 使用Collections.synchronizedXXX()包装
- 使用ConcurrentHashMap、CopyOnWriteArrayList等
- 使用Vector、HashTable(不推荐)
9. Comparable和Comparator的区别?
答案:
- Comparable:自然排序,实现compareTo()方法
- Comparator:定制排序,实现compare()方法
// Comparable示例
class Person implements Comparable<Person> {public int compareTo(Person other) {return this.name.compareTo(other.name);}
}// Comparator示例
Comparator<Person> byAge = (p1, p2) -> p1.getAge() - p2.getAge();
10. fail-fast和fail-safe机制?
答案:
- fail-fast:快速失败,检测到并发修改抛出ConcurrentModificationException
- fail-safe:安全失败,在副本上操作,不抛出异常
11. ArrayList的扩容机制?
答案:
- 初始容量10
- 扩容公式:newCapacity = oldCapacity + (oldCapacity >> 1)
- 即每次扩容为原来的1.5倍
12. HashMap的扩容机制?
答案:
- 默认初始容量16,负载因子0.75
- 当元素数量 > 容量 × 负载因子时扩容
- 扩容为原来的2倍:newCap = oldCap << 1
13. TreeMap和HashMap的区别?
答案:
- HashMap:基于哈希表,无序,O(1)时间复杂度
- TreeMap:基于红黑树,按键排序,O(log n)时间复杂度
14. 如何选择List的实现类?
答案:
- 查询多:ArrayList
- 增删多:LinkedList
- 线程安全:CopyOnWriteArrayList
15. Iterator和ListIterator的区别?
答案:
- Iterator:单向遍历,可删除元素
- ListIterator:双向遍历,可增删改元素
16. 如何实现集合的排序?
答案:
// 自然排序
Collections.sort(list);// 定制排序
Collections.sort(list, comparator);// Stream API排序
list.stream().sorted().collect(Collectors.toList());
17. Arrays.asList()的注意事项?
答案:
- 返回的List大小固定,不能增删
- 修改数组会影响List,反之亦然
- 基本类型数组会被当作单个元素
18. Collection和Collections的区别?
答案:
- Collection:集合接口
- Collections:集合工具类
19. 什么是弱哈希映射(WeakHashMap)?
答案:
- 当键对象没有其他引用时,会被垃圾回收器回收
- 适用于缓存场景
20. LinkedHashMap的特点?
答案:
- 保持插入顺序或访问顺序
- 通过双向链表维护顺序
- 可用于实现LRU缓存
21. CopyOnWriteArrayList的原理?
答案:
- 写时复制,写操作在副本上进行
- 读操作无锁,适合读多写少场景
- 写操作加锁,保证线程安全
22. PriorityQueue的实现原理?
答案:
- 基于二叉堆实现
- 可自然排序或定制排序
- 队首元素总是优先级最高的
23. 如何避免ConcurrentModificationException?
答案:
- 使用Iterator的remove()方法
- 使用并发集合类
- 遍历时不修改集合
24. EnumSet和EnumMap的特点?
答案:
- EnumSet:专为枚举设计的高效Set
- EnumMap:专为枚举设计的高效Map
- 性能优于普通集合
25. 什么是IdentityHashMap?
答案:
- 使用==而不是equals()比较键
- 允许键重复(如果不是同一对象)
- 特殊场景使用
26. 集合的遍历方式有哪些?
答案:
// 1. for循环
for (int i = 0; i < list.size(); i++) {}// 2. 增强for循环
for (String item : list) {}// 3. Iterator
Iterator<String> it = list.iterator();// 4. forEach
list.forEach(item -> {});// 5. Stream
list.stream().forEach(item -> {});
27. 如何实现LRU缓存?
答案:
class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}
}
28. 集合的线程安全方案比较?
答案:
- synchronizedXXX:粗粒度锁,性能较差
- ConcurrentHashMap:细粒度锁,性能较好
- CopyOnWriteArrayList:读无锁,写复制,适合读多写少
29. Stream API在集合中的应用?
答案:
List<String> result = list.stream().filter(s -> s.startsWith("A")).map(String::toUpperCase).sorted().collect(Collectors.toList());
30. 如何设计不可变集合?
答案:
// JDK9之前
List<String> list = Collections.unmodifiableList(new ArrayList<>());// JDK9+
List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b");
Map<String, String> map = Map.of("key", "value");
这些题目涵盖了Java集合框架的核心知识点,掌握它们将有助于在面试中更好地展示你的Java基础能力。