查看两个输出的最后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
答案 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
的定义。