Java中的Collections API - Chamal Weerasinghe - Medium

作者:API传播员 · 2026-01-05 · 阅读时间:6分钟

在Java编程中,当开发者需要在程序中保存和操作一组数据时,他们通常会根据需求选择合适的数据结构。数组是所有编程语言中最基础且最常用的数据结构之一,但在Java中,由于其面向对象的特性,开发者在处理对象集合时需要更高的灵活性。Java的Collections API正是为了解决这一需求而设计的。


Collections API的主要优势

  1. 支持泛型:与数组不同,集合允许创建类型安全的集合,避免类型转换问题。
  2. 动态扩展:数组大小固定,而集合可以根据需要动态扩展,无需手动复制数据。
  3. 灵活的搜索和索引功能:集合提供更高效的索引和搜索功能,而数组只能通过线性搜索。
  4. 元素验证:集合框架内置了避免重复元素的功能,并支持基于自定义标准的验证。
  5. 元素排序:集合API提供了灵活的排序功能,而数组需要开发者自行实现。
  6. 线程安全:集合API提供了多种线程安全的操作,避免数据损坏。
  7. 简化迭代:集合API支持多种迭代方式,无需手动编写复杂的循环。

Collections API的核心接口

  • Iterable:顶级接口,允许集合在for-each循环中使用。
  • Collection:扩展Iterable,定义了添加和删除元素等基本集合操作。
  • List:扩展Collection,表示有序的元素列表,支持通过索引访问元素。
  • Set:扩展Collection,不允许重复元素。
  • SortedSet:扩展Set,提供维护元素顺序的功能。
  • Deque:扩展Collection,表示双端队列,支持从两端添加和移除元素。
  • Map<K, V>:以键值对的形式存储数据,键唯一,值可重复。

使用列表(List)

ArrayListList<E>接口的实现之一,以下是其初始化和使用示例:

// 创建空的ArrayList
List personListOne = new ArrayList();
// 创建具有预定义大小的ArrayList
List personListTwo = new ArrayList(10);
// 从现有对象创建只读List
List personListThree = List.of(personOne, personTwo);

需要注意的是,尝试向只读的ArrayList添加元素时,会抛出UnsupportedOperationException异常。


使用集合(Set)

HashSetSet<E>接口的实现,以下是创建HashSet的几种方式:

// 创建空的HashSet
Set personSetOne = new HashSet();
// 创建具有初始大小的HashSet
Set personSetTwo = new HashSet(10);
// 从ArrayList创建HashSet(会去除重复元素)
Set personSetUsingList = new HashSet(personListOne);
// 创建只读HashSet
Set readOnlyPersonSet = Set.of(personOne, personTwo);

此外,还可以通过指定“负载因子”来创建HashSet

Set setOfSpecialPersons = new HashSet(10, 0.85f);

负载因子决定哈希表在扩容前的填充程度,默认值为0.75。


使用双端队列(Deque)

ArrayDequeDeque<E>接口的实现,支持从两端添加和移除元素。以下是常用方法示例:

  • offerFirst:从队列头部添加元素。
  • pollFirst:移除并返回队列头部的元素。
  • peekFirst:获取队列头部的元素,但不移除。
  • offerLast:从队列尾部添加元素。
  • pollLast:移除并返回队列尾部的元素。
  • peekLast:获取队列尾部的元素,但不移除。

需要注意的是,ArrayDeque不允许插入null元素。


使用映射(Map)

HashMap<K, V>Map接口的实现,其键必须唯一,值可以重复。以下是常见操作示例:

Map personMap = new HashMap();
personMap.put("key1", personOne);
personMap.put("key2", personTwo);

HashMap的迭代方式与其他集合不同,通常通过以下两种方式进行:

  1. 使用entrySet()方法。
  2. 使用keySet()方法。

集合的线程安全

为了防止多线程环境下的数据损坏,Collections API提供了以下解决方案:

  1. 不可修改集合:将集合设置为只读,性能高但无法修改。
   Collections.unmodifiableSet(peopleSet);
   Collections.unmodifiableMap(peopleMap);
   Collections.unmodifiableList(peopleList);
  1. 同步集合:通过同步机制保证线程安全,但会降低性能。
   Collections.synchronizedSet(peopleSet);
   Collections.synchronizedMap(peopleMap);
   Collections.synchronizedList(peopleList);
  1. 写时复制集合:为每个线程创建集合副本,避免数据冲突,但会消耗更多内存。
   new CopyOnWriteArraySet(peopleSet);
   new CopyOnWriteArrayList(peopleList);

对于Map,可以使用ConcurrentHashMap实现类似功能:

new ConcurrentHashMap(peopleMap);

其他有用功能

Collections API还提供了一些实用方法:

  • Collections.fill():用指定值填充集合。
  Collections.fill(peopleList, new Person("Lisa", "Vicari"));
  • Collections.binarySearch():在集合中执行二分查找。
  Person foundPerson = Collections.binarySearch(peopleList, personOne);
  • Collections.sort():对集合进行排序。
  Collections.sort(peopleList);
  • Collections.reverse():反转集合的顺序。
  Collections.reverse(peopleList);
  • Collections.shuffle():随机打乱集合中的元素。
  Collections.shuffle(peopleList);

通过Java的Collections API,开发者可以高效地管理和操作各种数据集合,同时利用其丰富的功能提升代码的灵活性和可维护性。

原文链接: https://chamalwr.medium.com/collections-api-in-java-6f43dbf28d44