如何在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);