Java list.remove( )方法需要注意的两个地方
来源:互联网 发布:sql文件解压后怎么安装 编辑:程序博客网 时间:2024/06/01 21:03
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个位置的数据。
第一次运行
我们发现提示在坐标为4的地方越界了,这是为什么呢?
其实很简单,因为执行stringList.remove(2)后,list.size()就-1为4了,我们原来要移除的最后一个位置的数据移动到了第3个位置上,自然就造成了越界。
我们修改代码先执行stringList.remove(4),再执行执行stringList.remove(2)。
integerList.add(4); integerList.add(2);
- 这个错误提醒我们:使用remove()的方法时,要先从大到小的位置移除。当然如果你知道具体的对象,直接移除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); }
第三次执行
嗯,这次没问题了。
总结
使用remove()的方法时,要先从大到小的位置移除。当然如果你知道具体的对象,直接移除remove(对象)更稳妥。
要密切注意自己调用的remove()方法中的,传入的是int类型还是一个对象。
- Java list.remove( )方法需要注意的两个地方
- Java list.remove( )方法需要注意的两个地方
- Arrays.asList方法创建List需要注意的地方
- list remove 操作要注意的地方
- list remove 操作要注意的地方
- 使用List中remove方法时需要注意的问题
- java中使用list.remove需要注意的问题
- java需要注意的地方
- Java 需要注意的地方
- java的clone()方法使用需要注意的地方
- 使用setBounds()方法需要注意的地方
- java需要注意的地方2
- Java的final变量需要注意地方
- Java中的一些需要注意的地方
- Java引用传递需要注意的地方
- java 需要注意的几个地方
- java HashMap需要注意的一些地方
- java开发初学者需要注意的地方
- 欢迎使用CSDN-markdown编辑器
- 用QT写了一个串口工具,run之后总是报这个,要重启电脑才可以
- -webkit-text-stroke
- Tomcat SSL 配置
- 腾讯2017社交广告比赛(广告转化率预测)总结与分享--by Coda_Allegro
- Java list.remove( )方法需要注意的两个地方
- OC语言单例模式与Swift单例模式
- 深度学习常用中英文对照表
- 动态规划问题详解
- Looking Beyond Appearances: Synthetic Training Data for Deep CNNs in Re-identification 学习笔记
- A1
- appium简明教程(2)——appium的基本概念
- Centos安装nginx
- C++实现计算三角形面积和周长(利用面向对象的程序设计思想)