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

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

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

Ответ 1

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

Оба класса можно найти в пакете java.util. Разница между двумя объясняется в следующем jGuru FAQ в записи.

Ответ 2

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

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);
 }};

Ответ 3

Также не забывайте, что как 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);

Ответ 4

import java.util.HashMap;

Map map = new HashMap();

Ответ 5

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

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

Ответ 6

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

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

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

key1=value1
key2=value2

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

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

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