在java中创建要与哈希表一起使用的通用数组

在java中创建要与哈希表一起使用的通用数组,java,generics,hash,nullpointerexception,Java,Generics,Hash,Nullpointerexception,我理解散列表背后的想法,但是实现变得令人沮丧。我读了一些书,得到了各种各样的答案。我已经读到,我可以实现一个通用的对象数组,如下所示: TableContainer[] classTable = (TableContainer<Object,Object>[]) new TableContainer[256]; 我得到一个空指针异常。我知道在java中创建泛型数组会因为类型擦除而变得混乱,但我认为上面的实现可以工作。有没有办法创建泛型列表或数组作为哈希表使用?不允许使用h

我理解散列表背后的想法,但是实现变得令人沮丧。我读了一些书,得到了各种各样的答案。我已经读到,我可以实现一个通用的对象数组,如下所示:

TableContainer[] classTable = 
    (TableContainer<Object,Object>[]) new TableContainer[256];

我得到一个空指针异常。我知道在java中创建泛型数组会因为类型擦除而变得混乱,但我认为上面的实现可以工作。有没有办法创建泛型列表或数组作为哈希表使用?不允许使用hashtable/hashmap类

在使用对象引用之前,仍然必须初始化数组中的对象引用。像这样

tableContainer[] a = new tableContainer<Whatever, SomeClass>[SIZE];
for ( int i = 0 ; i < a.length; i++ ) {
     a[i] = new tableContainer<Whatever, SomeClass>();
}

当然,您必须将数组初始化为大于0的大小,这与您在示例中所做的不同。

在使用它们之前,您仍然必须初始化数组中的对象引用。像这样

tableContainer[] a = new tableContainer<Whatever, SomeClass>[SIZE];
for ( int i = 0 ; i < a.length; i++ ) {
     a[i] = new tableContainer<Whatever, SomeClass>();
}

当然,您必须将数组初始化为大于0的大小,这与您的示例不同。

首先,您要创建一个空数组:

new TableContainer[0]
而且,由于不能随着时间的推移调整数组的大小,因此没有太多意义。假设您实际创建了一个正大小的数组,那么您必须记住一件事:您创建了一个引用数组。默认情况下,每个数组都被初始化为默认的零值,对于引用来说这恰好是null

因此,你需要这样的东西:

classTable = new TableContainer[8];
classTable[0] = new TableContainer();
//...later
if(classTable[0] != null) {  //will pass for [0], but not for [1]
  classTable[0].key
}

首先,您要创建一个空数组:

new TableContainer[0]
而且,由于不能随着时间的推移调整数组的大小,因此没有太多意义。假设您实际创建了一个正大小的数组,那么您必须记住一件事:您创建了一个引用数组。默认情况下,每个数组都被初始化为默认的零值,对于引用来说这恰好是null

因此,你需要这样的东西:

classTable = new TableContainer[8];
classTable[0] = new TableContainer();
//...later
if(classTable[0] != null) {  //will pass for [0], but not for [1]
  classTable[0].key
}

抱歉,发布了错误的代码行。数组大小为256。我想我遇到的问题是,我没有设置数组值,我只是假设它们将根据tableContainer构造函数设置为null。我会查一查的。对不起,发错代码了。数组大小为256。我想我遇到的问题是,我没有设置数组值,我只是假设它们将根据tableContainer构造函数设置为null。我将对此进行检查。那么我是否需要创建一个循环,将类表数组中的每个位置初始化为一个新的tableContainer?我假设我的阵列初始化会为我做到这一点,很可能我错了。很好,谢谢,这就是我做出假设的结果:P@ZachCaudle:是的,您需要循环或延迟初始化每个项目。否则编译器将不得不猜测您要使用哪个构造函数。那么我是否需要创建一个循环,将类表数组中的每个位置初始化为一个新的tableContainer?我假设我的阵列初始化会为我做到这一点,很可能我错了。很好,谢谢,这就是我做出假设的结果:P@ZachCaudle:是的,您需要循环或延迟初始化每个项目。否则,编译器将不得不猜测要使用哪个构造函数。