Evet, çünkü bir aralığı dış koddan bu şekilde kaldırmazsınız. Bunun yerine şunu yapın:
list.subList(start, end).clear();
Bu aslında removeRange
perde arkasını çağırıyor . †
OP, neden genel API'nin bir removeRange
parçası olmadığını sorar List
. Nedeni, Etkili Java 2. baskı Madde 40'ta açıklanmıştır ve burada alıntı yapıyorum:
Aşırı uzun parametre listelerini kısaltmak için üç teknik vardır. Birincisi, yöntemi, her biri yalnızca bir parametre alt kümesi gerektiren birden çok yönteme bölmektir. Dikkatsizce yapılırsa, bu çok fazla yönteme yol açabilir, ancak aynı zamanda ortogonaliteyi artırarak yöntem sayısını azaltmaya da yardımcı olabilir . Örneğin, java.util.List
arayüzü düşünün . Her ikisi de üç parametre gerektiren bir alt listedeki bir öğenin ilk veya son dizinini bulmaya yönelik yöntemler sağlamaz. Bunun yerine subList
, iki parametre alan ve bir alt listenin bir görünümünü döndüren yöntemi sağlar . Bu yöntem , istenen işlevselliği sağlamak için her biri tek bir parametreye sahip olan indexOf
veya lastIndexOf
yöntemleriyle birleştirilebilir . Dahası,subList
yöntem, alt listeler üzerinde rastgele hesaplamalar gerçekleştirmek için bir örnek üzerinde çalışan herhangi bir yöntemle birleştirilebilir List
. Ortaya çıkan API, çok yüksek bir güç-ağırlık oranına sahiptir.
Bir iddia edebilir removeRange
birçok parametre vardır ve muhtemelen bu nedenle bir bu tedavi için aday ama çağırmak için bir yol olduğunu göz önüne alındığında gelmez removeRange
aracılığıyla subList
, kaplamak için hiçbir neden yoktur List
yedekli yöntemle arayüz.
†AbstractList.removeRange
dokümantasyon diyor ki:
Bu yöntem, clear
bu listedeki işlem ve alt listeleriyle çağrılır. Liste uygulamasının dahili özelliklerinden yararlanmak için bu yöntemi geçersiz kılmak , bu listedeki ve alt Listelerindeki işlemin performansını önemli ölçüde artırabilir clear
.
Ayrıca, OpenJDK'nin AbstractList.clear
ve SubList.removeRange
.