В 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, долго не могли найти, почему приложение неожиданно падает.