Collection和Collections的区别
特性 | Collection | Collections |
---|---|---|
类型 | 接口 | 工具类 |
功能 | 定义了集合的基本操作,表示集合对象 | 提供了静态方法,操作集合或生成集合对象 |
包位置 | java.lang | java.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 的工作原理:
- 将数组分成若干个 run(子数组)。
- 通过插入排序对每个 run 排序。
- 将相邻的 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。