我正在尝试在 Java 中实现一个单独的链式哈希表,并且遇到了 classcast 异常。
这就是我所做的:
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];
}
所以素数只是用来计算压缩 key ,容量是数组大小。但当我运行时,jvm 抛出 classcastException。
如果我将 new Object 更改为新 LinkedList [this.capacity],那么我的 put 方法中会出现空指针异常,如下所示:
public void put(K k, V v) {
int h = hashValue(k);
bucketArray[h].add(new Entry<K, V>(k, v));
}
为了简单起见,hashvalue 方法始终返回 1。
怎样才能正确完成呢?
最佳答案
看起来您正在尝试将 Object[]
转换为 LinkedList[]
- 这就是您收到错误的原因。事实上,如果您创建了正确的类型,则甚至不需要强制转换:
bucketArray = new LinkedList[this.capacity];
您的 NPE 是一个不同的问题 - 您已经分配了 bucketArray
,但其中的每个项目都是 null
- 您可能想要对bucketArray[h]
并将其分配给新的 LinkedList
,然后再尝试向其中添加条目。
关于java - 将泛型集合转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118815/