aps*_*aps 10 java collections iterator treeset concurrentmodification
情况:我有一个自定义对象TreeSet,我也使用了自定义比较器.我已经创建了一个在这个TreeSet上使用的迭代器.
TreeSet<Custom> ts=new TreeSet<Custom>();
Iterator<Custom> itr=ts.iterator();
while(itr.hasNext()){
Custom c=itr.next();
//Code to add a new element to the TreeSet ts
}
Run Code Online (Sandbox Code Playgroud)
问题:我想知道如果我在while循环中向TreeSet添加一个新元素,那么新元素会立即被排序.换句话说,如果我在while循环中添加一个新元素并且它小于我当前在c中保存的元素,那么在下一次迭代中我将获得与上一次迭代中相同的元素吗?(因为在排序之后,新添加的元素将占据当前元素之前的某个位置.
Mic*_*vis 23
如果在迭代期间添加元素,则下一个迭代器调用可能会抛出一个ConcurrentModificationException.请参阅TreeSet文档中的故障快速行为.
要迭代和添加元素,您可以先复制到另一个集合:
TreeSet<Custom> ts = ...
TreeSet<Custom> tsWithExtra = new TreeSet(ts);
for (Custom c : ts) {
// possibly add to tsWithExtra
}
// continue, using tsWithExtra
Run Code Online (Sandbox Code Playgroud)
ts科林建议,或者在迭代后创建一个单独的集合进行合并.
如果在while循环中向TreeSet中添加元素,则会得到java.util.ConcurrentModificationException.
Set<String> ts=new TreeSet<String>();
ts.addAll(Arrays.asList(new String[]{"abb", "abd", "abg"}));
Iterator<String> itr=ts.iterator();
while(itr.hasNext()){
String s = itr.next();
System.out.println("s: " + s);
if (s.equals("abd"))
ts.add("abc");
}
Run Code Online (Sandbox Code Playgroud)
Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)