如何在Java中正确定义链表数组?

我尝试在Java中定义一个链表列表,如下所示,它编译得很好,但它生成了2条警告消息。

LinkedList [] hashtable = new LinkedList[10]; warning: [rawtypes] found raw type: LinkedList LinkedList [] hashtable = new LinkedList[10]; ^ missing type arguments for generic class LinkedList where E is a type-variable: E extends Object declared in class LinkedList HashTable.java:13: warning: [unchecked] unchecked conversion LinkedList [] hashtable = new LinkedList[10]; ^ required: LinkedList[] found: LinkedList[] 

所以,我试过了

  LinkedList [] hashtable = new LinkedList[10]; 

但这次它甚至不会编译并生成此错误。

 HashTable.java:13: error: generic array creation LinkedList [] hashtable = new LinkedList[10]; ^ 1 error 

那么,我该如何正确定义我的链表数组呢?

这是创建数组的正确方法:

 @SuppressWarnings("unchecked") LinkedList [] hashtable = new LinkedList[10]; 

无法创建参数化类型的数组

您无法创建参数化类型的数组。 例如,以下代码无法编译:

 List[] arrayOfLists = new List[2]; // compile-time error 

以下代码说明了将不同类型插入到数组中时会发生什么:

 Object[] strings = new String[2]; strings[0] = "hi"; // OK strings[1] = 100; // An ArrayStoreException is thrown. 

如果您使用通用列表尝试相同的操作,则会出现问题:

 Object[] stringLists = new List[]; // compiler error, but pretend it's allowed stringLists[0] = new ArrayList(); // OK stringLists[1] = new ArrayList(); // An ArrayStoreException should be thrown, // but the runtime can't detect it. 

如果允许参数化列表数组,则前面的代码将无法抛出所需的ArrayStoreException

取自docs.oracle.com

那么我可以在hashtable []中存储什么?

这是否意味着我现在被允许在哈希表[0]中有一个字符串的链表,在哈希表1中有一个Long的链表,如果我做了LinkedList [] hashtable = new LinkedList [10]?

不,编译器不允许您直接将LinkedList存储到哈希表数组中。 以下代码段将无法编译:

 hashtable[0] = new LinkedList(); 

但是,您可以存储LinkedList而不使用类型参数,甚至可以存储LinkedList的子类:

 @SuppressWarnings("unchecked") LinkedList[] hashtable = new LinkedList[10]; hashtable[0] = new LinkedList(); hashtable[1] = new MyLinkedList(); hashtable[2] = new LinkedList(); hashtable[3] = new MyLinkedList(); 

如果将数组转换为LinkedList [],则可以存储LinkedList。 但是,除了LinkedList之外,您将无法存储任何其他内容:

 LinkedList[] rawHashTable = hashtable; rawHashTable[4] = new LinkedList(); Object[] objectHashTable = rawHashTable; objectHashTable[5] = "This line will throw an ArrayStoreException "; 

首先定义每个元素是LinkedList的数组大小。

 LinkedList hashTable[] = new LinkedList[10]; 

现在,因为数组中的每个元素都是LinkedList本身,并且它们都是null ,所以每个元素都需要初始化。 因此,

 for (int i=0;i<10;i++) hashTable[i] = new LinkedList(); 

如果要将数据添加到列表中,请执行以下操作:

 hashTable[i].add(YOUR_LONG_DATA_HERE); 

最后迭代,

 for (int i=0;i<10;i++){ for (Long j: hashTable[i]) System.out.println(j); } 

如果需要LinkedList的列表/数组,可以使用ArrayList来保存初始大小为10的集合。

以下是您可以尝试的替代方法:

 ArrayList> list = new ArrayList>(10);