浅谈Java list.remove( )方法需要注意的两个坑

作者:DeMonnnnnn 时间:2023-02-01 06:08:44 

list.remove

最近做项目的过程中,需要用到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);
 }
}
}

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

第一次运行

浅谈Java list.remove( )方法需要注意的两个坑

咦,为什么执行两次remove(),stringList的数据没有变化呢?

没有报错,说明代码没有问题,那问题出在哪呢?

仔细分析我们发现,remove()这个方法是一个重载方法,即remove(int position)和remove(object object),唯一的区别是参数类型。


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

仔细观察上面代码你会发现,其实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);
 }

第二次运行

浅谈Java list.remove( )方法需要注意的两个坑

我们发现提示在坐标为4的地方越界了,这是为什么呢?

其实很简单,因为执行stringList.remove(2)后,list.size()就-1为4了,我们原来要移除的最后一个位置的数据移动到了第3个位置上,自然就造成了越界。

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

integerList.add(4);

integerList.add(2);

这个错误提醒我们:使用remove()的方法时,要先从大到小的位置移除。当然如果你知道具体的对象,直接移除remove(对象)更稳妥。

第三次执行

浅谈Java list.remove( )方法需要注意的两个坑

嗯,这次没问题了。

总结

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

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

补充知识: 关于List.remove()报错的问题

我们如果想删掉List中某一个对象,我们可能就会想到会用List.remove()方法。但是这样如果后续操作这个list的时候就会报错。

具体的原因是当你操作了List的remove方法的时候,他回去修改List的modCount属性。

导致抛出异常java.util.ConcurrentModificationException。

最好的想要修改List对象,我们可以用ListIterator。

就像这样:


ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
arrayList.add(Integer.valueOf(i));
}

ListIterator<Integer> iterator = arrayList.listIterator();

while (iterator.hasNext()) {
if(需要满足的条件){
iterator.remove();//删除操作
iterator.add(integer);//新增操作

}
}

这样就不会去修改List的modCount属性。

来源:https://demon.blog.csdn.net/article/details/75057512

标签:Java,list,remove
0
投稿

猜你喜欢

  • springboot实现定时任务的四种方式小结

    2021-10-20 20:38:06
  • java项目中的绝对路径和相对路径用法说明

    2023-11-27 22:08:44
  • Mybatis实现增删改查

    2022-05-26 22:00:20
  • java虚拟机中多线程总结

    2022-09-01 22:55:48
  • IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    2022-07-01 22:43:39
  • Java实现过滤掉map集合中key或value为空的值示例

    2021-05-25 10:26:17
  • 分析讲解SpringMVC注解配置如何实现

    2023-10-30 17:23:58
  • 新的Java访问mysql数据库工具类的操作代码

    2023-04-05 16:54:58
  • Android 之Preference控件基本使用示例详解

    2022-10-20 23:42:34
  • 通过Session案例分析一次性验证码登录

    2023-04-27 06:25:51
  • Java泛型机制必要性及原理解析

    2022-09-30 02:21:41
  • java导出生成word的简单方法

    2023-11-23 23:07:13
  • C#实现温度转换功能

    2021-10-06 22:54:18
  • Unity 修改FBX模型动画的操作

    2023-03-17 17:59:39
  • Java单例模式、饥饿模式代码实例

    2022-04-15 22:22:06
  • Android Bitmap的加载优化与Cache相关介绍

    2022-02-04 17:20:51
  • flutter ExpansionTile 层级菜单的实现

    2023-06-15 16:04:01
  • 基于c# 接口的实例详解

    2023-10-22 22:22:11
  • JDK动态代理原理:只能代理接口,不能代理类问题

    2023-06-16 03:18:40
  • Android中 webView调用JS出错的解决办法

    2021-12-02 21:23:25
  • asp之家 软件编程 m.aspxhome.com