首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对CopyOnWriteArrayList排序

如何对CopyOnWriteArrayList排序
EN

Stack Overflow用户
提问于 2015-03-02 08:21:59
回答 5查看 5.8K关注 0票数 7

我想对CopyOnWriteArrayList进行排序。但是当我试图运行以下代码时

它在扔unsorted operation exception

代码语言:javascript
复制
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)  

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-03-02 08:34:20

Collections.sort使用ListIterator.set

代码语言:javascript
复制
    ...
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }

但是CopyOnWriteArrayList的ListIterator不支持删除、设置或添加方法。

解决办法:

代码语言:javascript
复制
    Object[] a = list.toArray();
    Arrays.sort(a);
    for (int i = 0; i < a.length; i++) {
        list.set(i, (String) a[i]);
    }
票数 11
EN

Stack Overflow用户

发布于 2017-05-11 12:47:30

Evgeniy的解决方案以正确的方式指出,但是list.set(i, (String) a[i])必须获得列表中每个元素的list锁。如果有一个并发线程写入list,这将大大降低循环的速度。

为了最小化阻塞,最好减少改变list的语句数量

代码语言:javascript
复制
    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的解决方案,它可能会看到一个部分排序的列表。

票数 6
EN

Stack Overflow用户

发布于 2017-08-16 12:38:12

在JDK1.8中可以直接使用sort(Comparator<? super E> c)

代码语言:javascript
复制
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;
    }
});
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28805283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档