ArrayDeque vs ArrayList implementieren Sie einen stack

In der Dokumentation für ArrayDeque sagt:

Diese Klasse ist wahrscheinlich schneller als Stack als einen Stapel, und schneller als LinkedList, wenn verwendet, wie eine Schlange.

Es gibt keinen Hinweis auf den Unterschied zwischen der Verwendung einer ArrayDeque als Stapel und mit einem ArrayList. Sie können eine ArrayList als stack wie folgt.

list.add(object);                      //push
object = list.remove(list.size() - 1); //pop

Fand ich, dass wenn ich eine ArrayList nur auf diese Weise, seine Leistung ist schlechter als ArrayDeque. Was ist der Grund für diesen Unterschied? Sicherlich, es kann nicht nur sein, die Anrufe zu size()? Intern ArrayList und ArrayDeque sind, wurde mit Hilfe eines Object[] wird ersetzt durch eine größere array-wenn erforderlich, so ist sicherlich die Leistung sollte etwa die gleiche sein?

  • Gute Erklärung hier - stackoverflow.com/questions/6129805/...
  • Die Messung solch einer vermutlich kleinen performance-Unterschied in Java ist extrem schwer, das richtige zu tun. Und ArrayDeque ist eine bessere Abstraktion ohnehin als eine ArrayList, da es direkt bietet push-und pop-Methoden.
  • Ich bin damit einverstanden. Ich würde immer verwenden Sie ArrayDeque. Ich bin nur daran interessiert zu verstehen, was eine ArrayDeque ist. Wie kann der it-support schnell einführen und entfernen an beiden enden, und noch schlagen Datentypen, die keine Unterstützung für diese?
  • Sorry für meine verwirrende Antwort, ich dachte, Sie wurden unter das element aus dem Kopf.
  • Keine Sorge. Sie hatten mich beunruhigt es. Ich mache wirklich dumme Mathe Fehler manchmal!
  • Ich habe gerade gelesen, eine Implementierung von ArrayDeque und fand es ein Ringpuffer. en.wikipedia.org/wiki/Circular_buffer
  • Auf den letzten Implementierungen, je nachdem, wie Sie instanziieren der ArrayList, kann es verzögern die Zuordnung der internen array, bis der erste Anruf hinzufügen. Vielleicht kann für einige der Differenz.
  • Meine Vermutung, wie Ihre performance test code fehlt, ist, dass Ihre performance test ist fehlerhaft. Es gibt viele Variablen im Spiel während einer perf-test-und, es sei denn, Sie sind mit einem tool wie JMH, sind Sie wahrscheinlich tun es falsch. Auch, es sei denn, Sie sind besorgt über micros, würde ich mit ArrayDeque die eine sauberere Schnittstelle für einen stack. Wenn Sie versuchen, zu speichern micros, verwenden Sie einen plan array.

Schreibe einen Kommentar