java list remove 无效_JAVA List使用Remove时的一些问题
List中可以添加任何对象,包括自己定义的新的类了,本文章介绍的是JAVA List使用Remove时的一些问题的解决办法。
近日在项目中遇到了一个诡异的问题,参考代码如下:
[java]
public class ListTest {
public static List listFactory() {
return new ArrayList(Arrays.asList("a", "b", "c", "d"));
}
public static void main(String[] args) {
List testList = null;
String t;
// 尝试移除集合中的间隔元素a、c
testList = listFactory();
for (int i = 0; i < testList.size(); i ) {
t = testList.get(i);
if (t.equals("a") || t.equals("c")) {
testList.remove(t);
}
}
System.out.println("移除间隔元素a、c后结果:" testList);
// 尝试移除集合中的相邻元素a、b
testList = listFactory();
for (int i = 0; i < testList.size(); i ) {
t = testList.get(i);
if (t.equals("a") || t.equals("b")) {
testList.remove(t);
}
}
System.out.println("移除相邻元素a、b后结果:" testList);
}
}
[/java]
而运行后的结果如下:
[java]
移除间隔元素a、c后结果:[b, d]
移除相邻元素a、b后结果:[b, c, d]
[/java]
从运行的结果来看,在操作List时使用remove方法在移除间隔元素成功,而移除相邻元素时会导致漏删除。
失败原因
通过查看remove()的源码后发现,List内实现remove是通过如下方法实现的。
[java]
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index )
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index )
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount ;
int numMoved = size – index – 1;
if (numMoved > 0)
System.arraycopy(elementData, index 1, elementData, index,
numMoved);
elementData[–size] = null; // Let gc do its work
}
[/java]
fastRemove方法是实现的关键,从实现上来看,他是将要删除的元素后的元素逐一向前挪一位来实现的。我们在循环删除时若外层当前的index为1,将之删除,后续元素往前挪,然后外层的index加1继续循环,这样会导致被删除元素的后面紧邻元素不会被遍历到,从而导致漏删。
解决办法
使用逆序删除的办法[java]
public class ListTest {
public static List listFactory() {
return new ArrayList(Arrays.asList("a", "b", "c", "d"));
}
public static void main(String[] args) {
List testList = null;
String t;
// 逆序移除相邻元素a、b后
testList = listFactory();
int size = testList.size();
for (int i = size – 1; i >= 0; i–) {
t = testList.get(i);
if (t.equals("a") || t.equals("b")) {
testList.remove(t);
}
}
System.out.println("逆序移除相邻元素a、b后结果:" testList);
}
}
[/java]
使用iterator删除[java]
public class ListTest {
public static List listFactory() {
return new ArrayList(Arrays.asList("a", "b", "c", "d"));
}
public static void main(String[] args) {
List testList = null;
String t;
// 使用iterator移除相邻元素a、b后
testList = listFactory();
Iterator iter = testList.iterator();
while (iter.hasNext()) {
t = iter.next();
if (t.equals("a") || t.equals("b")) {
iter.remove();
}
}
System.out.println("使用iterator移除相邻元素a、b后结果:" testList);
}
}
[/java]
java list remove 无效_JAVA List使用Remove时的一些问题相关推荐
- java光标位置无效_java - java.sql.SQLException:无效的光标位置 - 堆栈内存溢出
我创建了一个简单的应用程序,使用户可以购买门票. 但是,每当我尝试购买" n"张门票时,都会遇到此错误. 现在,我知道在使用数据库进行操作时需要crs.next()语句,我已经使用 ...
- java for update 无效_java.sql.BatchUpdateException:调用中的无效参数
检查此循环. 这里,在i = 0的情况下,取出(0-1)为-1. 我们知道List提供了基于0的索引,所以你的str.get(..)应该从0开始,而不是从-1开始 试试这个 public void i ...
- java方法声明无效_java 方法声明无效 需要返回类型
如题了代码如下望高手指点/*客户机端程序*/importjava.net.*;importjava.io.*;importjava.awt.*;importjava.awt.event.*;class ...
- java事件监听器无效_Java的事件监听器学习心得
在Java的swing编程中,Java中的事件机制非常常用 一. 事件监听器的参与者: 1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是 ...
- JAVA设置按钮无效_JAVA设置的按钮监听没有反应
展开全部 你还没给按钮添加监听器.62616964757a686964616fe59b9ee7ad9431333332643337 an1 = new JButton("确定"); ...
- java oracle executeupdate 无效_Java语言的品味(三)
我们接着上次讨论的Java是一门面向对象的编程语言这个话题继续下去.在前边的两篇文章里,我谈到了Java中有些做的不好的地方.今天就来谈谈做得好的地方.当然,这个好,只是我个人觉得好,还是有不少人是有 ...
- java方法声明无效_Java错误 - “无效的方法声明;需要返回类型”
正如你所看到的,代码公共圆(双r)......怎么样 与我在公共CircleR(双r)中所做的不同?对于 无论如何,书中的代码都没有给出错误 我说那里有一个错误. 定义类的构造函数时,它们应与其类具有 ...
- java方法声明无效_Java错误-“无效的方法声明;需要返回类型”
小编典典 如您所见,代码public Circle(double r)....与我在public CircleR(double r)中所做的有什么不同?无论出于什么原因,本书的代码中都没有错误,但是我 ...
- java虚拟机栈帧_Java虚拟机,运行时栈帧结构
业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...
- java 方法引用无效_InvalidProgramException:调用方法时无效的IL代码
我收到此运行时错误: InvalidProgramException: Invalid IL code . 我正在使用unity 5.3.1f1 . 该项目是编辑器扩展 . 代码的简化版本是: pub ...
最新文章
- 【安装】Mysql在Linux上安装
- 【37.38%】【codeforces 722C】Destroying Array
- Thinkphp5.1依赖注入、容器、闭包的注入
- VUE data传值
- 使用微信云托管快速部署一个.Net Core项目(一)
- 如何学人工智能的思考
- 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
- 15-Scala使用Option、Some、None,避免使用null
- win10启动项_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度
- Safari、IE8、iPhone和BlackBerry在Pwn2Own竞赛中被挑落
- Python导入Excel名单实现随机抽取
- 轻微课好不好?来自轻微课校友的成才经历自述。
- 未來用工新趨勢_2019年社会化用工成新趋势
- 吴晓波罗振宇2019跨年演讲感想
- Spring aop 循环依赖 Is there an unresolvable circular reference?
- 图神经网络的图网络学习(上)
- 网站自动翻译-网站批量自动翻译-网站免费翻译导出
- 美鸽队长:会飞的移动空气质量监测站
- 什么是BPM工具?BPM工具有哪些功能?白码详解
- 仿六间房网页视频聊天室 网页视频直播系统源码