抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

List 接口

特点:

  • 有序集合(按插入顺序排列)
  • 允许重复元素
  • 支持按索引访问元素

主要实现类:

  • ArrayList:基于动态数组实现,随机访问高效,插入删除较慢
  • LinkedList:基于双向链表实现,随机访问较慢,插入删除高效,实现了Queue接口
  • Vector:与ArrayList类似,但线程安全(方法使用synchronized修饰)
  • Stack:Vector的子类,实现了LIFO(后进先出)栈

使用场景:

  • 需要按插入顺序保存数据时
  • 需要频繁按位置访问元素时(ArrayList)
  • 需要频繁在两端插入或删除元素时(LinkedList)

Set 接口

特点:

  • 不允许重复元素
  • 无序集合(除LinkedHashSet外)
  • 最多只能有一个 null 元素

主要实现类:

  • HashSet:基于HashMap 实现,无序,查找效率高 $O(1)$
  • LinkedHashSet:基于 LinkedHashMap 实现,维护插入顺序,查找效率较高
  • TreeSet:基于 TreeMap(红黑树)实现,元素按自然顺序或指定比较器排序,查找效率 $O(log n)$

使用场景:

  • 需要去重时
  • 需要高效判断元素是否存在时(HashSet)
  • 需要保持插入顺序且去重时(LinkedHashSet)
  • 需要元素保持排序状态时(TreeSet)

Queue 接口

特点:

  • 通常(但不一定)按FIFO(先进先出)方式排列元素
  • 不同于其他集合,Queue 提供了额外的插入、提取和检查操作

主要实现类:

  • LinkedList:双向队列实现,可用作FIFO队列
  • PriorityQueue:基于优先级堆的优先队列,元素按自然顺序或指定比较器排序
  • ArrayDeque:基于动态数组的双端队列,比LinkedList更高效
  • ConcurrentLinkedQueue:线程安全的非阻塞队列

使用场景:

  • 需要FIFO数据结构时
  • 需要基于优先级处理元素时(PriorityQueue)
  • 需要双端队列操作时(ArrayDeque)
  • 多线程环境下的队列操作(ConcurrentLinkedQueue)

Map 接口

特点:

  • 键值对映射关系
  • 键不能重复,每个键最多映射一个值
  • 不同于 Collection 接口的其他三种集合类型

主要实现类:

  • HashMap:基于哈希表实现,无序,高效,允许 null 键和值
  • LinkedHashMap:维护插入顺序或访问顺序,性能略低于 HashMap
  • TreeMap:基于红黑树实现,键按自然顺序或指定比较器排序
  • Hashtable:与 HashMap 类似,但线程安全且不允许 null 键和值
  • ConcurrentHashMap:线程安全的 HashMap,性能优于 Hashtable

使用场景:

  • 需要键值对映射时
  • 需要高效查找时(HashMap)
  • 需要保持插入顺序时(LinkedHashMap)
  • 需要按键排序时(TreeMap)
  • 多线程环境下(ConcurrentHashMap)

集合框架性能比较

集合类型 查找 插入/删除 有序性 线程安全
ArrayList $O(1)$ $O(n)$ 是(插入顺序)
LinkedList $O(n)$ $O(1)$ 是(插入顺序)
HashSet $O(1)$ $O(1)$
LinkedHashSet $O(1)$ $O(1)$ 是(插入顺序)
TreeSet $O(log n)$ $O(log n)$ 是(排序顺序)
HashMap $O(1)$ $O(1)$
LinkedHashMap $O(1)$ $O(1)$ 是(插入顺序)
TreeMap $O(log n)$ $O(log n)$ 是(键排序)
ConcurrentHashMap $O(1)$ $O(1)$

评论