我的任务是用Java编写哈希表,该哈希表必须适用于任何数据类型。我正在编写的代码规则如下:-哈希表必须具有一个数组作为基础数据结构,其大小在构造对象时确定- 发生冲突时,应该放置碰撞的元素链接列表,该列表包含哈希表中该索引(键)处的所有元素
因此,对于基础数据类型,我做了一个LinkedList类型的数组(自定义,不是Java API LinkedList)。
private LinkedList<T>[] table;
当然,问题是实例化此数组。这是我的一些尝试:
public HashTable(int size) { table = new LinkedList<T>[size]; }
这将引发编译时通用数组创建错误。
public HashTable(int size) { table = (LinkedList<T>[])(new Object[size]); }
这会ClassCastException在运行时导致错误(java.lang.Object无法转换为LinkedList)。
ClassCastException
java.lang.Object
LinkedList
项目负责人也不确定如何处理此问题。有什么办法可以更改我的代码,以使哈希表仍然具有数组作为其基础数据结构,并且冲突位于LinkedList中?
这对我有用:
public class HashTable<T> { private LinkedList<T> table[]; @SuppressWarnings("unchecked") public HashTable(int size) { table = new LinkedList[size]; } }
例如:
HashTable<String> t = new HashTable<String>(10); t.table[0] = new LinkedList<String>(); t.table[0].add("test"); System.out.println(t.table[0].get(0));
是的,构造函数生成了一个警告(说明“ unchecked”注释),但是此后代码可以正常工作而没有更多警告。