如何在Java中有效地添加,设置和删除List,Collection等中的元素?

时间:2011-11-22 15:55:31

标签: java list

以下是Java中的错误代码。

package wrapper;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

final public class Main 
{
    public static void main(String... args) 
    {
        List<String>list=new ArrayList<String>();

        list.add("A");
        list.add("B");
        list.add("C");

        Iterator<String>it=list.iterator();

        while(it.hasNext())
        {
            String item=it.next();

            if(item.equals("B"))
            {
                list.remove(item);
            }
            System.out.println(item);
        }


        ListIterator<String>listIterator=list.listIterator();

        listIterator.set("D");       //Throws java.lang.IllegalStateException
        listIterator.add("D");

        System.out.print("\n\n");
        for(Object o:list)
        {
            System.out.println(o);
            if(o.equals("C"))
            {
                listIterator.remove();    //Throws java.lang.IllegalStateException
            }
        }
    }
}

在处理 EJB 中的实体或其他情况时,使用ListCollectionSet等非常常见。有时在创建相应的迭代器之后修改它们时,它们会抛出java.lang.CurrentModificationException,这是非常关键的避免。


在上面的代码中,我无法在创建Iterator it后添加或删除元素。这样做会引发java.lang.CurrentModificationException。如何有效地避免它?


接下来,我使用名为 listIterator ListIterator<String>,它会抛出相应的异常,如上面的注释代码所示。我们如何避免它们并添加&amp;分别使用add()和set()方法有效地设置元素?


此外,通过语句listIteratorlistIterator.add("D");添加元素会在列表顶部显示元素。为什么呢?

1 个答案:

答案 0 :(得分:3)

您将收到ConcurrentModificationException,因为您在尝试迭代它时正在修改基础集合。您无法在remove上使用迭代器的循环内的list上调用list

但是,Iterator接口提供了一个可选的remove方法,可用于从您正在迭代的列表中删除项目。在循环中调用it.remove();将删除迭代器返回的最后一个元素。

同样适用于ListIterator。

至于为什么add方法把东西放在“列表的顶部”,请查看documentation。发生的事情是新元素被直接放在下一次调用next时返回的元素前面的基础列表中。因此,在循环的下一次迭代中,当您调用next时,您将获得刚刚插入的元素。