java 中 List 删除时需要的注意事项
这里有新鲜出炉的 Java 函数式编程, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
最近在利用 java 中的 LIST 在删除时发现了一个错我, 通过查找相关的资料终于解决了, 觉着有必要分享处理给同样遇到这个问题的朋友参考, 下面这篇文章主要介绍了 java 中 List 删除时需要的注意事项, 需要的朋友可以一起来看看吧
java 中的 LIST 在删除时, 一般会用 list.remove(o); 但这样往往会出现问题, 先来看下面的这段代码:
- package com.demo;
- import java.util.ArrayList;
- import java.util.List;
- public class Test11 {
- public void delete() {
- List < Integer > list = new ArrayList < Integer > ();
- list.add(1);
- list.add(2);
- list.add(2);
- list.add(3);
- for (int i = 0; i < list.size(); i++) {
- if (list.get(i) == 2) {
- list.remove(i);
- }
- }
- this.outputList(list);
- }
- private void outputList(List < Integer > list) {
- for (Integer i: list) {
- System.out.println(i);
- }
- }
- public static void main(String[] args) {
- Test11 t = new Test11();
- t.delete();
- }
- }
返回结果是:
1 2 3
这结果显然不是我们的预期, 我们是希望删除 List 中所有为 2 的元素, 但输出结果中却出现了 2, 这是因为在 i 等于 1 时, 删除了 List 中的 index 为 1 的元素 2, 这时候 list 为 [1,2,3], 但接下来, i 递增后, 等于 2, 在 list.get(i) 时, 取出来的结果就成为了 3 了, 也就是说随着 list 元素的删除, index 是随之变化的, 这就是其中的陷阱, 于是, 我们得寻找一个在删除时, 索引不发生变化的迭代方式来删除, 而 iterator 是被创建之后会建立一个指向原来对象的单链索引表, 当原来的对象数量发生变化时, 这个索引表的内容不会同步改变, 也就是用 cursor 来维护这个索引表, 于是, 可以这样来删除:
- package com.demo;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- public class Test11 {
- public void delete() {
- List < Integer > list = new ArrayList < Integer > ();
- list.add(1);
- list.add(2);
- list.add(2);
- list.add(3);
- this.iteratorDelete(list.iterator(), 2);
- this.outputList(list);
- }
- private void iteratorDelete(Iterator < Integer > it, int deleteObject) {
- while (it.hasNext()) {
- int i = it.next();
- if (i == deleteObject) {
- it.remove();
- }
- }
- }
- private void outputList(List < Integer > list) {
- for (Integer i: list) {
- System.out.println(i);
- }
- }
- public static void main(String[] args) {
- Test11 t = new Test11();
- t.delete();
- }
- }
这个代码结果就是正确的了!
可能有人会说, 我是在 iterator 中删除的, 为什么 list 的值会发生改变? 这个问题, 自已思考去吧! 思考不出来, 可以转行了!
来源: http://www.phperz.com/article/18/0209/358791.html