Collection和Collections的区别

特性CollectionCollections
类型接口工具类
功能定义了集合的基本操作,表示集合对象提供了静态方法,操作集合或生成集合对象
包位置java.langjava.util
继承关系是集合框架的顶级接口无继承,是个工具类
常用用途创造集合|用于对集合进行操作(例如排序
调用方式通过实现实例化后调用直接调用静态方法

Collections排序内部原理

Java1.2~Java6

  • 算法:

    • 使用合并排序(MergeSort)
  • 特点:

    • 稳定排序:相等的元素在排序后相对位置不会改变
    • 时间复杂度:
      • 最佳情况:O(n log n)
      • 平均情况:O(n log n)
      • 最差情况:O(n log n)
    • 空间复杂度:O(n),需要额外的临时数组存储数据
  • 实现:

    • Collections.sort 内部调用 Arrays.sort,使用归并排序对列表进行排序。

Java 7

  • 算法:

    • 使用了一种称为 TimSort 的算法(自 Java 7 开始)
  • 特点

    • 稳定排序
    • 基于归并排序和插入排序的优化组合
    • 时间复杂度:
      • 最佳情况:O(n)(几乎有序的输入)
      • 平均情况:O(n log n)
      • 最差情况:O(n log n)
    • 空间复杂度:O(n),比原来的归并排序更节省空间
    • 对几乎有序的数据具有更高的性能
  • 实现

    • Collections.sort 调用 Arrays.sort,Arrays.sort 内部切换为 TimSort 实现。
    • TimSort 的工作原理:

      1. 将数组分成若干个 run(子数组)。
      2. 通过插入排序对每个 run 排序。
      3. 将相邻的 run 合并,使用归并排序的方式优化合并。

Java 8

  • 算法:

    • Collections.sort 调用 List.sort,并使用 TimSort 算法。
  • 特点:

    • 稳定排序,和 Java 7 一致。
    • 优化点:
      • 引入了 Lambda 表达式的支持。
      • 可以直接通过 List.sort 指定排序规则。
  • 实现变更:

    • Collections.sort 的实现改为:
public static <T extends Comparable<? super T>> void sort (List<T> list) {
    list.sort(null);
}

Java 9 及以上

  • 算法:

    • 默认仍然是 TimSort,与 Java 8 相同。
  • 特点:

    • 提升了部分场景的性能,尤其是较小规模数据的排序。
    • 更推荐直接使用 List.sort 方法。
  • 改进方向:

    • List.sort 提供了更现代化的 API,可以直接接受比较器,功能与 Collections.sort 一致,但更具可读性。
    • 举例:
List<String> list = Arrays.asList("Banana", "Apple", "Cherry");
list.sort(String::compareTo); // 推荐使用 List.sort

爱跑步的猕猴桃
1 声望0 粉丝