Collection 与 Collections

169 阅读2分钟

Java 中的 Collection 和 Collections 是两个完全不同的概念,初学者常容易混淆。以下从定义、作用、设计目的三个维度进行对比:

一、基本定义

对比项CollectionCollections
类型接口(Interface)工具类(Utility Class)
包路径java.util.Collectionjava.util.Collections
继承关系集合框架的根接口之一,被 List、Set、Queue 继承被 final 修饰,不可继承,所有方法均为静态
设计目的定义集合操作的通用规范(如添加、删除、遍历)提供集合操作的静态工具方法(如排序、查找、同步)

二、核心功能对比

1. Collection 接口
  • 功能定位:定义集合的基础行为和属性。

  • 核心方法

    boolean add(E e);             // 添加元素
    boolean remove(Object o);     // 删除元素
    boolean contains(Object o);   // 判断包含
    Iterator<E> iterator();       // 获取迭代器
    int size();                   // 获取大小
    
  • 应用场景:作为集合实现类(如 ArrayList、HashSet)的父接口,统一集合操作规范。

2. Collections 工具类
  • 功能定位:提供静态方法操作集合,无需实例化。

  • 核心方法分类

    方法类型示例方法作用
    排序sort(List<T> list)对 List 进行自然排序(需元素实现 Comparable)
    查找binarySearch(List<? extends Comparable<? super T>> list, T key)二分查找元素位置
    同步包装synchronizedList(List<T> list)将非线程安全的集合转换为线程安全版本
    不可变集合unmodifiableList(List<? extends T> list)返回只读集合视图
    填充与替换fill(List<? super T> list, T obj)用指定元素填充 List 所有位置
    随机化shuffle(List<?> list)随机打乱 List 顺序

三、典型应用场景

1. Collection 的使用
// 声明一个 List(实现了 Collection 接口)
Collection<String> collection = new ArrayList<>();
collection.add("apple");
collection.add("banana");
for (String element : collection) {
    System.out.println(element);
}
2. Collections 的使用
// 排序操作
List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);
Collections.sort(numbers);  // 输出:[1, 2, 3, 4, 5]

// 线程安全包装
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

// 查找元素
int index = Collections.binarySearch(numbers, 3);  // 返回索引 2

// 填充操作
Collections.fill(numbers, 0);  // 所有元素变为 0

四、常见误区与注意事项

  1. 拼写错误

    • 注意 Collection 是接口名,而 Collections 是工具类名,二者仅差一个字母 s
  2. 同步包装的局限性

    • Collections.synchronizedList() 仅保证单个操作的线程安全,复合操作(如先检查再操作)仍需外部同步:

      List<String> list = Collections.synchronizedList(new ArrayList<>());
      synchronized (list) {  // 复合操作需手动同步
          if (!list.isEmpty()) {
              list.remove(0);
          }
      }
      
  3. 不可变集合的误用

    • Collections.unmodifiableList() 返回的集合不可修改,若尝试调用修改方法(如 add())会抛出 UnsupportedOperationException
  4. 性能考虑

    • 优先使用 Arrays.sort() 对数组排序,性能优于 Collections.sort() 对 List 排序(因为减少了装箱拆箱)。

五、总结

维度CollectionCollections
本质接口,定义行为规范工具类,提供静态方法
用途作为集合实现类的父接口操作集合的工具方法
使用方式通过实现类实例化使用直接调用静态方法,无需实例化
核心价值统一集合操作的接口规范简化集合的常见操作,提高开发效率