[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-collections-predlozhite-effektivnyy-algoritm-udaleniya-neskolkikh-ryadom-stoyashchikh-elementov-iz-serediny-arraylist":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},452,"predlozhite-effektivnyy-algoritm-udaleniya-neskolkikh-ryadom-stoyashchikh-elementov-iz-serediny-arraylist",12,"collections","Collections","📚","Предложите эффективный алгоритм удаления нескольких рядом стоящих элементов из середины ArrayList","Самый эффективный способ — использовать метод `subList(fromIndex, toIndex).clear()`. Внутри он вызывает `System.arraycopy()` один раз, перемещая все элементы правее удаляемого диапазона на нужное количество позиций влево.\n\n```java\n\u002F\u002F Удалить элементы с позиции 100 по 200 (не включая 200)\nlist.subList(100, 200).clear();\n```\n\nНаивный подход — вызывать `remove(index)` в цикле N раз — приводит к тому, что каждый remove выполняет свой сдвиг элементов. Это O(N * M), где N — количество удаляемых элементов, M — количество оставшихся справа. subList().clear() делает один сдвиг — O(M).\n\n\u003Cdetails>\n\u003Csummary>Пример с замером производительности\u003C\u002Fsummary>\n\n```java\nimport java.util.ArrayList;\n\npublic class Main {\n    private static final int SIZE = 1_000_000;\n\n    public static void main(String[] args) {\n        ArrayList\u003CInteger> list1 = new ArrayList\u003C>(SIZE);\n        for (int i = 0; i \u003C SIZE; i++) list1.add(i);\n\n        ArrayList\u003CInteger> list2 = new ArrayList\u003C>(list1);\n\n        \u002F\u002F Удаление через remove() — медленно\n        long start = System.currentTimeMillis();\n        for (int i = 0; i \u003C 20_000; i++) {\n            list1.remove(600_000);\n        }\n        System.out.println(\"remove() в цикле: \" + (System.currentTimeMillis() - start) + \" мс\");\n\n        \u002F\u002F Удаление через subList().clear() — быстро\n        start = System.currentTimeMillis();\n        list2.subList(600_000, 620_000).clear();\n        System.out.println(\"subList().clear(): \" + (System.currentTimeMillis() - start) + \" мс\");\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** назовите subList().clear() как оптимальный подход. Объясните, почему он быстрее: один вызов System.arraycopy() вместо N.","","middle",[15,16,17],"performance","best-practices","jcf",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":34,"featuredSnippetReady":35},"Эффективное удаление диапазона элементов из ArrayList — subList().clear() — Gymterview","subList(from, to).clear() — один System.arraycopy() вместо N. Наивный remove() в цикле — O(N*M). Пример с замером производительности.","Эффективное удаление из ArrayList — subList().clear() — Gymterview","subList(from, to).clear() — один arraycopy вместо N. Многократно быстрее remove() в цикле.",[26,27,28,29,30,31,32,33],"ArrayList","subList","clear()","System.arraycopy","удаление диапазона","оптимизация","Java","собеседование","subList(fromIndex, toIndex).clear() — один вызов System.arraycopy() вместо N. Наивный remove() в цикле выполняет N сдвигов (O(N*M)). subList().clear() — O(M), где M — количество элементов правее диапазона.",true]