Atenção! adições e exclusões ArrayList não mexa com ...

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ã ~

Acho que você gosta

Origin www.cnblogs.com/javastack/p/12515934.html
Recomendado
Clasificación