Ao aprender a coleção em Java, observa -se que a coleção de interface raiz de hierarquia da coleção implementa a interface Iterable <T> (localizada no pacote java.lang), que permite que os objetos se tornem o alvo da instrução "foreach". A única maneira nesta interface é retornar um iterador que itera em um conjunto de elementos do tipo t.
1. Iterador
Interface: Iterador <T>
interface pública iterator <e> {boolean hasNext (); E próximo (); void remover (); }Olhando para a API da interface do iterador, você pode saber que este é um iterador que itera sobre a coleção. O iterador permite que o chamador remova os elementos da coleção apontada pelo iterador durante a iteração usando semântica bem definida.
É particularmente digno de nota que esse método Remover () Remover () é usado: Remova o último elemento retornado pelo iterador da coleção apontada pelo iterador (operação opcional). Este método só pode ser chamado uma vez por chamada em seguida. Se a coleção apontada pelo iterador for modificada de outras maneiras além de chamar esse método (Método Remover) ao itera, o comportamento do iterador será incerto. Ao projetar a interface do iterador <T>, o designer de interface apontou que, quando itera, se o método remover (), exceto o iterador, for chamado e a coleção apontada pelo iterador for modificada, causará consequências incertas. Quais são as consequências, dependendo da implementação específica do iterador. Em resposta às possíveis situações dessa conseqüência incerta, uma delas foi encontrada ao aprender a Arraylist: o iterador lança uma exceção concorrente de exceção da ModificationException. As exceções específicas são mostradas no código a seguir:
importar java.util.ArrayList; importar java.util.Collection; importar java.util.iterator; public class iTarAtorTest {public static void main (string [] args) {collection <string> list = new ArrayList <String> (); list.add ("Android"); list.add ("iOS"); list.add ("Windows Mobile"); Iterator <string> iterator = list.iterator (); while (iterator.hasnext ()) {string lang = iterator.Next (); list.Remove (Lang); // lançará concorrentemodificaçãoException}}} Esse código lançará uma exceção do ConcurrentModificationException ao executar, porque não usamos o método Remow () do iterador para excluir o elemento durante a execução do iterador, mas, em vez disso, usará o método Remow () da ArrayList para alterar a coleção apontada pelo iterador. Isso viola os princípios de design do iterador; portanto, ocorre uma exceção.
A anormalidade relatada é a seguinte:
Exceção no thread "Main" java.util.concurrentmodificationException
em java.util.arraylist $ ittr.checkforComodification (ArrayList.java:859)
em java.util.arraylist $ ittr.next (ArrayList.java:831)
em text.itaratorTest.main (itaratortest.java:17)
2. FOR-ECH ITERATOR E ITERATOR <T>
A partir do Java 5, há um loop for-Eacha em Java, que pode ser usado para percorrer a coleta e a matriz. Os loops foreach permitem atravessar a coleção sem chamar o método hasNext () no while loop sem manter o índice no loop tradicional para o loop ou usar o iterador /listiterator (uma implementação do iterador no ArrayList). O loop for-Each simplifica o processo de travessia de qualquer coleção ou matriz. No entanto, há dois pontos para prestar atenção ao usar loops foreach.
Objetos que usam loops foreach devem implementar a interface iterável <t>
Por favor, veja o seguinte exemplo:
importar java.util.arraylist; classe pública foreachtest1 {public static void main (string args []) {customCollection <string> myCollection = new CustomCollection <String> (); myCollection.add ("java"); myCollection.add ("scala"); myCollection.add ("Groovy"); // O que esse código fará, imprima a linguagem, lançar exceção ou // compensar o erro de tempo para (String Language: MyCollection) {System.out.println (idioma); }} classe privada CustomCollection <T> {Private ArrayList <T> Bucket; public CustomCollection () {Bucket = new ArrayList (); } public int size () {return bucket.size (); } public boolean isEmpty () {return bucket.isempty (); } public boolean contém (t o) {return bucket.contains (o); } public boolean add (t e) {return bucket.add (e); } public boolean Remover (t o) {return bucket.remove (o); }}} O código acima não será compilado, porque a classe CustomCollection no código não implementa a interface Iterable <T>, e o erro relatado durante o período de compilação é o seguinte:
Exceção no tópico "Main" java.lang.error: Problema de compilação não resolvida:
Só pode iterar sobre uma matriz ou uma instância de java.lang.iterable
em text.foreachtest1.main (foreachtest1.java:15)
De fato, não há necessidade de esperar até a compilação para encontrar um erro. O Eclipse exibirá um erro no loop foreach após o término do código: só pode iterar sobre uma matriz ou uma instância de java.lang.iterable
Ele pode ser confirmado novamente a partir do exemplo acima de que o loop foreach é aplicável apenas a objetos que implementam a interface iterable <T>. Como todas as classes de coleção embutidas implementam a interface java.util.Collection e herdaram Iterable, a fim de resolver o problema acima, você pode optar por simplesmente permitir a CustomCollection para implementar a interface de coleta ou o Herite AbstractCollection. A solução é a seguinte:
importar java.util.abstractCollection; importar java.util.ArrayList; importar java.util.iterator; public classe foreachtest {public static void main (string args []) {customCollection <string> myCollection = new CustomCollection <string> (); myCollection.add ("java"); myCollection.add ("scala"); myCollection.add ("Groovy"); para (String Language: MyCollection) {System.out.println (idioma); }} classe estática privada CustomCollection <T> estende o abstractCollection <T> {Private ArrayList <T> Bucket; public CustomCollection () {Bucket = new ArrayList (); } public int size () {return bucket.size (); } public boolean isEmpty () {return bucket.isempty (); } public boolean contém (objeto o) {return bucket.contains (o); } public boolean add (t e) {return bucket.add (e); } public boolean Remover (objeto o) {return bucket.remove (o); } @Override Public iterator <T> iterator () {// TODO Method Auto-Generated Stub Return bucket.iterator (); }}}2. A implementação interna do loop foreach também é implementada pelo Iterator.
Para verificar o fato de que o loop foreach usa o iterador como uma implementação interna, ainda usamos o exemplo inicial deste artigo para verificar:
classe pública ITARATORTEST {public static void main (string [] args) {collection <string> list = new ArrayList <String> (); list.add ("Android"); list.add ("iOS"); list.add ("Windows Mobile"); // exemplo1 // iterator <string> iterator = list.iterator (); // while (iterator.hasnext ()) {// string lang = iterator.Next (); // list.remove (lang); //} // Exemplo 2 para (String Language: List) {list.Remove (Idioma); }}} Exceção relatada quando o programa é executado:
Exceção no thread "Main" java.util.concurrentmodificationException
em java.util.arraylist $ ittr.checkforComodification (ArrayList.java:859)
em java.util.arraylist $ ittr.next (ArrayList.java:831)
em text.itaratorTest.main (itaratortest.java:22)
Essa exceção apenas mostra que o loop for-Each usa o iterador para iterar através da coleção, que também chama Iterator.Next (), que verifica as alterações (elemento) e lança um concorrente.
Resumir:
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.