Sim, porque não é assim que você remove um intervalo de um código externo. Em vez disso, faça o seguinte:
list.subList(start, end).clear();
Isso realmente chama removeRange
os bastidores. †
O OP pergunta por que removeRange
não faz parte da List
API pública. O motivo é descrito no Item 40 do Effective Java 2 ed, e eu o cito aqui:
Existem três técnicas para encurtar listas de parâmetros excessivamente longas. Uma é dividir o método em vários métodos, cada um dos quais requer apenas um subconjunto dos parâmetros. Se feito de forma descuidada, isso pode levar a muitos métodos, mas também pode ajudar a reduzir a contagem de métodos, aumentando a ortogonalidade. Por exemplo, considere a java.util.List
interface. Ele não fornece métodos para encontrar o primeiro ou o último índice de um elemento em uma sublista, pois ambos exigiriam três parâmetros. Em vez disso, ele fornece o subList
método, que usa dois parâmetros e retorna uma visualização de uma sublista. Este método pode ser combinado com os métodos indexOf
ou lastIndexOf
, cada um dos quais tem um único parâmetro, para produzir a funcionalidade desejada. Além disso, osubList
O método pode ser combinado com qualquer método que opere em uma List
instância para realizar cálculos arbitrários em sublistas. A API resultante tem uma relação potência-peso muito alta.
Pode-se argumentar que removeRange
não tem tantos parâmetros e, portanto, provavelmente não é um candidato para esse tratamento, mas dado que há uma maneira de invocar removeRange
por meio do subList
, não há razão para sobrecarregar a List
interface com um método redundante.
† A AbstractList.removeRange
documentação diz:
Este método é chamado pela clear
operação nesta lista e suas subListas. Substituir este método para tirar proveito dos elementos internos da implementação da lista pode melhorar substancialmente o desempenho da clear
operação nesta lista e em suas subListas.
Além disso, consulte a implementação do OpenJDK de AbstractList.clear
e SubList.removeRange
.
removeRange
chamaarraycopy
desnecessariamente quando aArrayList
versão é usada em um intervalo que vai até o final da lista? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/… onumMoved
é 0, então todo o código arraycopy poderia ter sido colocado em um únicoif
(como feito emremove
); a diferença é que a) arraycopy é uma chamada nativa, incorrendo em uma sobrecarga, b) arraycopy sempre verifica os parâmetros de correção stackoverflow.com/questions/12594046/…