Вопрос проверяет понимание внутренней реализации LinkedHashSet в Java и его отличий от HashSet, что важно для выбора правильной коллекции при необходимости сохранения порядка вставки.
LinkedHashSet является наследником HashSet и реализует интерфейс Set. Его ключевая особенность — предсказуемый порядок итерации, который соответствует порядку добавления элементов (insertion-order). Это достигается за счет изменения внутренней структуры данных.
LinkedHashSet внутри использует LinkedHashMap в качестве backing map. В то время как обычный HashSet хранит элементы в массиве бакетов (корзин) на основе хэш-кода, LinkedHashMap расширяет эту структуру, добавляя к каждой записи (Entry) два дополнительных поля: before и after. Эти поля образуют двусвязный список, соединяющий все записи в порядке их добавления.
import java.util.LinkedHashSet;
public class Example {
public static void main(String[] args) {
LinkedHashSet set = new LinkedHashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.add("Apple"); // Дубликат, не добавится
// Итерация выведет элементы в порядке добавления
for (String fruit : set) {
System.out.println(fruit); // Apple, Banana, Cherry
}
}
}LinkedHashSet полезен в сценариях, где важен порядок, но при этом необходима уникальность элементов и быстрый доступ по значению (в среднем O(1)). Например: кэширование с LRU-политикой (хотя для LRU обычно используют LinkedHashMap напрямую), удаление дубликатов из списка с сохранением исходного порядка, или реализация очереди уникальных элементов.
Вывод: Используйте LinkedHashSet, когда вам нужна коллекция без дубликатов, но при этом критично сохранить порядок вставки элементов, и вы готовы к небольшому дополнительному расходу памяти на поддержку связного списка.