我正在做一个程序来压缩文件(表示为 Byte 的 ArrayList ),在某些时候我必须用单个字节替换所有出现的预定义“字符串”(“字符串”作为字节序列,而不是 Java 语言中的字符串)。
Byte 的 ArrayList 类型的“预定义字符串”存放在变量 opt_word 中,其长度存放在变量 opt_length 中,且始终 >=2
我在标有“HERE”的地方收到并发修改异常。进一步的调试表明,异常发生在第一次替换后的循环迭代中。
我知道其他人问过类似的问题,例如这里和这里,但我的情况与他们的情况完全不同。我使用标准 for 循环。
CopyOnWriteArrayList<Integer> removal_indexes = new CopyOnWriteArrayList<Integer>();
for(int j=0, l=0; j <= encoded.get(k).size() - opt_length; ++j, ++l)
{
List<Byte> str = encoded.get(k).subList(j, j + opt_length);
if (str.equals(opt_word)) // <-- here
{
removal_indexes.add(l);
j += opt_length - 1;
}
}
for(int l=0; l < removal_indexes.size(); ++l)
{
encoded.get(k).set(removal_indexes.get(l), (byte)(lowr + lengths.size()));
for(int i=1; i < opt_length; ++i)
encoded.get(k).remove(removal_indexes.get(l)+1);
}