2016-06-30 14 views
0

Das Iterieren über aufeinanderfolgende Elemente eines Arrays wird im Allgemeinen als effizienter angesehen als das Iterieren über aufeinanderfolgende verknüpfte Listenelemente aufgrund von Caching.Java-Objektarrays - Verwendung des Hardware-Speichercaches

Dies ist zweifellos wahr, solange Elemente elementare Datentypen haben. Aber wenn die Elemente Objekte sind, werden nach meinem Verständnis nur die Referenzen auf die Objekte im zusammenhängenden Speicherbereich des Arrays gespeichert (der wahrscheinlich zwischengespeichert wird), während die tatsächlichen Objektdaten irgendwo im Hauptspeicher gespeichert werden und nicht können effektiv zwischengespeichert werden.

Da Sie normalerweise nicht nur über den Container iterieren, sondern bei jeder Iteration auch auf Objektdaten zugreifen müssen, bringt dies nicht mehr oder weniger den Leistungsvorteil des Arrays über die Liste nach sich?

Bearbeiten: Der Kommentar über verschiedene Szenarien stark variiert ist wahrscheinlich richtig. Sehen wir uns einen bestimmten an: Sie suchen nach einem bestimmten Objekt im Container. Um es zu finden, müssen Sie eine gegebene Zeichenfolge mit einer anderen Zeichenfolge vergleichen, die eine Klassenvariable des Objekts ist.

+0

* "Ich verstehe, dass nur die Verweise auf die Objekte im zusammenhängenden Speicherbereich des Arrays gespeichert werden" * Richtig. Die Antwort auf den Rest der Frage lautet: "Es kommt darauf an." Verschiedene Szenarien variieren stark, es gibt keine allgemeine Antwort auf diese Frage. –

+0

Vielleicht. Interessante Frage allerdings; Aber es würde mich eher überraschen, wenn Sie mehr hilfreiche Antworten als Downvotes und enge Anfragen erhalten. – GhostCat

+0

Das IMO-Array bietet immer noch einen schnelleren Zugriff, da weniger Operationen erforderlich sind, um den nächsten Knoten zu erreichen als mit LinkedList. –

Antwort

1

Nein, für Objekte ("Zeiger") gibt es eine Indirektion in beiden. Eine verknüpfte Liste muss für jeden Knoten zum nächsten Knoten springen. Es hat also immer noch einen Overhead.

Aber ja, in einer relativen Weise betrifft der Gewinn nur einen Teil, sehr grob die Hälfte der reinen Durchgänge, die Indirektionsschritte zählen.

Und natürlich macht jede Indirektion den Zugriff chaotischer, langsamer.

Übrigens ist die ArrayList auch ähnlich schnell wie Arrays.

+0

In diesem Zusammenhang würde ich erwarten, dass sich 'ArrayList' wie ein Array verhält. –

+0

Ja, ich wollte es erwähnen, um Leute nicht zu Arrays zu jagen, wenn eine Liste geeigneter ist. –