ПрограммированиеBackend разработчик

Как работают коллекции в Java? Чем отличаются ArrayList, LinkedList и HashMap?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В Java коллекции реализуют структуры данных для работы с группами объектов. Основные структуры:

  • ArrayList (реализует интерфейс List) хранит элементы в массиве, обеспечивает быстрый доступ по индексу, но вставка/удаление элементов посередине — медленные, так как предполагает сдвиг элементов.

  • LinkedList (также реализует List) построен на двусвязном списке. Быстро вставляет/удаляет элементы в середине, но доступ по индексу медленный, поскольку приходится проходить список от начала или конца.

  • HashMap реализует интерфейс Map. Хранит пары ключ-значение. Быстрый доступ (О(1)) к значениям по ключу обеспечивается через хеш-функцию, но не гарантирует порядок элементов.

List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // быстро arrayList.get(0); // быстро List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // чуть медленнее linkedList.add(0, "B"); // быстро Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // быстро

Вопрос с подвохом.

В чём принципиальное отличие между HashMap и Hashtable, и почему Hashtable практически не используется в современном коде?

Ответ: HashMap не синхронизирован, допускает null и как ключ, и как значение. Hashtable синхронизирован (несколько потоков могут работать с одним объектом без угрозы целостности), но не допускает null и медленнее. В современном коде чаще используют ConcurrentHashMap для потокобезопасности, так как он эффективнее и тоньше настраивается для многопоточных вычислений.

Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException

Примеры реальных ошибок из-за незнания тонкостей темы.


История

В системе учёта учеников использовали ArrayList для частых вставок и удалений в середине списка, что привело к сильной деградации производительности при большом объёме данных. После замены на LinkedList ситуация нормализовалась.


История

В одной мультитредовой CRM системе использовали HashMap для хранения данных между потоками без синхронизации, что периодически приводило к неконсистентным данным и падениям из-за race condition. После перехода на ConcurrentHashMap баг исчез.


История

Разработчик попытался добавить null-ключ в Hashtable, не зная о запрете. Это вызвало NullPointerException, долго не могли найти, почему приложение неожиданно падает.