Каковы плюсы и минусы LinkedHashMaps против LinkedHashSets? - PullRequest
6 голосов
/ 11 июня 2009

Может ли кто-нибудь объяснить основные преимущества выбора одного из них и недостатки, связанные с этим выбором?

Ответы [ 5 ]

21 голосов
/ 11 июня 2009

Они решают разные проблемы, LinkedHashMap выполняет сопоставление ключей со значениями, LinkedHashSet просто хранит коллекцию вещей без дубликатов.

Связанная хеш-карта предназначена для отображения пар ключ / значение - например, для хранения имен и возрастов:

Map<String,Integer> namesAndAges = new LinkedHashMap<String,Integer>();
namesAndAges.put("Benson", 25);
namesAndAges.put("Fred", 19);

С другой стороны, связанный хэш-набор предназначен для хранения коллекции одной вещи - имен, например:

Set<String> names = new LinkedHashSet<String>();
names.add("Benson");
names.add("Fred");
5 голосов
/ 11 июня 2009

LinkedHashSet внутренне содержит двусвязный список, проходящий через все его записи, который определяет порядок элементов. Этот класс допускает нулевые элементы.

Реализация этого класса не синхронизирована, поэтому она должна быть синхронизирована извне. LinkedHashMap также не синхронизируется и должен синхронизироваться извне

Например:

Map map = Collections.synchronizedMap(new LinkedHashMap());

Кроме этого, LinkedHashSet хранит отдельные значения для каждого элемента, а LinkedHashMap хранит пару ключ / значение.
На диаграмме ниже вы можете увидеть java.util.Collections. Сплошные прямоугольники показывают конкретную реализацию класса
альтернативный текст http://www.softfinity.com/diag1.png

3 голосов
/ 11 июня 2009

Набор имеет только значения, вы не можете помещать дубликаты. Карта имеет пару ключ / значение. Они имеют различное использование.

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

2 голосов
/ 24 октября 2009

LinkedHashMap и LinkedHashSet имеют только одно различие, и это разница между HashMap и HashSet, их родителями. Опять же, HashSet - это просто вариант HashMap. Вы можете сказать HashSet как HashMap со всеми значениями, указывающими на один конечный объект. Поэтому оба они не дают вам больших отличий.

Используя LinkedHashSet, вы должны использовать только один конечный объект, кроме ваших ключей. Используя LinkedHashMap, если для всех ключей вы установите значения как нулевые, то это лучше, чем LinkedHashSet для цели Set.

2 голосов
/ 11 июня 2009

Один набор, а другой карта. Выберите правильную структуру данных для данного сценария.

...