Skip to content

отличия arraylist от linkedlist

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

Пример 1: Добавление элементов

ArrayList

При добавлении элементов в ArrayList, если массив заполнен, он должен быть увеличен, что может занять время O(n) из-за копирования элементов.

import java.util.ArrayList;

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

        // Добавление элементов
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }

        System.out.println("Размер ArrayList: " + arrayList.size());
    }
}

LinkedList

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

import java.util.LinkedList;

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

        // Добавление элементов
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }

        System.out.println("Размер LinkedList: " + linkedList.size());
    }
}

Пример 2: Удаление элементов

ArrayList

При удалении элемента из ArrayList, все элементы после удаляемого должны быть сдвинуты, что занимает O(n).

import java.util.ArrayList;

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

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

        // Удаление элемента
        arrayList.remove(50000); // Удаляем элемент с индексом 50000
        System.out.println("Размер ArrayList после удаления: " + arrayList.size());
    }
}

LinkedList

При удалении элемента из LinkedList, если вы знаете узел, это занимает O(1), так как просто обновляются ссылки.

import java.util.LinkedList;

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

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

        // Удаление элемента
        linkedList.remove(50000); // Удаляем элемент с индексом 50000
        System.out.println("Размер LinkedList после удаления: " + linkedList.size());
    }
}

Пример 3: Доступ по индексу

ArrayList

Доступ к элементам по индексу в ArrayList выполняется за O(1).

import java.util.ArrayList;

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

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

        // Доступ к элементу
        int element = arrayList.get(50000); // Получаем элемент с индексом 50000
        System.out.println("Элемент с индексом 50000: " + element);
    }
}

LinkedList

Доступ к элементам по индексу в LinkedList выполняется за O(n), так как необходимо пройти по узлам.

import java.util.LinkedList;

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

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

        // Доступ к элементу
        int element = linkedList.get(50000); // Получаем элемент с индексом 50000
        System.out.println("Элемент с индексом 50000: " + element);
    }
}

Когда использовать ArrayList, а когда LinkedList? (продолжение)

  • Используйте ArrayList, когда:
  • Вам нужен быстрый доступ к элементам по индексу.
  • Вы часто добавляете элементы в конец списка и не планируете часто удалять элементы из середины или начала.
  • Память важна, и вы хотите минимизировать накладные расходы на хранение дополнительных ссылок (как в случае с LinkedList).

  • Используйте LinkedList, когда:

  • Вам нужно часто добавлять или удалять элементы из начала или середины списка.
  • Вы не нуждаетесь в быстром доступе по индексу и можете позволить себе время O(n) для доступа к элементам.
  • Вы работаете с большими объемами данных, где частые операции вставки и удаления могут значительно повлиять на производительность ArrayList.

Заключение

В зависимости от требований вашего приложения, выбор между ArrayList и LinkedList может существенно повлиять на производительность.

  • Если ваша задача требует частого доступа к элементам по индексу и вы не планируете часто изменять размер списка, ArrayList будет более эффективным выбором.
  • Если же вам нужно часто добавлять и удалять элементы, особенно в начале или середине списка, LinkedList будет более подходящим вариантом.

Понимание этих различий и особенностей поможет вам принимать более обоснованные решения при выборе структуры данных для ваших приложений.