Prefácio
O motivo da introdução do aprimoramento para loops: nas versões anteriores do JDK5, é mais problemático atravessar elementos em uma matriz ou coleção e iterador do comprimento ou coleção da matriz.
Uma nova sintaxe é definida no JDK5 - aprimorada para loops para simplificar essas operações. O aprimorado para loops só pode ser usado em matrizes ou coleções que implementam interfaces iteráveis.
Formato de sintaxe:
para (variável variável variável: matriz ou coleção que precisa ser iterada) {
}
Em Java, atravessar coleções e matrizes geralmente têm os três formulários a seguir:
for (int i = 0; i <list.size (); i ++) {System.out.print (list.get (i)+",");} iterator iterator = list.iterator (); while (iterator.hasNext ()) {System.out.print (iterator.Next () + ",");} para (Inteiro I: List) {System.out.print (i + ",");} O primeiro é comum para a travessia do loop, o segundo é usar iteradores para Traversal, e o terceiro é geralmente chamado aprimorado para o loop (para cada um).
Princípio da implementação
Pode -se observar que a terceira forma é o açúcar sintático fornecido por Java. Aqui, analisamos como isso aumentou o loop é implementado na camada subjacente.
Descompilar o seguinte código:
para (Inteiro I: List) {System.out.println (i);}Após a descomposição:
Número inteiro i; para (iterator iterator = list.iterator (); iterator.hasnext (); system.out.println (i)) {i = (inteiro) iterator.next (); } O código descompilado é realmente bastante complicado, então vamos dividi -lo na ordem de execução:
Inteiro i; define uma variável temporária i
Iterator iterator = list.iterator (); Obtenha o iterador da lista
iterator.hasnext (); determina se existem elementos intabertos no iterador
i = (inteiro) iterator.Next (); Obtenha o primeiro elemento intimidado e atribua -o à variável temporária i
System.out.println (i) produz o valor da variável temporária i
Isso ciclos até que todos os elementos da lista sejam atravessados.
Através da decompilação, vemos que a camada subjacente do aprimorada para loops em Java é realmente implementada através do padrão de iterador.
O poço de melhorar o loop for
Diz -se que isso é um poço no aprimoramento do loop, mas é realmente principalmente porque algumas pessoas podem entrar no poço no princípio da implementação do aprimoramento do loop.
Como o aprimoramento do loop é implementado por meio de um iterador, ele deve ter as características de um iterador.
Há um mecanismo de falha em Java. Ao usar um iterador para atravessar elementos, você deve ter cuidado ao excluir a coleção. Se você usá -lo de maneira inadequada, poderá ocorrer uma concepção simultânea. Esta é uma exceção de tempo de execução e não ocorrerá durante o período de compilação. Ele só explodirá quando o programa estiver em execução.
Como no código a seguir:
para (Student Stu: Students) {if (stu.getId () == 2) alunos.remove (stu); }Uma exceção concorrente de exceção de exceção será lançada.
O iterador trabalha em um encadeamento separado e possui um bloqueio mutex. Depois que o iterador é criado, uma tabela de índice de ligação única apontando para o objeto original. Quando o número de objetos originais muda, o conteúdo desta tabela de índice não muda de maneira síncrona; portanto, quando o ponteiro do índice se mover para trás, o objeto para iterar não pode ser encontrado; portanto, de acordo com o princípio Fail-Fast, o iterador será lançado imediatamente.
Java.util.ConcurrentModificationException Exceção.
Portanto, o iterador não permite que os objetos iterados sejam alterados quando funciona.
Mas você pode usar o próprio método do iterador remove() para excluir o objeto. Iterator.remove() manterá a consistência do índice ao excluir o objeto iterado atual.
Exclua corretamente os elementos durante a travessia:
Iterator <very Student> stuiter = estudantes.iterator (); while (stuiter.hasNext ()) {Student Student = stuiter.Next (); if (student.getId () == 2) stuiter.remove (); // Aqui você precisa usar o método de remoção do iterador para remover o objeto atual. Se você usar o método de remoção de lista, o ConcurrentModificationException também aparecerá} Ok, aqui vou apresentar -lhe o princípio de implementação de aprimorar o loop for e as armadilhas nas quais você pode cair se usá -lo indevidamente. Portanto, embora seja uma sintaxe simples para cada um, você também deve entender seus princípios, caso contrário, pode levar a alguns problemas inexplicáveis.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.