2008-09-11 3 views
6

Beim Erstellen von Klassen in Java finde ich häufig, dass Sammlungen auf Instanzebene, die ich im Voraus kenne, sehr klein sind - weniger als 10 Elemente in der Sammlung. Aber ich kenne die Anzahl der Artikel nicht im Voraus, daher entscheide ich mich normalerweise für eine dynamische Sammlung (ArrayList, Vector usw.).Verwenden kleiner Sammlungen (1-10 Elemente) auf Instanzebene in Java

class Foo 
{ 
    ArrayList<Bar> bars = new ArrayList<Bar>(10); 
} 

Ein Teil von mir an mich nörgelnde hält, dass es verschwenderisch komplexe dynamische Sammlungen für etwas so klein zu verwenden. Gibt es einen besseren Weg, so etwas zu implementieren? Oder ist das die Norm?

Hinweis, ich bin nicht mit irgendwelchen (spürbaren) Leistungsstrafen oder ähnliches konfrontiert. Ich frage mich nur, ob es keinen besseren Weg gibt, Dinge zu tun.

Antwort

11

Die ArrayList Klasse in Java hat nur zwei Datenelemente, einen Verweis auf ein Object[] Array und einem größen, die Sie sowieso benötigen, wenn Sie keine ArrayList verwenden. Der einzige Vorteil, ein ArrayList nicht zu verwenden, ist das Speichern einer Objektzuordnung, die wahrscheinlich nie eine große Sache ist.

Wenn Sie erstellen und Entsorgung von vielen, vielen Instanzen Ihrer Container-Klasse (und durch Erweiterung Ihrer ArrayList Instanz) jede Sekunde, Sie Macht haben ein kleines Problem mit der Garbage Collection Churn-aber das ist etwas zu befürchten wenn es jemals passiert. Müllsammlung ist in der Regel die geringste Ihrer Sorgen.

+0

Gegenwärtige JVMs optimieren stark für Objektzuordnung und Müllsammlungsanliegen, die dazu fast immer unbegründet sind. –

1

Der Overhead ist sehr klein. Es ist möglich, eine hybride Array-Liste zu schreiben, die Felder für die ersten paar Elemente enthält, und dann darauf zurückgreift, ein Array für eine längere Liste zu verwenden.

Sie können den Overhead des Listenobjekts vollständig vermeiden, indem Sie ein Array verwenden. Um noch weiter zu gehen, können Sie das Feld als Objekt deklarieren und das Array für ein einzelnes Objekt komplett meiden.

Wenn Speicher wirklich ein Problem ist, möchten Sie möglicherweise die Verwendung von Objektinstanzen auf der unteren Ebene vergessen. Verwenden Sie stattdessen eine größere Datenstruktur auf einer größeren Granularitätsstufe.

+0

Nichts, was Sie sagen, ist per se falsch, aber ich würde nichts davon tun wollen. Die Komplexität, die irgendwie dynamisch zwischen Objekt -> Array -> ArrayList ist, ist so groß, und die Kosten für die Erstellung einer einfachen ArrayList so klein, dass ich denke, dass dies nur ein schlechter Vorschlag ist –

+0

Es ist selten wichtig, aber wenn es wichtig ist es ist reparierbar. Zum Beispiel macht javac seltsame Dinge, um den von Strings verwendeten Speicher klein zu halten, so dass wir alle von schnelleren, kleineren Kompilierungen profitieren. –

3

Um die Dinge einfach zu halten, denke ich, das ist so gut wie kein Problem. Ihre Implementierung ist flexibel genug, dass Sie, wenn sich die Anforderungen in Zukunft ändern, nicht zu einem Refactoring gezwungen werden. Wenn Sie Ihrem Code für eine Hybridlösung mehr Logik hinzufügen, lohnt es sich nicht, Ihren kleinen Datensatz und die hohe Qualität der Java-API für die Sammlung zu berücksichtigen.

2

Google Collections hat Sammlungen optimiert für unveränderliche/kleine Anzahl von Elementen. Siehe Lists.asList API als ein Beispiel.

Verwandte Themen