[英]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.
注意 :還請查看
JavaDocs
的add(index, Element)
和addAll(Collection c)
定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.