0

我正在尝试使用字符串的哈希码和数组长度的模数来获取应该为哈希表存储它的位置的索引。这是我认为我搞砸的地方:

数组声明和构造函数:

private Bucket[] list;

public Hash() {
    list = new Bucket[8];
}

和实际的代码:

//if such a key exists already, you should replace its value
public void insert(String key, Textbook value) {
    rehash();
    if(list[key.hashCode()%list.length].insert(key, value)) size++;
}

//checks if the key exists
public boolean contains(String key) {
    return (list[key.hashCode()%list.length] != null) ? list[key.hashCode()%list.length].contains(key) : false;
}

public void remove(String key) {
    if(list[key.hashCode()%list.length].remove(key)) size --;
}

insert 和 remove 返回空指针,而 contains 方法返回总是返回 false。

我做错了什么。谢谢。

4

1 回答 1

4
 list = new Bucket[8];

不分配任何Bucket对象,它只分配一个充满null值的数组。

因此,list[key.hashCode()%list.length] == null(解释为什么contains()返回null,和list[key.hashCode()%list.length].remove(...)list[key.hashCode()%list.length].insert(...)导致您尝试访问null,这反过来又导致 NPE)。

您还必须使用Bucket的构造函数或某些工厂方法迭代数组并使用非空值初始化每个元素。

于 2012-05-06T21:23:20.143 回答