我试图在Java中实现一个单独的链式哈希表,我遇到了classcastexception。
所以这就是我所做的:
private LinkedList<Entry<K,V>>[] bucketArray;
这个数组将保存所有将作为链的链表。 HashTable类中还有一个内部类Entry,每个包含一个K通用键和V泛型值。
在表的构造函数中,我实际上初始化了数组:
public HashTable(int capacity, int prime) {
this.capacity = capacity;
this.prime = prime;
bucketArray = (LinkedList<Entry<K, V>>[]) new Object[this.capacity];
}
因此,prime只是用于计算压缩密钥,容量用于数组大小。但是当我运行那个jvm时会抛出classcastexception。
如果我将新的Object更改为new LinkedList [this.capacity],那么我的put方法中有一个nullpointer异常,如下所示:
public void put(K k, V v) {
int h = hashValue(k);
bucketArray[h].add(new Entry<K, V>(k, v));
}
为简单起见,hashvalue方法总是返回1.
怎么能正确完成?
答案 0 :(得分:1)
您似乎正在尝试将Object[]
投射到LinkedList[]
- 这就是您收到错误的原因。实际上,如果您创建正确的类型,则甚至不需要强制转换:
bucketArray = new LinkedList[this.capacity];
您的NPE是另一个问题 - 您已经分配了bucketArray
,但其中的每个项目都是null
- 您可能希望对{{{{}}进行空检查1}}并在尝试向其添加条目之前将其分配给bucketArray[h]
。