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

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

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

7 ответов


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

оба класса можно найти из java.пакет утиль. Разница между 2 объясняется в следующем 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 и выше (как и в любом другом классе в основа коллекции).

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 на объекте для каждой пары?

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

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

key1=value1
key2=value2

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


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

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

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

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