簡體   English   中英

在java中打印ArrayList時輸出不同

[英]Different outputs while printing ArrayList in java

回顧兩個輸出的最后兩行為什么不同? 我對計划1感到滿意

計划1

public static void main(String[] args) 
{
    ArrayList al = new ArrayList();
    al.add(10);
    al.add(20);
    al.add(30);
    System.out.println(al);
    System.out.println("-----------------------------------");

    al.addAll(2, al);                                                       
    System.out.println("-----------------------------------");
    System.out.println(al);

    System.out.println(al.get(2).getClass());
}

Output :

[10, 20, 30]
-----------------------------------
-----------------------------------
**[10, 20, 10, 20, 30, 30]
class java.lang.Integer**

我對程序2輸出不滿意為什么在打印arraylist時輸出不同? 為什么“java.util.ArrayList”是prog 2的最后一行輸出,但是prog1的“java.lang.Integer”

計划2

public static void main(String[] args) 
    {
        ArrayList al = new ArrayList();
        al.add(10);
        al.add(20);
        al.add(30);
        System.out.println(al);
        System.out.println("-----------------------------------");

        al.add(2,al);                                                   
        al.add(8);                                                         
        al.add(2);                                                      
        al.add(4);                                                      
        al.add(1);                                                      
        System.out.println("-----------------------------------");
        System.out.println(al);
        System.out.println(al.get(2).getClass());
    }

Output : 

[10, 20, 30]
-----------------------------------
-----------------------------------
[10, 20, (this Collection), 30, 8, 2, 4, 1]
class java.util.ArrayList

而不是al.add(2, al); ,你幾乎肯定想要al.addAll(2, al); ,它將al內容 (因為它在該方法調用完成之前)添加到al

目前,您只是將一個ArrayList對象添加到列表中,並且由於缺少通用參數(不可取!),您的ArrayList可以包含任何舊東西,因此編譯並運行得很好。

您遇到了這個問題,因為您使用的是沒有任何通用參數的通用ArrayList 如果您顯式使用ArrayList<Integer> ,那么該行不會編譯。 只有傳統的向后兼容性原因才支持在沒有這些參數的情況下使用它,應該避免使用它。

在計划2中,行:

al.add(2,al);  

在索引2處將Arraylist'al'添加到自身。代碼:

al.get(2)

因此返回一個ArrayList。 這就是打印兩個列表會返回不同結果的原因。

要避免這樣的問題,請使用以下命令初始化ArrayList: ArrayList<Integer>

首先,您的ArrayList是一種原始類型,可以將任何異構對象放入其中。

這里, ArrayList是原始類型,因此即使是String對象也可以添加到此ArrayList對象al

al.add("something");
al.add(25.4D);
al.add(new Foo());  //these all possible Object can be added to this ArrayList.

在第二個示例中,您添加了使用add(index, element)方法。 如果你in Class ArrayList`中看到add(index,element)的定義。

你會發現這個。

public void add(int index, E element) {
        rangeCheckForAdd(index);
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;  //take a look at this statement.
        size++;
    }

在第5行

elementData[index] = element; // element directly put into the collection.

因此, al引用直接放入ArrayList ,並且必須添加,因為在聲明期間沒有提供這樣的TypeSafety Argument。

它一定是這樣的

ArrayList<Integer> ar = new ArrayList<>(); // this may prone to compiler time error.

注意 :還請查看JavaDocsadd(index, Element)addAll(Collection c)定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM