欢迎访问宙启技术站
智能推送

Java函数实现哈希表算法

发布时间:2023-09-15 06:39:00

哈希表是一种常见的数据结构,用于存储键值对。哈希表的特点是通过哈希函数将键映射到表的索引,从而提高键值对的快速查找和插入性能。Java语言提供了HashMap类来实现哈希表。下面我们来实现一个简单的哈希表算法。

首先,我们需要定义一个哈希表类,包含两个成员变量:一个数组用于存储键值对,一个整型变量用于表示数组的大小。我们采用数组大小为10的哈希表。

public class HashTable {
    private Entry[] table;
    private int size;

    public HashTable() {
        table = new Entry[10];
        size = 0;
    }

    // 哈希函数
    private int hashFunction(String key) {
        int hashCode = 0;
        for (int i = 0; i < key.length(); i++) {
            hashCode += key.charAt(i);
        }
        return hashCode % 10;  // 取模运算
    }

    // 插入键值对
    public void put(String key, Object value) {
        int index = hashFunction(key);
        if (table[index] == null) {
            table[index] = new Entry(key, value);
            size++;
        } else {
            Entry entry = table[index];
            while (entry.getNext() != null) {
                entry = entry.getNext();
            }
            entry.setNext(new Entry(key, value));
            size++;
        }
    }

    // 获取值
    public Object get(String key) {
        int index = hashFunction(key);
        if (table[index] == null) {
            return null;
        } else {
            Entry entry = table[index];
            while (entry != null) {
                if (entry.getKey().equals(key)) {
                    return entry.getValue();
                }
                entry = entry.getNext();
            }
            return null;
        }
    }

    // 删除键值对
    public void remove(String key) {
        int index = hashFunction(key);
        if (table[index] != null) {
            Entry entry = table[index];
            Entry prevEntry = null;
            while (entry != null) {
                if (entry.getKey().equals(key)) {
                    if (prevEntry == null) {
                        table[index] = entry.getNext();
                    } else {
                        prevEntry.setNext(entry.getNext());
                    }
                    size--;
                    break;
                }
                prevEntry = entry;
                entry = entry.getNext();
            }
        }
    }

    // 获取哈希表大小
    public int size() {
        return size;
    }

    // 哈希表的键值对类
    private class Entry {
        private String key;
        private Object value;
        private Entry next;

        public Entry(String key, Object value) {
            this.key = key;
            this.value = value;
            this.next = null;
        }

        public String getKey() {
            return key;
        }

        public Object getValue() {
            return value;
        }

        public Entry getNext() {
            return next;
        }

        public void setNext(Entry next) {
            this.next = next;
        }
    }
}

上述代码中,我们通过一个私有成员方法hashFunction来计算键的哈希码,并通过取模运算将其映射到数组的索引位置。该哈希函数将键中各个字符的ASCII码相加后取模,这只是一个简单的示例,实际的哈希函数应该更加复杂以提高哈希算法的分布性。

put方法中,我们根据键的哈希值找到对应的索引位置,如果该位置为空,则直接插入新的键值对;如果该位置不为空,则需要遍历链表直到最后一个节点,然后将新的键值对插入到链表的末尾。

get方法中,根据给定的键找到对应的索引位置,如果该位置为空,则返回null;否则,遍历链表直到找到键值对的键与给定的键相等的节点,然后返回其值。

remove方法中,根据给定的键找到对应的索引位置,如果该位置为空,则不执行任何操作;否则,遍历链表直到找到键值对的键与给定的键相等的节点,然后将该节点从链表中删除。

最后,在Entry类中定义了键值对的结构,包含了键、值和下一个节点的引用。

使用上述实现的哈希表算法,可以方便地进行快速的键值对存储、查找和删除操作。需要注意的是,由于我们的实现中采用了开放地址法,即冲突的键值对在哈希表中以链表的形式存储,因此在查找和删除操作中需要遍历链表,导致性能较差。可以采用其他冲突解决方法,如链地址法或再哈希法,来提高哈希表的性能。

以上是一个简单的Java函数实现哈希表算法的示例。实际应用中,可以根据具体的业务需求进行相应的优化和扩展。