我有以下用于对ConcurrentHashMap进行排序的代码:
ConcurrentHashMap<String,String> text = new ConcurrentHashMap<String,String>();
....
List<String> list = new ArrayList<String>(text.values());
Collections.sort(list);
抛出NoSuchElementException:
Caused by: java.util.NoSuchElementException
at library.ArrayList$Itr.next(ArrayList.java:1232)
at library.ArrayList$ListItr.next(ArrayList.java:1263)
at java.util.Collections.sort(Collections.java:120)
我无法理解为什么。有什么想法吗?
答案 0 :(得分:3)
根据java api
<强> NoSuchElementException异常强> 由nextElement方法抛出 枚举表示存在 枚举中没有更多元素。
我在本地测试了以下代码
ConcurrentHashMap<String, String> t = new ConcurrentHashMap<String, String>();
List<String> al = new ArrayList<String>(t.values());
Collections.sort(al);
System.out.println("no bugs");
(使用Eclipse jdk 1.5)我得到了预期的输出。在将一些键值对放入ConcurrentHashMap之后我也运行了本地测试并且没有问题。根据我的成功,似乎以下一个(或两个)导致我们的结果之间存在差异。
A)我们正在使用不同的类实现(我使用jdk 1.5中的java.util.concurrent.ConcurrentHashMap,java.util.List,java.util.ArrayList)
B)您正在修改ArrayList
或ConcurrentHashMap
的内容。当迭代器迭代所述对象的内容时。运行排序时是否发生异常?我最好的猜测是另一个线程在你排序时弄乱你的ArrayList
(因为ConcurentHashMap
应该是线程安全的)。
答案 1 :(得分:-1)
没有必要创建一个新的ArrayList进行排序,因此,您可以这样做:
ConcurrentHashMap<String,String> text = new ConcurrentHashMap<String,String>();
List<String> textList=text.values(); //unmodifiable List here.
Collections.sort(textList);// it also can sort.
:OF