Collections和Arrays在sort()方法方面有什么区别?我知道Arrays的sort()使用二分查找进行排序,那Collections呢?如何选择使用哪一个呢?
Collections和Arrays在sort()方法方面有什么区别?我知道Arrays的sort()使用二分查找进行排序,那Collections呢?如何选择使用哪一个呢?
除了作用于不同类型的对象(Collections.sort
作用于 List
,而 Arrays.sort
作用于数组),java.util.Collections.sort()
简单地调用 java.util.Arrays.sort()
来进行重要的操作。
此外,值得注意的是,Arrays.sort
使用归并排序算法。
Collections.sort() 操作的是 List,而 Arrays.sort() 操作的是数组。
Arrays.sort() 对基本类型数组使用 双轴快速排序算法,对对象数组使用 归并排序算法 进行排序。
Collections.sort() 的示例:
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(15);
arr.add(10);
arr.add(5);
arr.add(2);
Collections.sort(arr);
Arrays.sort()的示例:
int[] arr = new int[4]
arr[0]=15;
arr[1]=10;
arr[2]=5;
arr[3]=2;
Arrays.sort(arr);
我知道数组的sort()方法使用二分查找进行排序。
不,你并不知道这个。它并不是这样实现的。请参考Javadoc文档。
这个说法甚至没有意义。你不能“使用二分查找进行排序”。只有当数据已经排序时,二分查找才有效。也许你看到的是Arrays.binarySearch()
假定数据已经排好序。
当你处理列表时,使用Collection.sort;当处理数组时,使用Arrays.sort。但是,内部Collection.sort方法只使用了Arrays.sort方法。 现在,基于Timosrt技术而不是归并排序来进行内部排序,因为稳定、自适应的数组在归并排序中需要O(nlogn)次比较,但在Timsort最坏情况下也只需要O(nlogn)次比较,在最坏情况下需要n/2的存储空间,但这不是归并排序技术的情况。
就像其他答案所说的那样,当处理实现 Collection 接口的对象时,应使用 Collections.sort();而当处理数组时,则应使用 Arrays.sort() 方法。
一个相关的问题是,如果要对一组值进行排序,哪种类型的数据结构更好。如果需要使用 List,则建议使用 LinkedList,因为插入操作的时间复杂度为 O(1),而 ArrayList 则为 O(n)。
您还可以选择使用 SortedSet,如果不会有重复值或者希望避免出现重复值的情况。这样您就不必烦恼使用外部排序算法了。
public static void sort(T[] a)
参数:
a - 要排序的数组
实现说明(截断):
public static <T extends Comparable<? super T>> void sort(List list)
参数:
list - 要排序的列表。
实现说明(截断):
Arrays.sort()
可以对连续内存位置中的对象数组进行排序。它适用于数组输入。
Collections.sort()
可以对连续和离散内存位置中的对象进行排序:即它可以处理 ArrayList
和 LinkedList
。 Collections.sort()
内部将 List
转换为对象数组,并调用 Arrays.sort()
进行排序。它总是创建原始列表对象的额外副本。对于输入的 ArrayList
,它创建额外的副本以维护原始数组的可变性。对于输入的 LinkedList
,为了提高性能,会创建一个新的数组。