Sobes.tech
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);
    }
}