一、Java容器类的整体架构

Java容器类主要位于java.util包下,核心分为两大体系,目的是解决不同的数据储存需求

体系核心接口存储特点
集合(Collection)Collection储存单个元素的集合
映射(Map)Map存储键值对(Key-Value)

注意:Map并不继承Collection接口,是独立的顶级接口,但是通常和Collection一起被归为“容器类”。

二、核心接口与实现类详解

1. Collection 体系
(1)List:有序、可重复、有索引
  • 核心特性:元素按插入顺序排列,允许重复元素,支持通过索引(下标)访问。
  • 常用实现类:
    • ArrayList:
      • 底层:动态数组(数组扩容)。
      • 特点:查询快(直接通过索引定位)、增删慢(需要移动元素)、非线程安全、效率高。
      • 适用场景:频繁查询、少量增删的场景(如数据展示列表)。
    • LinkedList:
      • 底层:双向链表。
      • 特点:查询慢(需要遍历链表)、增删快(仅需修改节点引用)、非线程安全。
      • 适用场景:频繁增删、少量查询的场景(如队列 / 栈实现)。
    • Vector:
      • 底层:动态数组(与 ArrayList 类似)。
      • 特点:线程安全(方法加了synchronized)、效率低(已被淘汰,推荐用CopyOnWriteArrayList替代)。
(2)Set:无序、不可重复、无索引
  • 核心特性:元素无序(存储顺序≠插入顺序),不允许重复元素,无索引(不能通过下标访问)。
  • 常用实现类:
    • HashSet:
      • 底层:哈希表(HashMap 的键)。
      • 特点:保证元素唯一(依赖hashCode()和equals())、查询 / 增删效率高、非线程安全、无序。
      • 适用场景:快速去重、无需排序的场景。
    • LinkedHashSet:
      • 底层:哈希表 + 双向链表。
      • 特点:继承 HashSet,额外维护插入顺序,有序且唯一。
    • TreeSet:
      • 底层:红黑树(TreeMap 的键)。
      • 特点:元素自动排序(自然排序或自定义 Comparator)、唯一、查询 / 增删效率中等。
(3)Queue:队列(先进先出 FIFO)
  • 核心特性:模拟队列结构,专注于元素的入队 / 出队操作。
  • 常用实现类:
    • LinkedList:实现了 Queue 接口,常用作非线程安全的队列。
    • ArrayDeque:基于数组的双端队列(Deque),效率比 LinkedList 高,支持首尾增删。
    • PriorityQueue:优先级队列,元素按优先级排序(而非插入顺序)。
    • ConcurrentLinkedQueue:线程安全的无界队列(适用于高并发)。
2. Map 体系
  • 核心特性:存储键值对(Key-Value),Key 唯一(重复 Key 会覆盖 Value),Value 可重复。
  • 常用实现类:
    • HashMap:
      • 底层:哈希表(数组 + 链表 / 红黑树,JDK8 后优化)。
      • 特点:无序、Key 唯一、非线程安全、效率高(允许 Key/Value 为 null)。
      • 适用场景:绝大多数键值对存储场景(如缓存)。
    • LinkedHashMap:
      • 底层:哈希表 + 双向链表。
      • 特点:继承 HashMap,维护插入顺序或访问顺序,有序且 Key 唯一。
    • TreeMap:
      • 底层:红黑树。
      • 特点:Key 自动排序(自然排序 / 自定义 Comparator)、唯一、无 null Key。
    • Hashtable:
      • 底层:哈希表。
      • 特点:线程安全(方法加 synchronized)、效率低、不允许 Key/Value 为 null(已被淘汰,推荐用ConcurrentHashMap)。
    • ConcurrentHashMap:
      • 底层:分段哈希表(JDK7)/CAS + 同步块(JDK8)。
      • 特点:线程安全、高并发下效率远高于 Hashtable,支持 null Value(Key 不可为 null)。

三、线程安全的容器类

日常开发中,上述大部分容器(如 ArrayList、HashMap)是非线程安全的,多线程环境下需使用线程安全的替代类:

  1. 直接包装:通过Collections.synchronizedXxx()方法(如Collections.synchronizedList(new ArrayList<>())),但效率较低。
  2. 专用实现类:
    • List:CopyOnWriteArrayList(写时复制,适合读多写少)。
    • Set:CopyOnWriteArraySet。
    • Map:ConcurrentHashMap(高并发首选)。
    • Queue:ArrayBlockingQueue、LinkedBlockingQueue(阻塞队列,适用于生产者消费者模型)。

四、核心使用示例

1. ArrayList 基本使用
import java.util.ArrayList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        // 添加元素
        list.add("Java");
        list.add("Python");
        list.add("Java"); // 允许重复
        // 通过索引访问
        System.out.println(list.get(0)); // 输出:Java
        // 遍历
        for (String s : list) {
            System.out.println(s);
        }
        // 删除元素
        list.remove(1); // 删除索引1的元素(Python)
    }
}
2. HashMap 基本使用
import java.util.HashMap;
import java.util.Map;

public class MapDemo {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        // 添加键值对
        map.put("张三", 20);
        map.put("李四", 25);
        map.put("张三", 21); // 重复Key,覆盖Value
        // 获取Value
        System.out.println(map.get("张三")); // 输出:21
        // 遍历键值对
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
}

更多推荐