Sobes.tech
Назад к вопросам
Junior — Middle
63

Как сравнить эффективность по времени операций между ArrayList и LinkedList?

Компании, где спрашивали
ЛанитЛанит

Ответ от нейросети

sobes.tech AI

Для сравнения эффективности операций по времени между ArrayList и LinkedList в Java нужно учитывать особенности их реализации:

  • ArrayList основан на массиве, обеспечивает быстрый доступ по индексу (O(1)), но вставка или удаление элементов в середине списка требует сдвига элементов (O(n)).
  • LinkedList реализован как двусвязный список, доступ по индексу медленнее (O(n)), но вставка и удаление элементов в середине списка выполняется быстрее (O(1)), если известна позиция узла.

Чтобы сравнить эффективность, можно измерить время выполнения операций, например, вставки, удаления и доступа:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListPerformanceTest {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        List<Integer> linkedList = new LinkedList<>();

        // Заполнение списков
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
            linkedList.add(i);
        }

        // Измерение времени доступа по индексу
        long start = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            arrayList.get(i);
        }
        long end = System.nanoTime();
        System.out.println("ArrayList get: " + (end - start) + " ns");

        start = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            linkedList.get(i);
        }
        end = System.nanoTime();
        System.out.println("LinkedList get: " + (end - start) + " ns");

        // Измерение времени вставки в начало
        start = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            arrayList.add(0, i);
        }
        end = System.nanoTime();
        System.out.println("ArrayList add at start: " + (end - start) + " ns");

        start = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            linkedList.add(0, i);
        }
        end = System.nanoTime();
        System.out.println("LinkedList add at start: " + (end - start) + " ns");
    }
}

В итоге:

  • Для частого доступа по индексу лучше использовать ArrayList.
  • Для частых вставок и удалений в середине или начале списка лучше подходит LinkedList.