哈希表(Hash Table)是一种非常重要的数据结构,它利用哈希函数将键(Key)映射到存储桶(Bucket)的位置,从而实现快速的插入、查找和删除操作。在Java中,哈希表通常由HashMap
类实现。
以下是一个简单的哈希表实现,仅用于教学目的,不建议在生产环境中使用。
首先,定义一个哈希函数,它可以根据键计算哈希值:
java
public class HashTable {
private static final int DEFAULT_CAPACITY = 16;
private int capacity;
private List<LinkedList<KeyValuePair>> buckets;
// 简单的哈希函数
private int hash(int key) {
return key % capacity;
}
// 键值对类
private static class KeyValuePair {
int key;
Object value;
KeyValuePair(int key, Object value) {
this.key = key;
this.value = value;
}
}
public HashTable() {
this(DEFAULT_CAPACITY);
}
public HashTable(int capacity) {
this.capacity = capacity;
buckets = new ArrayList<>(capacity);
for (int i = 0; i < capacity; i++) {
buckets.add(new LinkedList<>());
}
}
}
然后,我们可以实现插入、查找和删除操作:
java
public class HashTable {
// ... 省略之前的代码 ...
// 插入键值对
public void put(int key, Object value) {
int index = hash(key);
LinkedList<KeyValuePair> bucket = buckets.get(index);
for (KeyValuePair pair : bucket) {
if (pair.key == key) {
pair.value = value; // 更新值
return;
}
}
bucket.add(new KeyValuePair(key, value)); // 插入新的键值对
}
// 获取键对应的值
public Object get(int key) {
int index = hash(key);
LinkedList<KeyValuePair> bucket = buckets.get(index);
for (KeyValuePair pair : bucket) {
if (pair.key == key) {
return pair.value;
}
}
return null; // 未找到键
}
// 删除键值对
public void remove(int key) {
int index = hash(key);
LinkedList<KeyValuePair> bucket = buckets.get(index);
Iterator<KeyValuePair> iterator = bucket.iterator();
while (iterator.hasNext()) {
KeyValuePair pair = iterator.next();
if (pair.key == key) {
iterator.remove(); // 删除键值对
return;
}
}
}
}
注意:
- 这个实现使用了简单的取模运算作为哈希函数,但在实际中,哈希函数的设计要复杂得多,需要考虑哈希冲突的解决、哈希分布的均匀性等问题。
- 当哈希表中的元素过多时,可能会导致哈希冲突加剧,影响性能。此时,可以通过重新分配更大的空间并重新哈希所有元素来解决这个问题,这通常被称为"扩容"或"再哈希"。
- Java中的
HashMap
类使用了更复杂的数据结构和算法,包括链表和红黑树来解决哈希冲突和保持性能。这个简单的哈希表实现仅用于教学目的,无法与HashMap
的性能和功能相比。