我有两个ArrayList
s(a1
和a2
),如下所示:
ArrayList a1 = new ArrayList();
a1.add(8);
a1.add("a1");
ArrayList a2 = new ArrayList();
a2.add(a1); //output : [[8, a1]]
a2.addAll(a1); //output : [[8, a1], 8, a1]
我的问题:
a2.addAll()
方法会打印两次数据?add
和addAll
之间的确切区别是什么?这两个方法都返回boolean。答案 0 :(得分:3)
为什么
a2.addAll()
方法会打印两次数据?
因为您在上一行调用add(a1)
后第一份副本已经存在。
add()
和addAll()
之间的确切区别是什么?这两个方法都返回boolean
。
add
添加单个项目,而addAll
逐个添加集合中的每个项目。最后,如果集合已被修改,则两个方法都返回true
。如果是ArrayList
,这是微不足道的,因为集合始终会被修改,但如果添加的项目已经存在,则其他集合(例如Set
)可能会返回false
。
注意:部分原因是您的列表是无类型的,因此它们包含多个对象的混合:a1
混合字符串和数字,而a2
混合字符串,数字和列表。通过为add
或addAll
使用特定的通用类型可以防止这种混淆,但不能同时执行这两种操作:
List<String> a1 = new ArrayList<>();
a1.add("8");
a1.add("a1");
List<List<String>> a2 = new ArrayList<>();
a2.add(a1);
a2.addAll(a1); // <<== Does not compile
List<String> a3 = new ArrayList<>();
a3.add(a1); // <<== Does not compile
a3.addAll(a1);
答案 1 :(得分:1)
方法add()
为您的ArrayList
添加了一项,在这种情况下为ArrayList
。
方法addAll()
将所有项目从一个ArrayList
添加到另一个{/ p>
举例说明:
ArrayList a1 = new ArrayList();
a1.add(8);
a1.add("a1String"); // I changed the string value to be more clear what is a1 and what is the string "a1"
// a1 content: [8, "a1String"]
ArrayList a2 = new ArrayList();
a2.add(a1);
// a2 content: [[8, "a1String"]] - basically [a1]
// a2 has one item - a1
ArrayList a3 = new ArrayList();
a3.addAll(a1);
// a3 content: [8, "a1String"] - same content as a1
// a3 has all the items from a1
答案 2 :(得分:0)
add()
只是将对象添加到下一个索引:
public boolean add(E arg0) {
this.ensureCapacityInternal(this.size + 1);
this.elementData[this.size++] = arg0;
return true;
}
addAll()
将值复制到给定的Collection
:
public boolean addAll(Collection<? extends E> arg0) {
Object[] arg1 = arg0.toArray();
int arg2 = arg1.length;
this.ensureCapacityInternal(this.size + arg2);
System.arraycopy(arg1, 0, this.elementData, this.size, arg2);
this.size += arg2;
return arg2 != 0;
}
答案 3 :(得分:0)
add
。如果要将源集合中的所有元素添加到集合中,则使用addAll
。
在这种特殊情况下,您使用ArrayList
而未指定泛型参数,因此假定为ArrayList<Object>
。当您使用a1
添加add
时,它会将a1
视为单个对象。
默认情况下,ArrayList
将打印在方括号中,因此您会看到[[8, a1]]
。之后您使用addAll
,因此,您只需复制a1
中的所有元素,然后再次预期结果。
希望它有所帮助!
答案 4 :(得分:0)
包装其他;
import java.util.ArrayList; 导入java.util.List;
公共课练习{
public static void main(String[] args) {
//difference between add and addall
List<Integer> arrList = new ArrayList<Integer>(2);
arrList.add(5);
arrList.add(10);
System.out.println("printing arrayLIst 1");
for(Integer printNumber: arrList) {
System.out.println(printNumber);
}
List<Integer> arr2List = new ArrayList<Integer>();
arr2List.add(2);
arr2List.add(4);
System.out.println("printing arrayLIst 2");
for(Integer printNumber:arr2List) {
System.out.println(printNumber);
}
arrList.addAll(arr2List);
System.out.println("printing updated arrayLIst 1");
for(Integer printNumber: arrList) {
System.out.println(printNumber);
}
}
}
打印arrayLIst 1
5 10
打印arrayLIst 2
2 4
打印更新的arrayLIst 1
5 10 2 4