Obwohl die Antworten, die die Verwendung von ArrayList vorschlagen, in den meisten Szenarien sinnvoll sind, wurde die eigentliche Frage nach der relativen Leistung nicht wirklich beantwortet.
Mit einem Array können Sie einige Dinge tun:
- erstelle es
- setze einen Gegenstand
- Holen Sie sich einen Artikel
- klonen / kopieren
Allgemeine Schlussfolgerung
Obwohl Get- und Set-Operationen auf einer ArrayList etwas langsamer sind (bzw. 1 und 3 Nanosekunden pro Aufruf auf meinem Computer), ist der Aufwand für die Verwendung einer ArrayList im Vergleich zu einem Array für eine nicht intensive Verwendung sehr gering. Es sind jedoch einige Dinge zu beachten:
- Das Ändern der Größe von Vorgängen in einer Liste (beim Aufrufen
list.add(...)
) ist kostspielig und es sollte versucht werden, die anfängliche Kapazität nach Möglichkeit auf ein angemessenes Niveau einzustellen (beachten Sie, dass bei Verwendung eines Arrays dasselbe Problem auftritt).
- Beim Umgang mit Grundelementen können Arrays erheblich schneller sein, da sie es ermöglichen, viele Boxing / Unboxing-Konvertierungen zu vermeiden
- Eine Anwendung, die nur Werte in einer ArrayList abruft / festlegt (nicht sehr häufig!), kann durch den Wechsel zu einem Array einen Leistungsgewinn von mehr als 25% erzielen
Detaillierte Ergebnisse
Hier sind die Ergebnisse, die ich für diese drei Vorgänge mithilfe der jmh-Benchmarking-Bibliothek (Zeiten in Nanosekunden) mit JDK 7 auf einem Standard-x86-Desktop-Computer gemessen habe . Beachten Sie, dass die Größe von ArrayList in den Tests niemals geändert wird, um sicherzustellen, dass die Ergebnisse vergleichbar sind. Benchmark-Code finden Sie hier .
Array / ArrayList-Erstellung
Ich habe 4 Tests durchgeführt und die folgenden Anweisungen ausgeführt:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Ergebnisse (in Nanosekunden pro Anruf, 95% iges Vertrauen):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Fazit: kein spürbarer Unterschied .
Operationen bekommen
Ich habe 2 Tests durchgeführt und die folgenden Anweisungen ausgeführt:
- getList:
return list.get(0);
- getArray:
return array[0];
Ergebnisse (in Nanosekunden pro Anruf, 95% iges Vertrauen):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Fazit: Das Abrufen von einem Array ist etwa 25% schneller als das Abrufen von einer ArrayList, obwohl der Unterschied nur in der Größenordnung von einer Nanosekunde liegt.
Operationen einstellen
Ich habe 2 Tests durchgeführt und die folgenden Anweisungen ausgeführt:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Ergebnisse (in Nanosekunden pro Anruf):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Fazit: Set-Operationen auf Arrays sind etwa 40% schneller als auf Listen, aber wie bei get dauert jede Set-Operation einige Nanosekunden. Damit die Differenz 1 Sekunde erreicht, müssten Elemente in der Liste / im Array Hunderte gesetzt werden millionenfach!
Klon / Kopie
Array des Copykonstruktor Delegierten Arrays.copyOf
so Leistung ist identisch mit Array copy (kopieren ein Array über clone
, Arrays.copyOf
oder System.arrayCopy
macht keinen wesentlichen Unterschied Performance-weise ).