Java list.remove( )方法需要注意的两个地方

public class Main {

    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();//数据集合
        List<Integer> integerList = new ArrayList<>();//存储remove的位置

        stringList.add("a");
        stringList.add("b");
        stringList.add("c");
        stringList.add("d");
        stringList.add("e");

        integerList.add(2);
        integerList.add(4);//此处相当于要移除最后一个数据

        for (Integer i :integerList){
            stringList.remove(i);
        }

        for (String s :stringList){
            System.out.println(s);
        }
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

如上代码我们有一个5个元素的list数据集合,我们要删除第2个和第4个位置的数据。

第一次运行

这里写图片描述

我们发现提示在坐标为4的地方越界了,这是为什么呢? 
其实很简单,因为执行stringList.remove(2)后,list.size()就-1为4了,我们原来要移除的最后一个位置的数据移动到了第3个位置上,自然就造成了越界。

我们修改代码先执行stringList.remove(4),再执行执行stringList.remove(2)。

        integerList.add(4);
        integerList.add(2);
 
 
  • 1
  • 2
  • 1
  • 2
  • 这个错误提醒我们:使用remove()的方法时,要先从大到小的位置移除。当然如果你知道具体的对象,直接移除remove(对象)更稳妥。
第二次运行

这里写图片描述

嗯,没有报错。但是,咦,为什么执行两次remove(),stringList的数据没有变化呢? 
没有报错,说明代码没有问题,那问题出在哪呢? 
仔细分析我们发现,remove()这个方法是一个重载方法,即remove(int position)和remove(object object),唯一的区别是参数类型。


        for (Integer i :integerList){
            stringList.remove(i);
        }
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

仔细观察上面代码你会发现,其实i是Integer对象,而由于Java系统中如果找不到准确的对象,会自动向上升级,而(int < Integer < Object),所以在调用stringList.remove(i)时,其实使用的remove(object object),而很明显stringList不存在Integer对象,自然会移除失败(0.0),Java也不会因此报错。 
如果我们想使用remove(int position)方法,只能降低对象等级,即修改代码;

for (Integer i :integerList){
            int a =i;
            stringList.remove(a);
        }
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
第三次执行

这里写图片描述 
嗯,这次没问题了。

总结

  1. 使用remove()的方法时,要先从大到小的位置移除。当然如果你知道具体的对象,直接移除remove(对象)更稳妥。

  2. 要密切注意自己调用的remove()方法中的,传入的是int类型还是一个对象。



对于我来说,
 List<String> stringList = new ArrayList<String>();//数据集合
       List<Integer> integerList = new ArrayList<Integer>();//存储remove的位置


       stringList.add("a");
       stringList.add("b");
       stringList.add("c");
       stringList.add("d");
       stringList.add("e");


       integerList.add(2);
       integerList.add(4);//此处相当于要移除最后一个数据


       for (Integer i :integerList){
           stringList.remove(i);
       }
       
       for (String s :stringList){
           System.out.println(s);
       }

这个代码只是在 ArrayList<String>里面加了String和Integer,,,直接可以运行出来的,
运行的结果是:
a
b
c
d
e

如果换成
for (Integer i :integerList){
int a =i;
stringList.remove(a);
}
反而会报数组下标越界的错误.

所以代码拿到还是根据自己的环境去运行下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值