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

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

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

7 ответов

Решение
Map map = new HashMap();
Hashtable ht = new Hashtable();

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

Вы можете использовать двойные скобки для настройки данных. Вы по-прежнему называете 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 и Hashtable являются общими в Java 5 и выше (как и в любом другом классе в среде Collections).

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);
import java.util.HashMap;

Map map = new HashMap();

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

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

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

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

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

key1=value1
key2=value2

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

Важно отметить, что хеш-функция 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());
Другие вопросы по тегам