Java dla każdej działającej pętli
Pracowałem nad pewnym zadaniem,gdy przypadkowo według mnie coś było nie tak ale kod wykonany i podał poprawny wynik. Byłem trochę zaskoczony i zastanawiałem się, jak to wszystko działa w każdej pętli. Przykład (przykładowy program),
public static void main( String[] args )
{
String myInput = "hello , hi , how are you ";
String[] splitted = myInput.split(",");
List<String> mylist = new ArrayList<String>();
for (String output : splitted)
{
mylist.add(output);
}
for (String output : mylist)
{
System.out.println(output);
mylist = new ArrayList<String>(); //It worked
mylist.add(output);
}
for (String output : splitted)
{
mylist.add(output);
}
for (String output : mylist)
{
System.out.println(output);
mylist.add(output); // After this line it threw exception java.util.ConcurrentModificationException
}
}
Byłem ciekawy wiedzieć i podczas wyszukiwania znalazłem jeszcze jeden post, który powiedział, że możemy usunąć elementy z listy, jeśli użyjemy podejścia iteratora, więc spróbowałem,
for (String output : splitted)
{
mylist.add(output);
}
for (Iterator iterator2 = mylist.iterator(); iterator2.hasNext();)
{
String string = (String) iterator2.next();
System.out.println(string);
iterator2.remove(); //It worked but if I used the same thing to remove element from original list it threw exception.
}
Teraz chcę tylko wiedzieć, co dzieje się za każdą cytowaną powyżej pętlą.
Chcę poznać aspekt techniczny, wiem, że nie mogę zmodyfikować kolekcji dla każdej pętli, ale w niektórych przypadkach wymienionych powyżej zadziałało dlaczego?