📅  最后修改于: 2023-12-03 15:40:55.320000             🧑  作者: Mango
在哈希表数据结构中,使用列表头来实现链表是一种常见的操作。使用列表头可以更加高效地实现哈希表链,提高哈希表的搜索、插入、删除等操作的效率。在Java中,可以通过HashMap类来实现哈希表链。
下面是用列表头实现哈希表链的Java程序示例代码:
import java.util.ArrayList;
import java.util.LinkedList;
public class HashTable<Key, Value> {
// 哈希表数组长度为质数 997
private static final int capacity = 997;
// 哈希表数组
private ArrayList<LinkedList<KeyValue>> hashArray;
// 键-值对的数量
private int size;
// 哈希表构造函数
public HashTable() {
hashArray = new ArrayList<>(capacity);
for (int i = 0; i < capacity; i++) {
hashArray.add(new LinkedList<KeyValue>());
}
size = 0;
}
// 获取哈希表键-值对数量
public int size() {
return size;
}
// 判断哈希表是否为空
public boolean isEmpty() {
return size() == 0;
}
// 哈希函数
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % capacity;
}
// 插入键-值对
public void put(Key key, Value value) {
LinkedList<KeyValue> list = hashArray.get(hash(key));
for (KeyValue kv : list) {
if (kv.key.equals(key)) {
kv.value = value;
return;
}
}
list.addLast(new KeyValue(key, value));
size++;
}
// 根据键获取值
public Value get(Key key) {
LinkedList<KeyValue> list = hashArray.get(hash(key));
for (KeyValue kv : list) {
if (kv.key.equals(key)) {
return kv.value;
}
}
return null;
}
// 删除键-值对
public void delete(Key key) {
LinkedList<KeyValue> list = hashArray.get(hash(key));
for (KeyValue kv : list) {
if (kv.key.equals(key)) {
list.remove(kv);
size--;
return;
}
}
}
// 键值对构造函数
private class KeyValue {
private Key key;
private Value value;
public KeyValue(Key key, Value value) {
this.key = key;
this.value = value;
}
}
}
本程序通过使用ArrayList和LinkedList数据结构来实现哈希表链。其中,ArrayList存放的是链表,LinkedList存放的是键值对(KeyValue)。本程序中的哈希函数使用了Java自带的哈希函数,根据键的hashCode()值来计算哈希值。值得注意的是,本程序中使用了静态数组长度,因为静态数组的长度只能在编译时确定,无法在运行时改变,因此在确定数组长度时需要多加考虑。
在插入、搜索和删除操作中,本程序使用了Java的内置迭代器,可以在遍历链表时快速查找需要的键值对。值得注意的是,在插入操作中,当哈希表中已经存在相同的键时,需要用现有值覆盖掉原值,而不是多次插入同一个键值对。
本程序以使用列表头实现哈希表链为主题,通过Java语言来实现哈希表,介绍了哈希表的常见操作以及如何使用列表头来实现哈希表链的方法。希望对开发有所帮助。