我们都知道你不能这样做:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentModificationException等等......这显然有时起作用,但并非总是如此.这是一些特定的代码:
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
Run Code Online (Sandbox Code Playgroud)
当然,这会导致:
Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)
...即使多线程没有这样做......无论如何.
什么是这个问题的最佳解决方案?如何在循环中从集合中删除项而不抛出此异常?
我也在Collection这里使用任意,不一定是ArrayList,所以你不能依赖get.
我有一个ArrayList10 String秒.如何5使用其他String值更新索引?
我在主题上发现了这个主题,我想知道为什么用Java替换List中的值是如此困难.
我的代码看起来像这样丑陋:
List<String> stringList = new ArrayList<>();
// ... add some elements
for (int i = 0; i< stringList.size(); ++i) {
if (stringList.get(i).contains("%")) {
stringList.set(i, stringList.get(i).replace("%", backupStorePath));
}
}
Run Code Online (Sandbox Code Playgroud)
这真的是唯一的方法吗?为什么我不能使用foreach循环?
for (String command : stringList) {
command = command.replace("%", backupStorePath);
}
Run Code Online (Sandbox Code Playgroud)
这必须是java的"按值复制"问题而String是不可变的,但为什么它实现了呢?为什么command原始参考的副本而不是原始参考?