Хеш-таблицы Java и хеш-карты - PullRequest
0 голосов
/ 03 мая 2018

Прошло некоторое время через Java и застрял в еще одном вопросе. HashMaps или HashTables.

прошли основы ... как реализована хеш-таблица ... как вычисление хеш-значения ... сохранение данных по индексу хеш-значения (или, возможно, hashvalue% maxArray) ... линейное зондирование и сцепление для столкновений. Теперь, чтобы продолжить, если кто-то может помочь с ниже:

В базовых примерах показано сохранение строк, таких как "Jhon", "Lisa", "Sam" и т. Д., В массиве с последующим пересечением коллизий и преобразованием массива в связанный список для хранения имен, которые хорошо понятны и превосходны.

  1. Но Hashtables хранят ключ, пару значений. Так как же это достигается?
  2. Примеры ключей, пар значений показывают пример «Телефонного справочника», но не показывают, как они хранятся в массивах или связанном списке. Это просто Map.put (k, v) и Map.get (k). Хранилище связанных списков «One Data» и «Pointer» .. так как мы можем хранить ключи и значения в связанном списке (картинка может помочь в понимании)
  3. Немного более практичный пример для Hash Table, чем map.put ("Rocket", 01111111111).

1 Ответ

0 голосов
/ 03 мая 2018
  1. Но в Hashtables хранятся ключи, пары значений. Так как же это достигается?

Представьте себе структуру данных, подобную этой:

Node<K, V>[] table;

public static class Node<K, V> {
    //voila! Key and Value stored here
    private K key;
    private V value;
    //make it a linked list
    private Node<K, V> next;

}
  1. Примеры ключей, пар значений показывают пример «Телефонного справочника», но не показывают, как они хранятся в массивах или связанном списке. Это просто Map.put (k, v) и Map.get (k). Хранилище связанных списков «One Data» и «Pointer» ... так как мы можем хранить ключи и значения в связанном списке (картинка может помочь в понимании)

Контрольная точка 1.

  1. Немного более практичный пример для Hash Table, чем map.put ("Rocket", 01111111111).

Вот, пожалуйста,

public class PersonIdentifier {
    private final int id;
    private final String ssn;

    public PersonIdentifier(int id, String ssn) {
        this.id = id;
        this.ssn = ssn;
    }
    //getters, NO setters since fields are final...

    //now the relevant methods!
    @Override
    public int hashCode() {
        //available since Java 7...
        return Objects.hash(id, ssn);
    }

    @Override
    public boolean equals(Object o) {
        if (o == null) return null;
        if (this == o) return true;
        if (!o.getClass().equals(this.getClass())) return false;
        Person another = (Person)o;
        return another.id == this.id && another.ssn.equals(this.ssn);
    }
}

//...

Map<PersonIdentifier, Person> peopleMap = new HashMap<>();
peopleMap.put(new PersonIdentifier(1, "123456789"), new Person(/* fill with values like firstName, lastName, etc... */));
peopleMap.put(new PersonIdentifier(2, "987654321"), new Person(/* fill with values like firstName, lastName, etc... */));
//and on...
...