Java集合面试清单:List与Set的深度解析与生活案例

List接口:有序可重复的集合

List的特点是有序且允许重复元素,常用实现类包括ArrayList和LinkedList。ArrayList基于动态数组实现,查询效率高;LinkedList基于双向链表实现,增删效率高。

生活案例:想象一个购物清单,可以重复添加相同商品(如3瓶牛奶),且顺序固定。ArrayList类似在纸上逐条记录,快速查找但修改麻烦;LinkedList类似用便签纸随时插入或移除条目。

List<String> shoppingList = new ArrayList<>();
shoppingList.add("牛奶"); // 允许重复
shoppingList.add("牛奶");
System.out.println(shoppingList.get(0)); // 快速访问
Set接口:无序唯一的集合

Set的核心特性是元素唯一性,常用实现类有HashSet、LinkedHashSet和TreeSet。HashSet基于哈希表实现,查询时间复杂度O(1);TreeSet基于红黑树实现自动排序。

生活案例:考虑一个身份证管理系统,每人身份证号必须唯一。HashSet像快速归档的文件夹,不关心顺序;TreeSet像按号码排序的文件柜。

Set<String> idCards = new HashSet<>();
idCards.add("110101199003077856");
idCards.add("110101199003077856"); // 自动去重
System.out.println(idCards.size()); // 输出1
底层实现原理对比

ArrayList扩容机制:默认初始容量10,扩容时增长50%(JDK1.8+)。HashMap的链表转红黑树阈值是桶中元素超过8且表长度≥64。

HashSet的存储实质是HashMap的key,所有value指向同一个静态对象:

private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
线程安全问题与解决方案

Vector和Hashtable通过synchronized方法实现线程安全,但性能较差。推荐使用Collections工具类或JUC包下的并发容器:

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Set<String> concurrentSet = new CopyOnWriteArraySet<>();
实际应用场景分析

List适用场景:

  • 需要保留插入顺序(如聊天记录时间线)
  • 允许重复数据(如商品评价列表)

Set适用场景:

  • 去重需求(如用户标签系统)
  • 快速存在性判断(如敏感词过滤)
高频面试问题示例
  1. ArrayList与LinkedList在百万级数据下的性能差异?

    • 随机访问:ArrayList O(1) vs LinkedList O(n)
    • 头部插入:ArrayList O(n) vs LinkedList O(1)
  2. HashSet如何保证元素唯一性?

    • 依赖hashCode()和equals()方法
    • 先比较哈希值,再通过equals确认
  3. TreeSet的自然排序如何实现?

    • 元素必须实现Comparable接口
    • 或创建时传入Comparator对象
性能优化技巧

针对List:

  • 预估数据量时指定初始容量避免扩容
  • 大量删除操作时考虑使用Iterator

针对Set:

  • 重写hashCode()方法避免哈希冲突
  • 自定义对象实现Comparable接口提升TreeSet效率
Java8+新特性应用

利用Stream API进行集合操作:

List<String> distinctList = list.stream()
                               .distinct()
                               .collect(Collectors.toList());

Set<Integer> filteredSet = set.stream()
                             .filter(x -> x > 100)
                             .collect(Collectors.toSet());
总结对比表

| 特性 | List | Set | |---------------------|----------------------|----------------------| | 元素顺序 | 保留插入顺序 | 不保证(除Linked/Tree)| | 重复元素 | 允许 | 禁止 | | 典型实现类 | ArrayList/LinkedList | HashSet/TreeSet | | 时间复杂度(查询) | ArrayList:O(1) | HashSet:O(1) | | 线程安全版本 | CopyOnWriteArrayList | CopyOnWriteArraySet |

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐