Le but du code suivant pour trier 300.000 numéros int. Je trouve que la durée de la sorte de ArrayList () est inférieure à Arrays' sort (). En interne, ils utilisent le même algorithme pour trier. ArrayList utilise le genre de tableaux () pour trier les données d'éléments.
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));
}
}
Le résultat est comme suit:
ArrayList durée de tri: 211
durée Arrays: 435
J'ai vérifié le code source de ArrayList. Il utilise Arrays.sort () dans sa propre méthode de tri.
@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++;
}
Donc, à mon avis, mon code devrait montrer la même durée. Mais j'ai essayé plusieurs fois, et les résultats sont similaires. Qu'est-il arrivé?
Version Java: 8
Système d' exploitation: Windows 7
Ceci est un problème d'échauffement - mais exactement pourquoi je ne sais pas.
En utilisant ce code:
public void test() {
Integer[] a = randomData(10000000);
ArrayList<Integer> integerList = new ArrayList<>();
for (Integer i : a) {
integerList.add(i);
}
long t0, t1;
//Sort by ArrayList
t0 = System.currentTimeMillis();
integerList.sort(((p1, p2) -> (p1.intValue() < p2.intValue() ? -1 : p1.intValue() > p2.intValue() ? 1 : 0)));
t1 = System.currentTimeMillis();
System.out.println("ArrayList duration:" + (t1 - t0));
//Sort by Arrays
Integer[] integerArray = Arrays.copyOf(a, a.length);
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));
}
Random r = new Random(System.currentTimeMillis());
private Integer[] randomData(int n) {
Integer[] a = new Integer[n];
for (int i = 0; i < n; i++) {
a[i] = r.nextInt();
}
return a;
}
et déplacer les deux sortes dans différents ordres que je reçois:
Durée des tableaux: 4209
Durée ArrayList: 4570
Durée ArrayList: 6776
Durée des tableaux: 4684
Donc , si ArrayList
est triée d' abord il prend plus de temps.
Donc @ commentaire de AndyTurner est correcte - voir Comment puis-je écrire un bon micro-référence en Java?
Java 8 - Windows 10