Tak, ponieważ nie w ten sposób można usunąć zakres z zewnętrznego kodu. Zamiast tego zrób to:
list.subList(start, end).clear();
To faktycznie wywołuje removeRange
za kulisami. †
OP pyta, dlaczego removeRange
nie jest częścią List
publicznego API. Powód jest opisany w pozycji 40 Effective Java 2nd ed i cytuję go tutaj:
Istnieją trzy techniki skracania zbyt długich list parametrów. Jednym z nich jest rozbicie metody na wiele metod, z których każda wymaga tylko podzbioru parametrów. Jeśli zostanie to zrobione niedbale, może to prowadzić do zbyt wielu metod, ale może również pomóc zmniejszyć liczbę metod poprzez zwiększenie ortogonalności. Weźmy na przykład pod uwagę java.util.List
interfejs. Nie zapewnia metod wyszukiwania pierwszego lub ostatniego indeksu elementu na liście podrzędnej, które wymagałyby trzech parametrów. Zamiast tego udostępnia subList
metodę, która przyjmuje dwa parametry i zwraca widok podlisty. Tę metodę można łączyć z metodami indexOf
lub lastIndexOf
, z których każda ma jeden parametr, aby uzyskać żądaną funkcjonalność. PonadtosubList
metodę można łączyć z dowolną metodą działającą na List
instancji w celu wykonywania dowolnych obliczeń na podlistach. Powstały API ma bardzo wysoki stosunek mocy do masy.
Można argumentować, że removeRange
nie ma tak wielu parametrów i dlatego prawdopodobnie nie jest kandydatem do tego zabiegu, ale biorąc pod uwagę, że istnieje sposób wywołania removeRange
przez subList
, nie ma powodu, aby zaśmiecać List
interfejs metodą nadmiarową.
†AbstractList.removeRange
dokumentacja mówi:
Ta metoda jest wywoływana przez clear
operację na tej liście i jej listach podrzędnych. Zastępowanie tej metody w celu wykorzystania elementów wewnętrznych implementacji listy może znacznie poprawić wydajność clear
operacji na tej liście i jej listach podrzędnych.
Zobacz także implementację AbstractList.clear
i SubList.removeRange
.
removeRange
wywołujearraycopy
niepotrzebne, gdyArrayList
wersja jest używana w zakresie obejmującym do samego końca listy? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/ ... tonumMoved
jest 0, więc cały kod arraycopy można umieścić w jednymif
(tak jak to zrobionoremove
); różnica polega na tym, że a) arraycopy to wywołanie natywne, powodujące narzut, b) arraycopy zawsze sprawdza parametry pod kątem poprawności stackoverflow.com/questions/12594046/ ...