Pourquoi la méthode de tri de ArrayList plus vite que les tableaux en Java?

David.Ren:

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

OldCurmudgeon:

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 ArrayListest 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

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=180209&siteId=1
conseillé
Classement