跳到主要内容

编写Java代码实现哈希表 ?

参考答案:

哈希表是一种常用的数据结构,用于存储键值对。Java中的HashMap类就是一种哈希表的实现。不过,如果你想从头开始实现一个简单的哈希表,以下是一个基本的示例:

public class SimpleHashTable<K, V> {
    private Entry<K, V>[] table;
    private int capacity;

    public SimpleHashTable(int capacity) {
        this.capacity = capacity;
        table = new Entry[capacity];
    }

    public void put(K key, V value) {
        int index = hash(key);
        Entry<K, V> entry = table[index];
        if (entry == null) {
            table[index] = new Entry<>(key, value);
        } else {
            while (entry != null) {
                if (entry.key.equals(key)) {
                    entry.value = value;
                    return;
                }
                if (entry.next == null) {
                    entry.next = new Entry<>(key, value);
                    return;
                }
                entry = entry.next;
            }
        }
    }

    public V get(K key) {
        int index = hash(key);
        Entry<K, V> entry = table[index];
        while (entry != null) {
            if (entry.key.equals(key)) {
                return entry.value;
            }
            entry = entry.next;
        }
        return null;
    }

    private int hash(K key) {
        return Math.abs(key.hashCode()) % capacity;
    }

    private static class Entry<K, V> {
        private K key;
        private V value;
        private Entry<K, V> next;

        public Entry(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
}

这个简单的哈希表实现包含以下几个关键部分:

  1. 数组:用于存储键值对。每个数组元素是一个链表头,链表中的每个节点都包含一个键值对和一个指向下一个节点的指针。
  2. put方法:用于将键值对添加到哈希表中。首先,根据键的哈希码计算出一个索引值,然后在该索引位置查找键。如果找到,则更新值;否则,将新的键值对添加到链表的末尾。
  3. get方法:用于从哈希表中获取与给定键相关联的值。同样,首先根据键的哈希码计算出一个索引值,然后在该索引位置查找键。如果找到,则返回对应的值;否则,返回null。
  4. hash方法:用于计算键的哈希码,并将其转换为一个在数组范围内的索引值。这里使用了简单的取模运算来实现。

需要注意的是,这个简单的哈希表实现没有处理哈希冲突和动态扩容等问题。在实际应用中,你可能需要使用更复杂的算法和数据结构来实现一个更加高效和健壮的哈希表。