List、Set、Map三种集合区别 [Java]

Marimo_z
2025-05-28 / 0 评论 / 1 阅读 / 正在检测是否收录...

1. List(列表)

  • 核心特性

    • 有序集合:元素按插入顺序存储,可通过索引(下标)访问
    • 允许重复元素
  • 常见实现类

    • ArrayList:基于动态数组,随机访问快(O(1)),插入/删除慢(需移动元素)
    • LinkedList:基于双向链表,插入/删除快(O(1)),随机访问慢(O(n))
    • Vector:线程安全版ArrayList(已过时,建议用CopyOnWriteArrayList
  • 典型方法

    list.add("A");      // 添加元素
    list.get(0);        // 通过索引访问
    list.remove("A");   // 删除元素
  • 使用场景
    需要保留插入顺序、允许重复元素,或需频繁通过索引访问(如用户操作记录、动态数组)

2. Set(集合)

  • 核心特性

    • 元素唯一性:不允许重复(依赖equals()hashCode()
    • 无序性:不保证存储顺序(LinkedHashSetTreeSet除外)
  • 常见实现类

    • HashSet:基于哈希表,查询/插入平均O(1),无序
    • LinkedHashSet:维护插入顺序的HashSet
    • TreeSet:基于红黑树,元素按自然顺序或Comparator排序(O(log n))
  • 典型方法

    set.add("A");       // 添加元素(重复返回false)
    set.contains("A");  // 检查存在性
    set.remove("A");    // 删除元素
  • 使用场景
    需要去重(如用户ID集合)、快速存在性检查,或需排序(TreeSet

3. Map(映射)

  • 核心特性

    • 键值对存储:元素以Key-Value形式存储
    • 键唯一性:键不允许重复(值可重复)
    • 无序性:不保证键的顺序(LinkedHashMapTreeMap除外)
  • 常见实现类

    • HashMap:基于哈希表,键/值可为null,无序
    • LinkedHashMap:维护插入顺序或访问顺序
    • TreeMap:键按自然顺序或Comparator排序
    • Hashtable:线程安全(已过时,建议用ConcurrentHashMap
  • 典型方法

    map.put("Key", 1);  // 添加键值对
    map.get("Key");     // 通过键获取值
    map.keySet();       // 获取所有键的Set
  • 使用场景
    键值映射(如缓存、字典)、通过键快速查找值

三者的核心区别总结

特性ListSetMap
存储结构单列元素单列元素键值对(双列)
元素顺序有序(插入顺序)无序(实现类可有序)无序(实现类可有序)
元素重复性允许重复元素禁止重复元素键唯一,值可重复
索引访问支持索引(如get(0)不支持索引不支持索引(需通过键)
常见实现类ArrayList/LinkedListHashSet/TreeSetHashMap/TreeMap

选择指南

  • 需要 保留顺序 + 允许重复List
  • 需要 去重 + 快速存在性检查Set
  • 需要 键值对映射Map
  • 需要 排序 → 选择TreeSet/TreeMap
  • 需要 保持插入顺序 → 选择LinkedList/LinkedHashSet/LinkedHashMap
注意:线程安全场景下,建议使用CopyOnWriteArrayList(替代Vector)、ConcurrentHashMap(替代Hashtable),或通过Collections.synchronizedXXX()包装。
1

评论 (0)

取消