Bootstrap

java Collections 详解

Java Collections Framework (集合框架) 详解

Java 集合框架 (Java Collections Framework, JCF) 是一套功能强大且灵活的工具,用于存储和处理一组对象。集合框架为各种数据结构提供了标准实现,如列表 (List)集合 (Set)映射 (Map),极大地简化了数据操作任务。


1. 集合框架的结构

Java 集合框架主要包含以下几个核心接口:

  • Collection:集合的根接口,包含基本操作和特性,子接口包括 ListSetQueue
  • Map:映射接口,用于存储键-值对。
集合框架的层次结构
                Collection
                   |
    ---------------------------------
    |               |               |
   List            Set             Queue
    |               |               |
  ArrayList      HashSet        PriorityQueue
  LinkedList     LinkedHashSet  ArrayDeque
  Vector         TreeSet
                   Map
                    |
     --------------------------------
     |                              |
   HashMap                       SortedMap
   LinkedHashMap                 TreeMap
   WeakHashMap
   IdentityHashMap

2. 主要接口及其实现

2.1 List 接口

List 接口表示一个有序的集合,允许重复元素。List 可以通过索引访问元素。

  • 主要实现类
    • ArrayList
      • 基于动态数组,访问速度快,插入和删除效率相对较低。
      • 适合随机访问场景。
    • LinkedList
      • 基于双向链表,插入和删除效率高,但访问速度较慢。
      • 适合频繁插入、删除操作的场景。
    • Vector
      • 线程安全的动态数组,类似 ArrayList,但性能较低。

示例

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list.get(1)); // 输出: B

2.2 Set 接口

Set 接口表示一个无序集合,不允许重复元素。

  • 主要实现类
    • HashSet
      • 基于哈希表实现,不保证元素的顺序。
      • 插入、删除和查找操作的效率高。
    • LinkedHashSet
      • 保持插入顺序的 HashSet,基于链表和哈希表实现。
    • TreeSet
      • 基于红黑树实现,元素有序,支持排序操作。

示例

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("A"); // 重复元素不会被添加
System.out.println(set); // 输出: [A, B]

2.3 Queue 接口

Queue 接口表示一个队列,通常遵循“先入先出” (FIFO) 原则。

  • 主要实现类
    • PriorityQueue
      • 基于优先级堆实现,元素按自然顺序或自定义比较器排序。
    • ArrayDeque
      • 双端队列,允许在两端插入和删除元素,效率高于 LinkedList

示例

Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.poll(); // 移除并返回队首元素
System.out.println(queue); // 输出: [2]

2.4 Map 接口

Map 接口表示一个键值对集合,每个键最多只能映射到一个值。

  • 主要实现类
    • HashMap
      • 基于哈希表实现,不保证顺序,允许 null 键和值。
      • 适合插入、删除和查找操作。
    • LinkedHashMap
      • 保持插入顺序的 HashMap,使用链表维护顺序。
    • TreeMap
      • 基于红黑树实现,键按自然顺序或自定义顺序排序。
    • WeakHashMap
      • 使用弱引用的哈希表,便于垃圾回收。
    • IdentityHashMap
      • 使用 == 比较键的哈希表,而不是 equals() 方法。

示例

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.get("A")); // 输出: 1

3. 常用方法

3.1 List 接口的方法
  • add(E e): 添加元素到列表末尾。
  • get(int index): 获取指定索引的元素。
  • remove(int index): 移除指定索引的元素。
  • set(int index, E element): 替换指定索引的元素。
  • size(): 返回列表的大小。
3.2 Set 接口的方法
  • add(E e): 添加元素,如果已存在,则不添加。
  • remove(Object o): 移除指定元素。
  • contains(Object o): 检查集合是否包含某元素。
  • size(): 返回集合的大小。
3.3 Queue 接口的方法
  • offer(E e): 添加元素到队列尾部。
  • poll(): 移除并返回队首元素,若队列为空则返回 null
  • peek(): 返回队首元素但不移除,若队列为空则返回 null
3.4 Map 接口的方法
  • put(K key, V value): 添加键值对。
  • get(Object key): 获取指定键的值。
  • remove(Object key): 移除指定键的键值对。
  • containsKey(Object key): 检查是否包含指定键。
  • keySet(): 返回所有键的集合。
  • values(): 返回所有值的集合。

4. 集合工具类:CollectionsArrays

4.1 Collections 类

Collections 是一个工具类,提供了许多静态方法来操作集合,如排序、搜索、同步化等。

  • Collections.sort(List<T> list): 对列表进行排序。
  • Collections.shuffle(List<?> list): 随机打乱列表中的元素。
  • Collections.max(Collection<? extends T> coll): 返回集合中的最大元素。
  • Collections.min(Collection<? extends T> coll): 返回集合中的最小元素。

示例

List<Integer> numbers = Arrays.asList(5, 2, 8, 1);
Collections.sort(numbers);
System.out.println(numbers); // 输出: [1, 2, 5, 8]
4.2 Arrays 类

Arrays 类提供了一些方法来操作数组,如排序、搜索、转换为集合等。

  • Arrays.asList(T... a): 将数组转换为 List
  • Arrays.sort(int[] a): 对数组进行排序。
  • Arrays.binarySearch(int[] a, int key): 使用二分查找法查找元素。

示例

int[] arr = {5, 2, 8, 1};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 5, 8]

5. 线程安全的集合

  • 使用 Collections.synchronizedListsynchronizedSetsynchronizedMap
    • List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
  • 使用并发集合类 (在 java.util.concurrent 包中)
    • ConcurrentHashMap:线程安全的 HashMap
    • CopyOnWriteArrayList:线程安全的 ArrayList

6. 迭代集合

6.1 使用 Iterator 迭代

Iterator 是一个用于遍历集合的接口,支持 remove() 方法来安全地移除元素。

示例

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}
6.2 使用增强型 for 循环

示例

for (String item : list) {
    System.out.println(item);
}

7. 总结与选择指南

  • List:需要有序集合时使用,选择 ArrayList(访问快)或 LinkedList(插入、删除快)。
  • Set:需要无序、不重复集合时使用,选择 HashSet(无序)或 TreeSet(有序)。
  • Queue:需要先进先出的集合时使用,选择 LinkedList
    PriorityQueue
  • Map:需要键值对集合时使用,选择 HashMap(无序)或 TreeMap(有序)。

Java 集合框架为数据处理提供了丰富的工具,理解各个实现类的特性和用法,能帮助你写出高效、简洁的代码。

;