在Java中打印ArrayList时的不同输出

时间:2018-08-07 09:28:26

标签: java collections

查看两个输出的最后2行为什么不同? 我对程序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”是编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

3 个答案:

答案 0 :(得分:5)

您几乎肯定要使用al.add(2, al);,而不是al.addAll(2, al);,它会添加al内容(因为该方法调用完成之前就已经存在)到al

目前,您只是将ArrayList对象添加到列表中,并且由于缺乏通用参数(不希望使用!),因此ArrayList可以包含任何旧内容,因此可以编译并运行得很好。

您正在遇到此问题,因为您使用的是没有任何通用参数的通用ArrayList。如果您显式地使用ArrayList<Integer>,那么该行将无法编译。仅出于传统,向后兼容的原因,才支持不使用此类参数的情况,并且应避免使用该参数。

答案 1 :(得分:2)

在程序2中,该行:

al.add(2,al);  

在索引2处将Arraylist'al'添加到自身中。代码:

al.get(2)

因此返回一个ArrayList。这就是为什么打印两个列表返回不同结果的原因。

为避免此类问题,请使用以下命令初始化ArrayList: ArrayList<Integer>

答案 2 :(得分:1)

首先,您的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)方法添加了。以及是否看到add(index,element)in Class ArrayList`的定义。

您会找到这个。

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参数。

一定是

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

注意:请同时查看add(index, Element)addAll(Collection c)JavaDocs的定义。