Ya, karena bukan itu cara Anda menghapus rentang dari kode luar. Sebaliknya, lakukan ini:
list.subList(start, end).clear();
Ini sebenarnya panggilan di removeRange
belakang layar. †
OP bertanya mengapa removeRange
bukan bagian dari List
API publik. Alasannya dijelaskan pada Item 40 Effective Java 2nd ed, dan saya kutip di sini:
Ada tiga teknik untuk mempersingkat daftar parameter yang terlalu panjang. Salah satunya adalah memecah metode menjadi beberapa metode, yang masing-masing hanya memerlukan sebagian dari parameter. Jika dilakukan secara sembarangan, ini dapat menyebabkan terlalu banyak metode, tetapi juga dapat membantu mengurangi jumlah metode dengan meningkatkan ortogonalitas. Misalnya, perhatikan java.util.List
antarmuka. Ini tidak menyediakan metode untuk menemukan indeks pertama atau terakhir dari sebuah elemen dalam sublist, yang keduanya membutuhkan tiga parameter. Sebagai gantinya, ia menyediakan subList
metode, yang mengambil dua parameter dan mengembalikan tampilan sublist. Metode ini dapat dikombinasikan dengan metode indexOf
atau lastIndexOf
, yang masing-masing memiliki parameter tunggal, untuk menghasilkan fungsionalitas yang diinginkan. ApalagisubList
metode dapat digabungkan dengan metode apa pun yang beroperasi pada sebuah List
instance untuk melakukan penghitungan sewenang-wenang pada sublist. API yang dihasilkan memiliki rasio power-to-weight yang sangat tinggi.
Seseorang dapat berargumen bahwa removeRange
tidak memiliki banyak parameter dan oleh karena itu mungkin bukan kandidat untuk perlakuan ini, tetapi mengingat bahwa ada cara untuk memanggil removeRange
melalui subList
, tidak ada alasan untuk mengacaukan List
antarmuka dengan metode yang berlebihan.
† The AbstractList.removeRange
dokumentasi mengatakan:
Metode ini dipanggil oleh clear
operasi pada daftar ini dan sublistnya. Mengganti metode ini untuk memanfaatkan internal implementasi daftar dapat secara substansial meningkatkan kinerja clear
operasi pada daftar ini dan subListnya.
Juga, lihat implementasi OpenJDK dari AbstractList.clear
dan SubList.removeRange
.
removeRange
panggilanarraycopy
tidak perlu saatArrayList
versi digunakan pada rentang yang mencakup hingga akhir daftar? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/... yangnumMoved
adalah 0, sehingga seluruh kode arraycopy bisa saja dimasukkan ke dalam satuif
(seperti yang dilakukan diremove
); perbedaannya adalah bahwa a) arraycopy adalah panggilan asli, menimbulkan overhead, b) arraycopy selalu memeriksa parameter untuk kebenaran stackoverflow.com/questions/12594046/…