2

Im Allgemeinen Sie sagen, dass wir von Array verschoben haben aus folgendem GrundUnterschied zwischen ArrayList.TrimToSize() und Array?

Arrays fixiert sind Größe zu Arraylist, wo als Array-Listen nicht.

Einer der Nachteile von Arraylist ist:

Wenn es erreicht es Kapazität ist, wird Arraylist 3/2 davon tatsächliche Größe. Daher kann der Speicher verschwendet werden, wenn der Speicherplatz nicht ordnungsgemäß genutzt wird. In diesem Szenario werden Arrays bevorzugt.

Wenn wir ArrayList.TrimSize() verwenden, wird das Array List eine einstimmige Wahl machen? Beseitigung des einzigen Vorteils (feste Größe) Array hat darüber?

+0

"[...] ArrayList wird 3/2 seiner tatsächlichen Größe." - Keine Ahnung, woher du das hast, aber [das offizielle Javadoc von 'ArrayList'] (http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html) sagt, dass [ ...] Details der Wachstumspolitik sind nicht über die Tatsache hinaus spezifiziert, dass das Hinzufügen eines Elements konstante amortisierte Zeitkosten hat. " Der Unterschied besteht darin, dass eine "ArrayList" eine dynamische (d. H. Resizierbare) Datenstruktur ist, die einige handliche Schnittstellen (wie "Iterable" und "Collection") implementiert, während Arrays statisch sind. Die Methode, auf die Sie sich beziehen, heißt übrigens 'trimToSize()'. – Turing85

+0

Nur um klar zu sein, eine ArrayList ist ein Array. So offensichtlich es klingt, viele merken das nicht. Das einzige, was eine ArrayList für Sie tut, ist im Grunde, Größenfehler mit VIELEN mehr Vergünstigungen zu verhindern, aber das ist ein Hauptgrund, warum Sie es verwenden. Alles, was eine ArrayList tun kann, wird mit einem Array durchgeführt, das automatisch skaliert wird. – Jahhein

Antwort

0

Eine kurze Antwort wäre: trimToSize löst nicht alles, weil ein Array verkleinert wird, nachdem es gewachsen ist - das ist nicht dasselbe wie Wachstum überhaupt zu verhindern; ersteres hat die kopierkosten + müllsammlung.

Die längere Antwort wäre: int [] ist Low-Level, ArrayList ist High-Level, was bedeutet, dass es bequemer ist, aber Sie weniger Kontrolle über die Details gibt. In einem geschäftsorientierten Code (z. B. die Manipulation einer kurzen Liste von "Produkten") bevorzuge ich ArrayList, so dass ich die technischen Details vergessen und mich auf das Geschäft konzentrieren kann. In einem mathematisch orientierten Code werde ich wahrscheinlich für int [] gehen.

Es gibt zusätzliche subtile Unterschiede, aber ich bin mir nicht sicher, wie relevant sie für Sie sind. Z.B. Parallelität: Wenn Sie die Daten von ArrayList gleichzeitig aus mehreren Threads ändern, wird dies absichtlich fehlschlagen, da dies die intuitive Anforderung für die meisten Geschäftscodes ist. Mit int [] können Sie tun, was Sie wollen, und es Ihnen überlassen, ob es Sinn macht. Nochmals, dies kann alles zusammengefasst werden als "Low-Level" ...

0

Wenn Sie eine extrem Speicher-kritische Anwendung entwickeln, benötigen Sie auch Resizability und Leistung kann aus gehandelt werden, dann Trimmen Array Liste ist Ihre beste Wette. Dies ist die einzige Zeit, Array-Liste mit Trimmen wird einstimmige Wahl sein.

In anderen Situationen sind, was Sie eigentlich tun, ist:

  1. Sie haben eine Array-Liste erstellt. Die Standardkapazität der Liste ist 10.
  2. Ein Element hinzugefügt und Trim-Operation angewendet. Also Größe und Kapazität ist jetzt 1. Wie trim Größe funktioniert? Es erstellt im Grunde ein neues Array mit der tatsächlichen Größe der Liste und kopiert alte Array-Daten in ein neues Array. Das alte Array wird für die Grabage-Sammlung verwendet.
  3. Sie haben erneut ein neues Element hinzugefügt. Da die Liste voll ist, wird sie mit mehr 50% Leerzeichen neu zugewiesen. Auch hier wird eine ähnliche Prozedur wie 2 durchgeführt.
  4. Wieder rufen Sie TrimSize und es folgt demselben Verfahren wie 2.
  5. Dinge wiederholt ...

Sie sehen also, wir sind viele Leistungsaufwand entstehen nur gleiche Liste Kapazität und Größe zu halten. Die feste Größe bietet Ihnen hier nichts Vorteilhaftes, außer ein paar zusätzliche Leerzeichen zu sparen, was in modernen Maschinen kaum ein Problem darstellt.

Kurz gesagt, wenn Sie die Resistierbarkeit wünschen, ohne viel Code zu schreiben, dann ist die Array-Liste einstimmig. Wenn sich die Größe jedoch nie ändert und Sie keine dynamische Funktion wie den Entfernungsvorgang benötigen, ist das Array die bessere Wahl. Wenige zusätzliche Bytes sind kaum ein Problem.

Verwandte Themen