Middle
Ինչպե՞ս կվարվի ինստանցիոնալացված ինդեքսատորը հավաքածուի համար, եթե կանչենք collection.remove() մեթոդը։
sobes.tech AI
Պատասխան AI-ից
Նախագծված iterator-ով collection.remove() կանչելը կարող է հանգեցնել ConcurrentModificationException-ի:
Սա տեղի է ունենում, քանի որ iterator-ը սովորաբար չի գիտակցում, որ հիմնական հավաքածուն ուղղակիորեն փոփոխվում է iterator-ից դուրս: Iterator-ը պահպանում է ներքին վիճակ (օրինակ, ընթացիկ տարրի ինդեքսը), որը դառնում է անվավեր, եթե հավաքածուն փոխվում է iterator-ի մեթոդներից դուրս (iterator.remove())։
Կան հավաքածուների որոշ իրականացմանը կարող է լինել "fail-fast" և հատուկ նետել ConcurrentModificationException՝ այդպիսի փոփոխությունները հայտնաբերելու դեպքում, որպեսզի կանխվի անսպասելի վարքագիծը:
Միակ անվտանգ միջոցը հավաքածուն փոփոխելու համար iterator-ի ժամանակն է օգտագործել iterator.remove() մեթոդը:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorModificationExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
// Սա կհանգեցնի `ConcurrentModificationException`
// list.remove(element);
// Անվտանգ հեռացման եղանակ
iterator.remove();
}
}
System.out.println(list);
}
}