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时的一些问题相关推荐

  1. java光标位置无效_java - java.sql.SQLException:无效的光标位置 - 堆栈内存溢出

    我创建了一个简单的应用程序,使用户可以购买门票. 但是,每当我尝试购买" n"张门票时,都会遇到此错误. 现在,我知道在使用数据库进行操作时需要crs.next()语句,我已经使用 ...

  2. java for update 无效_java.sql.BatchUpdateException:调用中的无效参数

    检查此循环. 这里,在i = 0的情况下,取出(0-1)为-1. 我们知道List提供了基于0的索引,所以你的str.get(..)应该从0开始,而不是从-1开始 试试这个 public void i ...

  3. java方法声明无效_java 方法声明无效 需要返回类型

    如题了代码如下望高手指点/*客户机端程序*/importjava.net.*;importjava.io.*;importjava.awt.*;importjava.awt.event.*;class ...

  4. java事件监听器无效_Java的事件监听器学习心得

    在Java的swing编程中,Java中的事件机制非常常用 一. 事件监听器的参与者: 1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是 ...

  5. JAVA设置按钮无效_JAVA设置的按钮监听没有反应

    展开全部 你还没给按钮添加监听器.62616964757a686964616fe59b9ee7ad9431333332643337 an1 = new JButton("确定"); ...

  6. java oracle executeupdate 无效_Java语言的品味(三)

    我们接着上次讨论的Java是一门面向对象的编程语言这个话题继续下去.在前边的两篇文章里,我谈到了Java中有些做的不好的地方.今天就来谈谈做得好的地方.当然,这个好,只是我个人觉得好,还是有不少人是有 ...

  7. java方法声明无效_Java错误 - “无效的方法声明;需要返回类型”

    正如你所看到的,代码公共圆(双r)......怎么样 与我在公共CircleR(双r)中所做的不同?对于 无论如何,书中的代码都没有给出错误 我说那里有一个错误. 定义类的构造函数时,它们应与其类具有 ...

  8. java方法声明无效_Java错误-“无效的方法声明;需要返回类型”

    小编典典 如您所见,代码public Circle(double r)....与我在public CircleR(double r)中所做的有什么不同?无论出于什么原因,本书的代码中都没有错误,但是我 ...

  9. java虚拟机栈帧_Java虚拟机,运行时栈帧结构

    业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...

  10. java 方法引用无效_InvalidProgramException:调用方法时无效的IL代码

    我收到此运行时错误: InvalidProgramException: Invalid IL code . 我正在使用unity 5.3.1f1 . 该项目是编辑器扩展 . 代码的简化版本是: pub ...

最新文章

  1. 【安装】Mysql在Linux上安装
  2. 【37.38%】【codeforces 722C】Destroying Array
  3. Thinkphp5.1依赖注入、容器、闭包的注入
  4. VUE data传值
  5. 使用微信云托管快速部署一个.Net Core项目(一)
  6. 如何学人工智能的思考
  7. 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
  8. 15-Scala使用Option、Some、None,避免使用null
  9. win10启动项_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度
  10. Safari、IE8、iPhone和BlackBerry在Pwn2Own竞赛中被挑落
  11. Python导入Excel名单实现随机抽取
  12. 轻微课好不好?来自轻微课校友的成才经历自述。
  13. 未來用工新趨勢_2019年社会化用工成新趋势
  14. 吴晓波罗振宇2019跨年演讲感想
  15. Spring aop 循环依赖 Is there an unresolvable circular reference?
  16. 图神经网络的图网络学习(上)
  17. 网站自动翻译-网站批量自动翻译-网站免费翻译导出
  18. 美鸽队长:会飞的移动空气质量监测站
  19. 什么是BPM工具?BPM工具有哪些功能?白码详解
  20. 仿六间房网页视频聊天室 网页视频直播系统源码

热门文章

  1. 企业邮箱能设置个人昵称吗,如何设置?
  2. 「轻阅读」基于 Flink SQL CDC的实时数据同步方案,附视频教程
  3. js修改地址栏url_前端实战总结如何在不刷新页面的情况下改变URL
  4. React入门第一天(绑定事件,动态渲染,修改样式、传参)
  5. jQuery常用语法笔记
  6. XML解析模型(完整版)
  7. PHP之JWT接口鉴权(一)
  8. PHP array(递归)转xml,xml转array
  9. 报错:ReferenceError: Cannot access 'age' before initialization
  10. QQ浏览器11版,中文输入法定位错误