【问题标题】:How to properly define an array of linked list in Java ? [duplicate]如何在 Java 中正确定义链表数组? [复制]
【发布时间】:2015-02-23 14:16:16
【问题描述】:

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

 LinkedList<Long> [] hashtable = new LinkedList[10];

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

所以,我尝试了

 LinkedList<Long> [] hashtable = new LinkedList<Long>[10];

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

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

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

【问题讨论】:

    标签: java arrays linked-list


    【解决方案1】:

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

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

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

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

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

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

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

    如果你用通用列表尝试同样的事情,就会出现问题:

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

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

    取自docs.oracle.com

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

    这是否意味着我现在可以在 hashtable[0] 和 hashtable1 中的 Long 的链表,如果我这样做的话 LinkedList [] hashtable = new LinkedList[10]?

    不,编译器不允许您将 LinkedList 直接存储到哈希表数组中。以下 sn-p 不会编译:

    hashtable[0] = new LinkedList<String>();
    

    但是你可以存储没有类型参数的 LinkedList,甚至是 LinkedList 的子类:

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

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

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

    【讨论】:

    • 这是我最初所做的,但它产生了 2 个警告,这让我对这种方法感到非常不安全。
    • @mynameisJEFF 我已经添加了一些更多细节,为什么这是一种正确的方法。您可以使用 @SuppressWarnings("unchecked") 来抑制此警告
    • 那么,这是否意味着我现在可以在hashtable[0] 中拥有一个字符串链表,在hashtable[1] 中拥有一个Long 链表,如果我这样做LinkedList&lt;Long&gt; [] hashtable = new LinkedList[10]
    • @mynameisJEFF 我已经更新了我的答案,其中提到了我们可以在 hashtable 中存储什么
    • 我想我有点明白你现在的样子了。所以基本上,如果我定义了 `LinkedList[] hashtable = new LinkedList[10];, I have to initialize a new linked list (and it must be of type Long) at each hashtable[i]` 条目,以便将 Long 数据的链表存储到数组中。我说的对吗?
    【解决方案2】:

    首先定义数组大小,其中每个元素都是一个 LinkedList。

    LinkedList<Long> hashTable[] = new LinkedList[10];
    

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

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

    如果你想将数据添加到列表中,那么这样做:

    hashTable[i].add(YOUR_LONG_DATA_HERE);
    

    最后是迭代,

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

    【讨论】:

      【解决方案3】:

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

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

      ArrayList<LinkedList<Long>> list = new  ArrayList<LinkedList<Long>>(10);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2013-01-13
        • 1970-01-01
        相关资源
        最近更新 更多