Java 集合框架试题大全 + 答案:ArrayList、HashMap 等高频考点逐题讲

Java 集合框架是面试和开发中的核心知识点,掌握它能显著提升编程能力。本文原创整理高频试题,针对 ArrayList、HashMap 等关键组件逐题讲解答案,帮助读者系统学习。所有内容基于 Java 标准库,确保准确可靠。


试题 1:ArrayList 的内部实现机制是什么?它的扩容策略如何?

问题描述:ArrayList 是 Java 中常用的动态数组,请解释其底层数据结构,并说明当元素数量超过容量时如何扩容。

答案
ArrayList 底层基于数组实现,使用 Object[] elementData 存储元素。初始容量默认为 10(如果未指定)。当添加元素导致容量不足时,会触发扩容:

  • 新容量计算公式为:旧容量 + (旧容量 >> 1),即旧容量的 1.5 倍。
  • 扩容过程涉及创建新数组,并将原数组元素复制到新数组中。

代码示例:

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 15; i++) {
            list.add(i); // 添加第 11 个元素时触发扩容
        }
        System.out.println("当前容量: " + list.size());
    }
}

关键点

  • 扩容操作耗时,建议在初始化时指定预估容量(如 new ArrayList<>(100))以减少扩容次数。
  • ArrayList 支持快速随机访问(时间复杂度 $O(1)$),但插入和删除元素时(尤其是在中间位置)可能导致元素移动,平均时间复杂度 $O(n)$。

试题 2:HashMap 的工作原理是什么?如何处理哈希冲突?

问题描述:HashMap 是 Java 中基于哈希表的 Map 实现,请解释其存储机制,并描述在键的哈希码冲突时如何解决。

答案
HashMap 底层使用数组 + 链表/红黑树结构:

  • 每个数组元素称为“桶”(bucket),存储键值对。
  • 当插入键值对时,先计算键的哈希码(通过 hashCode() 方法),再通过哈希函数映射到桶索引。
  • 如果多个键映射到同一桶(哈希冲突),HashMap 使用链表存储冲突元素;当链表长度超过阈值(默认为 8)时,链表转换为红黑树,以优化查询性能(时间复杂度从 $O(n)$ 降到 $O(\log n)$)。

代码示例:

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("orange", 3);
        System.out.println("获取 apple 的值: " + map.get("apple"));
    }
}

关键点

  • 负载因子(默认 0.75)控制扩容:当元素数量超过 容量 × 负载因子 时,HashMap 扩容至原容量的 2 倍。
  • Java 8 优化了冲突处理,引入红黑树避免链表过长导致的性能下降。

试题 3:ArrayList 和 LinkedList 在性能上有何区别?适用场景分别是什么?

问题描述:比较 ArrayList 和 LinkedList 在常见操作(如访问、插入、删除)上的时间复杂度,并给出各自的最佳使用场景。

答案

操作 ArrayList LinkedList
随机访问 $O(1)$ $O(n)$
头部插入 $O(n)$ $O(1)$
尾部插入 $O(1)$ 摊销 $O(1)$
中间删除 $O(n)$ $O(1)$
  • ArrayList 适用场景:频繁随机访问元素(如数据库查询结果处理),内存占用小。
  • LinkedList 适用场景:频繁在头部或中间插入/删除元素(如实现队列或栈),但访问速度慢。

示例场景

  • 使用 ArrayList:处理静态数据列表,如读取配置文件。
  • 使用 LinkedList:实现 LRU 缓存,需快速插入和删除头部元素。

试题 4:HashMap 和 Hashtable 的主要区别是什么?

问题描述:HashMap 和 Hashtable 都实现了 Map 接口,请列出它们的关键差异,并解释为何 HashMap 更常用。

答案

特性 HashMap Hashtable
线程安全 非线程安全 线程安全(方法同步)
Null 值支持 允许键和值为 null 不允许 null 键或值
性能 更高(无锁开销) 较低(同步开销)
继承类 继承 AbstractMap 继承 Dictionary
  • 为何 HashMap 更常用:在单线程环境下,HashMap 性能更优;多线程场景可用 ConcurrentHashMap 替代 Hashtable。
  • 注意:Hashtable 是遗留类,新代码中不推荐使用。

结语

掌握 Java 集合框架的核心组件如 ArrayList 和 HashMap,能帮助开发者编写更健壮的代码。本文试题覆盖高频考点,建议结合实践加深理解:

  • 多写单元测试验证集合行为。
  • 阅读 JDK 源码(如 ArrayList.javaHashMap.java)了解内部细节。
    通过系统学习,读者能提升面试竞争力,并在实际项目中灵活应用。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐