Ja, da Sie auf diese Weise keinen Bereich aus externem Code entfernen. Tun Sie stattdessen Folgendes:
list.subList(start, end).clear();
Dies ruft tatsächlich removeRange
hinter die Kulissen. †
Das OP fragt, warum removeRange
nicht Teil der List
öffentlichen API ist. Der Grund ist in Punkt 40 von Effective Java 2nd ed beschrieben, und ich zitiere ihn hier:
Es gibt drei Techniken zum Verkürzen zu langer Parameterlisten. Eine besteht darin, die Methode in mehrere Methoden aufzuteilen, für die jeweils nur eine Teilmenge der Parameter erforderlich ist. Wenn dies unachtsam gemacht wird, kann dies zu zu vielen Methoden führen, aber es kann auch dazu beitragen , die Anzahl der Methoden zu verringern , indem die Orthogonalität erhöht wird. Betrachten Sie zum Beispiel die java.util.List
Schnittstelle. Es werden keine Methoden zum Auffinden des ersten oder letzten Index eines Elements in einer Unterliste bereitgestellt, für die beide drei Parameter erforderlich wären. Stattdessen wird die subList
Methode bereitgestellt , die zwei Parameter verwendet und eine Ansicht einer Unterliste zurückgibt. Diese Methode kann mit den Methoden indexOf
oder kombiniert lastIndexOf
werden, von denen jede einen einzelnen Parameter hat, um die gewünschte Funktionalität zu erhalten. Darüber hinaus ist diesubList
Die Methode kann mit jeder Methode kombiniert werden, die mit einer List
Instanz arbeitet, um beliebige Berechnungen für Unterlisten durchzuführen. Die resultierende API hat ein sehr hohes Leistungsgewicht.
Man kann argumentieren, dass removeRange
es nicht so viele Parameter gibt und daher wahrscheinlich kein Kandidat für diese Behandlung ist, aber da es eine Möglichkeit gibt, removeRange
über das aufzurufen subList
, gibt es keinen Grund, die List
Schnittstelle mit einer redundanten Methode zu überladen .
† In der AbstractList.removeRange
Dokumentation heißt es:
Diese Methode wird von der clear
Operation in dieser Liste und ihren Unterlisten aufgerufen. Das Überschreiben dieser Methode, um die Interna der Listenimplementierung zu nutzen, kann die Leistung des Vorgangs für diese Liste und ihre Unterlisten erheblich verbessern clear
.
Siehe auch OpenJDKs Implementierung von AbstractList.clear
und SubList.removeRange
.
removeRange
Anrufearraycopy
unnötig sind, wenn dieArrayList
Version in einem Bereich verwendet wird, der bis zum Ende der Liste reicht? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/… dasnumMoved
ist 0, sodass der gesamte Arraycopy-Code in einem einzigenif
(wie inremove
) ausgeführt werden könnte; Der Unterschied besteht darin, dass a) Arraycopy ein nativer Aufruf ist, der einen Overhead verursacht. b) Arraycopy überprüft die Parameter immer auf Richtigkeit. stackoverflow.com/questions/12594046/…