Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Vector getting java.util.ConcurrentModificationException中删除列表_Java_Collections_Iterator_Concurrentmodification - Fatal编程技术网

从Vector getting java.util.ConcurrentModificationException中删除列表

从Vector getting java.util.ConcurrentModificationException中删除列表,java,collections,iterator,concurrentmodification,Java,Collections,Iterator,Concurrentmodification,我试图从下面这样的向量中删除列表 public class StringVectorTest { private final List<String> stringVector = new Vector<String>(); @Test public void listRemoveTest(){ List<String> list = stringVector.subList(0, 2); stringVector.removeAll(

我试图从下面这样的向量中删除列表

public class StringVectorTest {

private final List<String> stringVector = new Vector<String>();

@Test
public void listRemoveTest(){

    List<String> list = stringVector.subList(0, 2);

    stringVector.removeAll(list);

    Assert.assertEquals(stringVector.size(), 3);
}

@Before
public void fillList(){
    stringVector.add("ABC");
    stringVector.add("DEF");
    stringVector.add("GEH");
    stringVector.add("IJK");
    stringVector.add("LMN");
}
我知道我必须使用
迭代器
来克服这个
ConcurrentModificationException
谁能告诉我应该如何有效地使用它/最佳实践

提前感谢。

按以下步骤操作:

public void listRemoveTest() {
    stringVector.subList(0, 2).clear();
    Assert.assertEquals(stringVector.size(), 3);
}
按以下步骤操作:

public void listRemoveTest() {
    stringVector.subList(0, 2).clear();
    Assert.assertEquals(stringVector.size(), 3);
}
从的javadoc:

当对象的并发修改不允许时,检测到该修改的方法可能会引发此异常。 例如,通常不允许一个线程在另一个线程迭代集合时修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括JRE提供的所有通用集合实现)可能会选择抛出此异常。这样做的迭代器被称为“fail fast Iterator”(快速失败迭代器),因为它们快速、干净地失败,而不是冒着在将来不确定的时间出现任意、不确定行为的风险

请注意,此异常并不总是表示对象已被其他线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将抛出此异常。

后者正是您正在做的(请参阅您发布的堆栈跟踪)。由于该方法返回列表的视图,因此从该方法返回的列表由您的
stringVector
支持,因此返回列表中的非结构性更改反映在
stringVector
中,反之亦然

因此,您应该使用此“视图”删除元素:

@Test
public void listRemoveTestClearingSubList(){
    stringVector.subList(0, 2).clear();    
    Assert.assertEquals(stringVector.size(), 3);
}
因为使用迭代器有点棘手和难看:

@Test
public void listRemoveTestClearingWithIterator(){
    Iterator<String> it = stringVector.iterator();
    for (int i = 0; i < 2 && it.hasNext(); i++) {
        it.next();
        it.remove();
    }

    Assert.assertEquals(stringVector.size(), 3);
}   
@测试
public void listRemoveTestClearingWithIterator(){
迭代器it=stringVector.Iterator();
对于(int i=0;i<2&&it.hasNext();i++){
it.next();
it.remove();
}
Assert.assertEquals(stringVector.size(),3);
}   
来自的javadoc:

当对象的并发修改不允许时,检测到该修改的方法可能会引发此异常。 例如,通常不允许一个线程在另一个线程迭代集合时修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括JRE提供的所有通用集合实现)可能会选择抛出此异常。这样做的迭代器被称为“fail fast Iterator”(快速失败迭代器),因为它们快速、干净地失败,而不是冒着在将来不确定的时间出现任意、不确定行为的风险

请注意,此异常并不总是表示对象已被其他线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将抛出此异常。

后者正是您正在做的(请参阅您发布的堆栈跟踪)。由于该方法返回列表的视图,因此从该方法返回的列表由您的
stringVector
支持,因此返回列表中的非结构性更改反映在
stringVector
中,反之亦然

因此,您应该使用此“视图”删除元素:

@Test
public void listRemoveTestClearingSubList(){
    stringVector.subList(0, 2).clear();    
    Assert.assertEquals(stringVector.size(), 3);
}
因为使用迭代器有点棘手和难看:

@Test
public void listRemoveTestClearingWithIterator(){
    Iterator<String> it = stringVector.iterator();
    for (int i = 0; i < 2 && it.hasNext(); i++) {
        it.next();
        it.remove();
    }

    Assert.assertEquals(stringVector.size(), 3);
}   
@测试
public void listRemoveTestClearingWithIterator(){
迭代器it=stringVector.Iterator();
对于(int i=0;i<2&&it.hasNext();i++){
it.next();
it.remove();
}
Assert.assertEquals(stringVector.size(),3);
}