Как создать хеш-таблицу в Java?

Каков самый простой способ создать хеш-таблицу (или ассоциативный массив ...) в Java? В моем google-fu есть пара примеров, но есть ли стандартный способ сделать это?

И есть ли способ заполнить таблицу списком пар ключ-> значение без индивидуального вызова метода добавления объекта для каждой пары?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
74 817
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

import java.util.HashMap;

Map map = new HashMap();
Ответ принят как подходящий

Map map = new HashMap();
Hashtable ht = new Hashtable();

Оба класса можно найти в пакете java.util. Разница между 2 объясняется в следующем Запись часто задаваемых вопросов jGuru.

Из записи jGuru: «Ключевое различие между ними состоит в том, что доступ к Hashtable синхронизируется по таблице, а доступ к HashMap - нет. Вы можете добавить его, но по умолчанию его там нет. Другое отличие состоит в том, что итератор в HashMap является отказоустойчивым, а перечислитель для Hashtable - нет. Если вы измените карту во время итерации, вы узнаете об этом ».

ErikAGriffin 26.10.2015 13:13

Что сказал Эдмунд.

Что касается того, чтобы не вызывать .add все время, то нет, не идиоматически. Были бы различные хаки (сохранение его в массиве, а затем цикл), которые вы могли бы использовать, если бы действительно захотели, но я бы не рекомендовал это.

Также не забывайте, что и Map, и Hashtable являются общими в Java 5 и выше (как и в любом другом классе в Рамки коллекций).

Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);

Integer one = numbers.get("one");
Assert.assertEquals(1, one);

And is there a way to populate the table with a list of key->value pairs without individually calling an add method on the object for each pair?

Одна из проблем с вашим вопросом заключается в том, что вы не упоминаете, в какой форме находятся ваши данные. Если бы ваш список пар оказался списком объектов Map.Entry, это было бы довольно просто.

Чтобы выбросить это из головы, существует (очень злонамеренный) класс с именем java.util.Properties, который является расширением Hashtable. Он ожидает только строковые ключи и значения и позволяет загружать и хранить данные с помощью файлов или потоков. Формат файла, который он читает и записывает, следующий:

key1=value1
key2=value2

Не знаю, ищете ли вы это, но бывают ситуации, когда это может быть полезно.

Вы можете использовать двойные фигурные скобки для установки данных. Вы по-прежнему вызываете add или put, но это менее уродливо:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
    put("foo",      1);
    put("bar",      256);
    put("data",     3);
    put("moredata", 27);
    put("hello",    32);
    put("world",    65536);
 }};

Тип вашей переменной действительно должен быть Map. Map<String,Integer> MYHASH = new Hashtable<String,Integer>()

Steve Kuo 01.08.2012 04:34

Важно отметить, что хеш-функция Java не совсем оптимальна. Если вам нужно меньше коллизий и почти полное исключение повторного хеширования при мощности ~ 50%, я бы использовал алгоритм Buz Hash Buz Hash

Причина слабости алгоритма хеширования в Java наиболее очевидна в том, как он хеширует строки.

"a".hash() предоставит вам представление ASCII "a" - 97, поэтому "b" будет 98. Весь смысл хеширования состоит в том, чтобы присвоить произвольное и «как можно более случайное» число.

Если вам нужна быстрая и грязная хеш-таблица, непременно используйте java.util. Если вы ищете что-то надежное и более масштабируемое, я бы подумал о реализации вашего собственного.

Hashtable<Object, Double> hashTable = new Hashtable<>();

поставить значения ...

получить максимум

Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());

if (optionalMax.isPresent())
 System.out.println(optionalMax.get());

Привет, не могли бы вы добавить пояснения к своему коду? Вы можете отредактировать свой вопрос, а также использовать форматирование кода. Это кажется неприятным, но на самом деле добавит много пользы.

matthiasbe 03.05.2019 12:26

Другие вопросы по теме