Java并发修改

时间:2013-01-06 14:28:50

标签: java concurrency

我有以下代码:

System.out.println(dislist.size());

for (int k = 0; k < 10; k++) {
    System.out.println(k + dislist.get(k).first + dislist.get(k).second);

    if (!dislist.get(k).first.equals(Nodename)) {
        if (dislist.get(k).first.equals(myfirst) ||
            dislist.get(k).first.equals(mysecond) ||
            dislist.get(k).second.equals(myfirst) ||
            dislist.get(k).second.equals(mysecond)) {
                dislist.remove(k);                    
            }
        }
    }
}

问题是:开头的印刷清楚地表明dislist.size()是10。 但是,我得到一个数组超出范围的异常,告诉我列表的大小不超过6。 是的,我在此前几行将DID添加到列表中。 我想当循环开始时还没有完成。 有没有办法强制Java(在同一个方法中)只有当列表中确实有10个对象时才启动循环?

2 个答案:

答案 0 :(得分:5)

您在迭代时会从List中删除元素。这就是尺寸变化的原因。

dislist.remove(k);

创建一个新列表,并将要删除的每个元素添加到其中。循环完成后,使用disList.removeAll(listOfElementsToRemove)一次删除它们。

答案 1 :(得分:4)

Iterator<YourClass> iter = dislist.iterator();
while (iter.hasNext()) {
     YourClass obj = iter.next();
     if (/* your expression */) {
          iter.remove();
     }
}