Да, потому что это не способ удаления диапазона из внешнего кода. Вместо этого сделайте следующее:
list.subList(start, end).clear();
На самом деле это звонки removeRange
за кулисами. †
OP спрашивает, почему removeRange
не является частью List
общедоступного API. Причина описана в правиле 40 2-го издания Effective Java, и я цитирую его здесь:
Есть три метода сокращения слишком длинных списков параметров. Один из них - разбить метод на несколько методов, каждый из которых требует только подмножества параметров. Если сделать это неаккуратно, это может привести к слишком большому количеству методов, но это также может помочь уменьшить количество методов за счет увеличения ортогональности. Например, рассмотрим java.util.List
интерфейс. Он не предоставляет методов для поиска первого или последнего индекса элемента в подсписке, оба из которых требуют трех параметров. Вместо этого он предоставляет subList
метод, который принимает два параметра и возвращает представление подсписка. Этот метод можно комбинировать с методами indexOf
или lastIndexOf
, каждый из которых имеет единственный параметр, чтобы получить желаемую функциональность. Более того,subList
Метод можно комбинировать с любым методом, который работает с List
экземпляром, для выполнения произвольных вычислений над подсписками. Полученный API имеет очень высокое соотношение мощности к весу.
Можно утверждать, что у removeRange
него не так много параметров и, следовательно, он, вероятно, не является кандидатом для этого лечения, но, учитывая, что есть способ вызвать removeRange
через subList
, нет причин загромождать List
интерфейс избыточным методом.
† В AbstractList.removeRange
документации говорится:
Этот метод вызывается clear
операцией над этим списком и его подсписками. Переопределение этого метода для использования преимуществ внутренней реализации списка может существенно улучшить производительность clear
операции над этим списком и его подсписками.
Также см. Реализацию OpenJDK AbstractList.clear
и SubList.removeRange
.
removeRange
вызовыarraycopy
без надобности, когдаArrayList
версия используется в диапазоне, охватывающем до самого конца списка? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/… значениеnumMoved
равно 0, поэтому весь код копирования массива можно было бы поместить в одинif
(как сделано вremove
); разница в том, что a) копирование массива является собственным вызовом, вызывающим накладные расходы, б) копирование массива всегда проверяет параметры на правильность stackoverflow.com/questions/12594046/…