Oui, car ce n'est pas ainsi que vous supprimez une plage du code extérieur. Au lieu de cela, faites ceci:
list.subList(start, end).clear();
Cela appelle en fait removeRange
les coulisses. †
L'OP demande pourquoi removeRange
ne fait pas partie de l' List
API publique. La raison est décrite dans l'article 40 de Effective Java 2nd ed, et je la cite ici:
Il existe trois techniques pour raccourcir des listes de paramètres trop longues. La première consiste à diviser la méthode en plusieurs méthodes, dont chacune ne nécessite qu'un sous-ensemble de paramètres. Si cela est fait sans précaution, cela peut conduire à trop de méthodes, mais cela peut également aider à réduire le nombre de méthodes en augmentant l'orthogonalité. Par exemple, considérez l' java.util.List
interface. Il ne fournit pas de méthodes pour rechercher le premier ou le dernier index d'un élément dans une sous-liste, qui nécessiteraient tous deux trois paramètres. Au lieu de cela, il fournit la subList
méthode, qui prend deux paramètres et renvoie une vue d'une sous-liste. Cette méthode peut être combinée avec les méthodes indexOf
ou lastIndexOf
, chacune ayant un seul paramètre, pour obtenir la fonctionnalité souhaitée. De plus, lesubList
La méthode peut être combinée avec n'importe quelle méthode qui opère sur une List
instance pour effectuer des calculs arbitraires sur des sous-listes. L'API qui en résulte a un rapport puissance / poids très élevé.
On peut affirmer que cela removeRange
n'a pas beaucoup de paramètres et n'est donc probablement pas un candidat pour ce traitement, mais étant donné qu'il existe un moyen d'invoquer removeRange
via le subList
, il n'y a aucune raison d'encombrer l' List
interface avec une méthode redondante.
† La AbstractList.removeRange
documentation dit:
Cette méthode est appelée par l' clear
opération sur cette liste et ses sous-listes. Le remplacement de cette méthode pour tirer parti des éléments internes de l'implémentation de la liste peut considérablement améliorer les performances de l' clear
opération sur cette liste et ses sous-listes.
Voir également l'implémentation d'OpenJDK de AbstractList.clear
et SubList.removeRange
.
removeRange
appelsarraycopy
inutilement lorsque laArrayList
version est utilisée sur une plage allant jusqu'à la toute fin de la liste? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/...~~V~~3rd l'numMoved
est 0, donc tout le code de arraycopy aurait pu être mis en un seulif
(comme cela se fait dansremove
); la différence est que a) arraycopy est un appel natif, entraînant une surcharge, b) arraycopy vérifie toujours l' exactitude des paramètres stackoverflow.com/questions/12594046