【发布时间】:2018-12-27 03:33:06
【问题描述】:
以下代码的目标是对 300,000 个 int 数字进行排序。我发现 ArrayList 的 sort() 的持续时间小于 Arrays 的 sort()。在内部,它们使用相同的算法进行排序。 ArrayList 使用 Arrays 的 sort() 对其元素数据进行排序。
public class EasySort {
public static void main(String args[]) {
// Read data from file, number split by ","
FileReader fr = null;
try {
fr = new FileReader("testdata2.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader bufferedReader=new BufferedReader(fr);
String line=null;
try {
line=bufferedReader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// use split method to generate a String array to save numbers
String[] strArray=line.split(",");
//Convert string array to ArrayList<Integer>
ArrayList<Integer> integerList=new ArrayList<>();
for(String str:strArray){
integerList.add(Integer.parseInt(str));
}
//Sort by ArrayList
long t0=System.currentTimeMillis();
integerList.sort(((p1,p2)->(p1.intValue()<p2.intValue()?-1:p1.intValue()>p2.intValue()?1:0)));
long t1=System.currentTimeMillis();
System.out.println("ArrayList Sort duration:"+(t1-t0));
//Convert string array to Integer array
Integer[] integerArray=new Integer[strArray.length];
int i=0;
for(String str:strArray){
integerArray[i++]=Integer.parseInt(str);
}
//Sort by Arrays
t0=System.currentTimeMillis();
Arrays.sort(integerArray, ((p1,p2)->(p1.intValue()<p2.intValue()?-1:p1.intValue()>p2.intValue()?1:0)));
t1=System.currentTimeMillis();
System.out.println("Arrays duration:"+(t1-t0));
}
}
结果如下:
ArrayList 排序持续时间:211
数组持续时间:435
我查看了 ArrayList 的源代码。它在自己的排序方法中使用 Arrays.sort()。
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
因此,在我看来,我的代码应该显示相同的持续时间。但是我尝试了很多次,结果都差不多。发生了什么?
Java 版本:8
操作系统:Windows 7
【问题讨论】:
-
您使用的是哪个 Java 版本?
-
List<Integer>可以在没有比较器的情况下进行排序(Integer已经实现了Comparable);所以,integerList.sort(null)可以。而且,是否需要创建Integer [] integerArray?使用原始int的数组;并使用Arrays.sort(intArray)。您可能会看到不同的结果。 -
您尝试了多少次?我用
ArrayList<Integer>和Integer[]在我的机器上测试过,它们几乎是同一时间。
标签: java arrays sorting arraylist