Sí, porque no es así como se elimina un rango del código externo. En su lugar, haz esto:
list.subList(start, end).clear();
Esto realmente llama removeRange
detrás de escena. †
El OP pregunta por qué removeRange
no forma parte de la List
API pública. La razón se describe en el artículo 40 de Effective Java 2nd ed, y la cito aquí:
Hay tres técnicas para acortar listas de parámetros demasiado largas. Una es dividir el método en varios métodos, cada uno de los cuales requiere solo un subconjunto de parámetros. Si se hace de forma descuidada, esto puede conducir a demasiados métodos, pero también puede ayudar a reducir el número de métodos al aumentar la ortogonalidad. Por ejemplo, considere la java.util.List
interfaz. No proporciona métodos para encontrar el primer o el último índice de un elemento en una sublista, los cuales requerirían tres parámetros. En su lugar, proporciona el subList
método, que toma dos parámetros y devuelve una vista de una sublista. Este método se puede combinar con los métodos indexOf
o lastIndexOf
, cada uno de los cuales tiene un solo parámetro, para producir la funcionalidad deseada. Además, elsubList
método se puede combinar con cualquier método que opere en unList
instancia para realizar cálculos arbitrarios en sublistas. La API resultante tiene una relación potencia / peso muy alta.
Se puede argumentar que removeRange
no tiene tantos parámetros y, por lo tanto, probablemente no sea candidato para este tratamiento, pero dado que hay una forma de invocar a removeRange
través del subList
, no hay razón para saturar la List
interfaz con un método redundante.
† La AbstractList.removeRange
documentación dice:
Este método es llamado por la clear
operación en esta lista y sus subListas. Anular este método para aprovechar los aspectos internos de la implementación de la lista puede mejorar sustancialmente el rendimiento de la clear
operación en esta lista y sus subListas.
Además, consulte la implementación de OpenJDK de AbstractList.clear
y SubList.removeRange
.
removeRange
llamadasarraycopy
innecesarias cuando laArrayList
versión se usa en un rango que abarca hasta el final de la lista? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/...~~V~~3rd elnumMoved
es 0, por lo que todo el código arraycopy podría haber sido puesto en una solaif
(como se hace enremove
); la diferencia es que a) arraycopy es una llamada nativa, que incurre en una sobrecarga, b) arraycopy siempre verifica la corrección de los