Muitas vezes você precisa usar o processo de programação para a coleção, e nós ArrayList é muitas vezes usado, mas em um recente aumento eliminações e tem havido alguns problemas, compartilhando o próximo registro.
Dois dos pontos de código após a
List<String> arrayList1 = new ArrayList<String>();
arrayList1.add("1");
arrayList1.add("2");
for (String s : arrayList1) {
if("1".equals(s)){
arrayList1.remove(s);
}}
List<String> arrayList2 = new ArrayList<String>();
arrayList2.add("2");arrayList2.add("1");
for (String s : arrayList2) {
if("1".equals(s)){
arrayList2.remove(s);
}
}
resultados do programa são os seguintes:
arrayList1 o método remove for bem sucedida,
o método remove de arrayList2 operação lançar exceção ConcurrentModificationException.
Nós ver o código fonte para analisar o motivo da exceção
porque a essência é usar o foreach iterator Iterator, todas as classes de coleção Collecation vai implementar a interface Iterable.
Encontrar iterador método de classe ArrayList ()
public Iterator<E> iterator() {
return new Itr();
}
Essência iteração é primeiro hasNext chamada () método determina o próximo elemento de memória não está presente, em seguida, usar o método seguinte () para remover um elemento
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object\[\] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData\[lastRet = i\];
}
O arraylist1 acima Por que pode removê-lo com sucesso? Na verdade, é apenas um ciclo, tão bem sucedido.
Uma vez que o elemento 1 depois de remover, torna-se um tamanho-1, então a variável dentro Itr cursor de 0 a 1, 1 = 1, neste momento, o fim do ciclo, de modo bem sucedido.
Por arraylist2 falha remove? Porque é o segundo ciclo de tempo, mas também remover um sucesso, mas o terceiro juiz cursor na próxima vez não é igual a um valor de 2 resulta no tamanho atual 1, então o próximo método de execução, o mais importante veio antes remove resultados da operação ArrayList em um valor de adicionar 1 modCount então a classe Itr expectedModCount permanece inalterado, ele irá lançar uma exceção.
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
Da mesma forma disponíveis, devido à operação de adição levará a incremento modCount, ele não pode ser excluído no foreach, adicionar, modificar elementos no ArrayList.
Neste sentido, recomendamos a utilização de um elementos remove iterator Iterator.
Iterator<String> ite = arrayList2.iterator();
while(ite.hasNext()) {
if("1".equals(ite.next())) {
ite.remove();
}
}
Se não houver operação simultânea, também precisamos ser bloqueado operações Iterator.
Autor: lutando pequenos programadores
https://www.toutiao.com/i6754322606561690116/
Eu recomendei ao meu blog para ler mais:
1. o Java da JVM, coleções, multithreading, nova série de tutoriais
2. o Spring MVC, o Bota da Primavera, as séries da Primavera de tutoriais Nuvem
3. Maven, Git, o Eclipse, IntelliJ IDEA Ferramenta Série Tutorial
4. o Java, a arquitetura de back-end, o Alibaba e outros fabricantes enfrentam novas questões
A vida é bela, ver amanhã ~