List 快速删除连续的多个元素

现假设有下面这个List:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);

如果我想把 23 这两个元素从该List中移除,大家的第一想法可能是:

list.remove(1);
// 此处为啥还是 1 ,这个应该不用解释了吧
list.remove(1);

这样做,当数据量比较少时,是没有问题的,但是当数据量多的时候,就很麻烦了。
有人可能会想说,数据量多的时候,可以使用 for 循环来做啊:

for(int i=0; i<2; i++) {
    list.remove(1);
}

OK,这样也是可以的。
不过,下面我想介绍一种更直观的方式。直接通过List的API来实现:

list.subList(1,3).clear();

这个API是不是一目了然呢:

  • subList(1, 3): 取从 第1(包含)第3(不包含) 的这几个元素的子集
  • clear(): 将这个子集清空

为什么这么做是可以的呢?请看下面 subList() 这个API的 官方说明

Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the returned list is empty.) The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa. The returned list supports all of the optional list operations supported by this list.

This method eliminates the need for explicit range operations (of the sort that commonly exist for arrays). Any operation that expects a list can be used as a range operation by passing a subList view instead of a whole list. For example, the following idiom removes a range of elements from a list:

  list.subList(from, to).clear();

Similar idioms may be constructed for indexOf and lastIndexOf, and all of the algorithms in the Collections class can be applied to a subList.

The semantics of the list returned by this method become undefined if the backing list (i.e., this list) is structurally modified in any way other than via the returned list. (Structural modifications are those that change the size of this list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值