2016-06-28 3 views
-5

Может вы объясните следующее утверждение о коде:JAVA Коллекции с использованием итератора и равно против ==

Collection<String> stringCollection = new HashSet<String>(); 
stringCollection.add(new String ("bye")); 
stringCollection.add(new String ("hi")); 
stringCollection.add(new String ("bye again")); 
for(Iterator<String> iter=stringCollection.iterator(); 
    iter.hasNext();){ 
     String str=iter.next(); 
     if(str.equals("hi")) 
      iter.remove(); 
} 
for (String str: stringCollection){ 
     if(str.equals("hi")) 
       stringCollection.remove("hi"); 
} 
System.out.println(stringCollection.size()); 

Если мы изменим порядок обеих петель, то код будет работать без ошибок и печати 2: Неверный есть ошибка времени выполнения, но почему это кажется правильным?

+1

Есть 3 очень разные вопросы, заданные здесь. Можете ли вы сосредоточиться на одном? Тем не менее, обратитесь к http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re для a) и http://stackoverflow.com/questions/14150628/string- constant-pool-java для b) и http://stackoverflow.com/questions/16079931/java-lists-remove-method-works-only-for-second-last-object-inside-for -each-loo для c) – Tunaki

+0

Tunaki: один вопрос: что происходит в этом конкретном коде, что порядок имеет значение и «равен»? – avivlevi

ответ

0

Ошибка вызвана тем, что вы пытаетесь удалить элемент коллекции во время цикла итерации, поэтому всякий раз, когда метод удаления вызывается в этом фрагменте кода, выдается исключение параллельной модификации.

for (String str : stringCollection) { 
    if (str.equals("hi")) 
     stringCollection.remove("hi"); 
} 

Причина, почему нет ошибки при запуске кода, как писал потому, что первый цикл удаляет элемент «привет» и, следовательно, второй цикл никогда не называет stringCollection.remove (...).

И как уже упоминалось @Tunaki это уже пояснялось here

Смежные вопросы