请勿在java中使用集合时避免并发修改异常

时间:2011-11-18 09:57:24

标签: android

如何避免以下代码中的并发修改异常? BeanList是Bean对象的列表

Bean bean = BeanList.get(0);
List<Bean> tempList = BeanList.subList(1, BeanList.size());
Collections.sort(tempList);
tempList.add(0, bean);
BeanList.clear();
BeanList.addAll(tempList);

2 个答案:

答案 0 :(得分:5)

作为未来参考。尝试将您的问题减少到最小的编译示例。它使我们的工作更轻松。在您的问题中描述您的所有数据类型。这里我们要猜测BeanList的数据类型是什么。还遵守Java命名约定。班级名称以大写字母开头。成员变量以小写字母开头(即beanList而不是BeanList)。格式错误的代码对我们来说很难,你想要帮助的人,阅读。提供堆栈跟踪并告知代码中的哪一行会导致异常。

您的问题不在Bean类或同步中。

您的问题与您在子列表中的操作方式有关。

List.subList()实际上并没有创建新列表。它在现有列表中创建“视图”,并与原始列表共享数据结构。当您清除原始列表的内容时,您还清除子列表的内容,然后当您尝试访问子列表(其数据已更改)时,您将获得异常。

创建一个新列表,您可以从子列表中添加所有元素。

    List<Bean> tempList = new ArrayList<Bean>();
    tempList.addAll(list.subList(1, list.size()));

答案 1 :(得分:0)

您可以使用番石榴。

首先,导入:

  

api'com.google.guava:guava:26.0-android

然后使用下面的代码:

Collections2.orderedPermutations(userList, new Comparator<BrandMenuHeaderModel>() {
                @Override
                public int compare(UserModel m1, UserModel cm) {
                    return m1.getName() - m2.getName();
                }
            });