ArrayList Effizienz und Größe

8

Ich möchte etwas klarstellen: Bei Verwendung einer Arraylist beginnt es mit einer Größe von 10 Elementen. Wenn es automatisch erhöht werden muss, schreibt es die gesamte ArrayList um 2/3 größer.

Wenn ich mir eine Liste mit der Größe 50-120 ansehe, ist es besser:

  1. erstelle es sofort Größe 150 und habe viel ungenutzten Platz
  2. erlaubt die Liste einige Male automatisch zu erhöhen?

Danke

    
Adam 07.06.2011, 15:09
quelle

7 Antworten

10

Wenn Sie die voraussichtliche Größe von ArrayList kennen, ist es am besten, sie im Voraus anzugeben:

%Vor%

Dies erspart Ihnen die Auswirkungen auf die Leistung, wenn ArrayList das zum Speichern des Inhalts verwendete Array neu zugewiesen hat (obwohl dies für die von Ihnen angegebene Arraygröße vernachlässigbar ist).

    
Tony the Pony 07.06.2011, 15:11
quelle
4

Es ist weniger rechenintensiv, es in etwa so groß zu machen, wie Sie es auf Anhieb brauchen, aber die Wahrheit ist, dass Java sehr effizient ist, so dass es wirklich nicht nötig ist, sich darüber Gedanken zu machen, wie die Arraylist erhöht wird. Wenn Sie jedoch maximale Effizienz anstreben, ist die Zuordnung des Speichers beim Erstellen der Liste besser.

    
MirroredFate 07.06.2011 15:13
quelle
2

Ja, die Größe vor der Hand ist aufgrund der automatischen Größenanpassung besser. Je größer ArrayList wird, desto mehr muss es sich selbst anpassen.

    
RMT 07.06.2011 15:12
quelle
1
  

schreibt die gesamte ArrayList um 2/3 größer

Nein. Es macht das Array doppelt so groß (obwohl der genaue Faktor ein undokumentiertes Implementierungsdetail ist). Ich stehe richtig.

  

Wenn ich mir eine Liste anschaue, die eventuell die Größe 50-120 hat, ist es besser: 1. erzeuge Größe 150 direkt aus

Warum 150? Warum nicht 120?

  
  1. erlaubt die Liste einige Male automatisch zu erhöhen?
  2.   

In so einem kleinen Bereich würde ich sofort die große Größe verwenden. Wenn der Bereich viel größer ist (z. B. 50-50000), würde ich die kleinste Größe (oder vielleicht eine Zwischengröße, abhängig von der erwarteten Werteverteilung) reservieren und sie einige Male skalieren lassen.

    
Konrad Rudolph 07.06.2011 15:11
quelle
1

Wenn Sie die endgültige Größe grob kennen, wäre es effizienter, sie in dieser Größe zu erstellen. Aber bei einer Listengröße von 150 scheint dies eine Mikrooptimierung zu sein.

    
jzd 07.06.2011 15:12
quelle
1

Solange Sie nicht planen, Millionen dieser Listen zu erstellen, ist es eigentlich egal. Das Kopieren von Array-Daten ist ziemlich schnell und die Vergrößerung auf 50-120 Elemente ist mit einem Profiler nicht messbar. Wenn Sie jedoch wissen, dass die Liste endlich diese Größe haben wird, würde ich empfehlen, diese Informationen beim Erstellen der Liste zu verwenden.

    
Sebastian Zarnekow 07.06.2011 15:12
quelle
1

Sie können auch eine nette Methode aus Guava verwenden Lists.newArrayListWithExpectedSize .

Hier ist das Javadoc

  

Erstellt eine ArrayList-Instanz, die so dimensioniert ist, dass sie eine geschätzte Anzahl von Elementen ohne Größenänderung enthält. Wenn die Schätzung niedrig ist, wird eine kleine Menge Padding hinzugefügt.

    
Antoine 07.06.2011 15:15
quelle

Tags und Links