我想对CopyOnWriteArrayList进行排序。但是当我试图运行以下代码时
它在扔unsorted operation exception。
public class CopyOnWriteArrayListExample {
public static void main(final String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
list.add("3");
list.add("2");
list.add("1");
Collections.sort(list);
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.set(CopyOnWriteArrayList.java:1049)
at java.util.Collections.sort(Collections.java:159)
at com.sac.list.CopyOnWriteArrayListExample.main(CopyOnWriteArrayListExample.java:15) 提前谢谢。
发布于 2015-03-02 08:34:20
Collections.sort使用ListIterator.set
...
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}但是CopyOnWriteArrayList的ListIterator不支持删除、设置或添加方法。
解决办法:
Object[] a = list.toArray();
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
list.set(i, (String) a[i]);
}发布于 2017-05-11 12:47:30
Evgeniy的解决方案以正确的方式指出,但是list.set(i, (String) a[i])必须获得列表中每个元素的list锁。如果有一个并发线程写入list,这将大大降低循环的速度。
为了最小化阻塞,最好减少改变list的语句数量
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
// ... fill list with values ...
ArrayList<Integer> temp = new ArrayList<>();
temp.addAll(list);
Collections.sort(temp);
list.clear(); // 1st time list is locked
list.addAll(temp); // 2nd time list is locked缺点是,如果并发线程在clear()和addAll(temp)之间读取addAll(temp),它将看到一个空列表,而使用Evgeniy的解决方案,它可能会看到一个部分排序的列表。
发布于 2017-08-16 12:38:12
在JDK1.8中可以直接使用sort(Comparator<? super E> c)。
List<Integer> list = new CopyOnWriteArrayList<Integer>();
list.add(3);
list.add(4);
list.add(1);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});https://stackoverflow.com/questions/28805283
复制相似问题