【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;
    }
    
    @Override
    protected 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基础能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anneCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值