首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在arraylist for循环中执行Collections.swap()安全吗?

在arraylist for循环中执行Collections.swap()安全吗?
EN

Stack Overflow用户
提问于 2016-04-25 06:05:43
回答 2查看 1.8K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
private List<String> listOfStrings = new ArrayList<>();
listOfStrings.add("a");
listOfStrings.add("b");
listOfStrings.add("c");
listOfStrings.add("d");

for (String temp : listOfStrings) {
  if (temp.equals("c")) {
    Collections.swap(listOfStrings, 0, listOfStrings.indexOf(temp));
  }
}

这个列表可能不仅仅是字符串列表,还可以是我编写的类定义的对象列表。我不确定交换,我看到它编译和运行良好,但我不知道它在这里是否安全。

有人对此有什么建议吗?如果我需要交换的话。我计划使用for (int i = 0; i < size; i++)迭代并使用list.get(i)获取项,但我认为在数组列表中使用list.get(i)不是个好主意吗?

任何帮助都将不胜感激!提前谢谢!!

EN

Stack Overflow用户

发布于 2016-04-25 07:29:21

我猜你的问题是‘我可以抛出一个ConcurrentModificationException__?'

要回答这个问题,您应该知道何时以及为什么在集合中抛出ConcurrentModificationException

ArrayList为例:

  • ArrayList有一个字段modCount,意思是modification count。当调用一些导致ArrayList结构修改的方法(如add()/remove() )时,会增加modCount``(modCount++)
  • ArrayList.Iterator有一个字段expectedModCount,创建时由ArrayList的modCount分配。当调用next()remove()时,将将expectedModCountmodCount进行比较,如果不等于,则会引发ConcurrentModificationException
  • Collections.swap的源代码: 公共静态空交换(List<?> list,int i,int j) {最终列表l= list;l.set(i,l.set(j,l.get(I);} Collections.swap调用ArrayList的set()方法,该方法不会增加modCount,因此不会导致ConcurrentModificationException
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36833111

复制
相关文章

相似问题

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