Подтвердить что ты не робот

Java hashmaps без значения?

Скажем, я хочу поместить слова в структуру данных, и я хочу иметь постоянный поиск времени, чтобы увидеть, находится ли слово в этой структуре данных. Все, что я хочу сделать, это увидеть, существует ли слово. Я бы использовал для этого HashMap (containsKey())? HashMap используйте key- > value pairings, но в моем случае у меня нет значения. Конечно, я мог бы использовать null для значения, но даже null принимает пробел. Похоже, что для этого приложения должна быть лучшая структура данных.

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

Может ли кто-нибудь помочь мне?

4b9b3361

Ответ 1

Используйте HashSet. Это хеш-реализация Set, которая используется в основном именно для того, что вы описываете (неупорядоченный набор элементов).

Ответ 2

Вы хотите использовать коллекцию, реализующую интерфейс Set, возможно, HashSet, чтобы получить указанную производительность. См. http://java.sun.com/javase/6/docs/api/java/util/Set.html

Ответ 3

Вероятно, вы захотите использовать java.util.Set. Реализации включают java.util.HashSet, который является эквивалентом Set HashMap.

Даже если объекты, содержащиеся в коллекции, не изменяются, вам может потребоваться синхронизация. Нужно ли добавлять новые объекты в Set после того, как Set передан в другой поток? Если это так, вы можете использовать Collections.synchronizedSet(), чтобы сделать установку потокобезопасной.

Если у вас есть карта со значениями, и у вас есть код, который просто хочет обработать карту как набор, вы можете использовать Map.entrySet() (хотя имейте в виду, что entrySet возвращает представление Set ключей в Map, если Map изменен, карту можно изменить с помощью набора, возвращаемого entrySet).

Ответ 4

Обычно вы использовали реализацию Установить и чаще всего HashSet. Если вам нужен параллельный доступ, то ConcurrentHashSet предоставляет замену, которая обеспечивает безопасный одновременный доступ, включая безопасную итерацию по набору.

Я бы рекомендовал в любом случае ссылаться на него как на простое Set во всем вашем коде, за исключением одного места, где вы его создаете; таким образом, легче отказаться от одной реализации для другой, если вы позже потребуете ее.

Даже если набор доступен только для чтения, если он используется потоком, отличным от того, который его создает, вам нужно подумать о безопасной публикации (что, убедитесь, что любой другой поток видит набор в согласованном состоянии: помните, что любые записи в памяти даже в конструкторах не гарантируются для других потоков, если вы или в ожидании, если вы не предпримете шаги для обеспечения это). Это можно сделать следующим образом:

  • убедитесь, что единственная ссылка (ссылки) на набор находится в окончательные поля;
  • убедитесь, что это правда, что нить не изменяет набор.

Вы можете помочь обеспечить последнюю, используя оболочку Collections.unmodifiableSet(). Это дает вам немодифицируемое представление данного набора - поэтому при условии, что никакая другая "нормальная" ссылка на множество экранов не будет, вы в безопасности.

Ответ 5

Кроме Set s, в некоторых случаях вам может потребоваться преобразовать Map в Set с Collections.newSetFromMap(Map<E,Boolean>) (некоторые значения Map disallow null, следовательно <<26 > ).

Ответ 6

поскольку все сказали, что HashSet, вероятно, является самым простым решением, но у вас не будет постоянного поиска времени в HashSet (поскольку записи могут быть закодированы), и вы будете хранить фиктивный объект (всегда одинаковый) для каждой записи...

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