Java中Collections中的Collection.add()方法和Collection.addAll()方法有什么区别

Cod*_*rDS 5 java collections

我有两个ArrayLists (a1a2) 如下:

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]
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 为什么a2.addAll()方法打印数据两次?
  2. add和之间的确切区别是addAll什么?这两种方法都返回布尔值。

das*_*ght 7

为什么a2.addAll()方法打印数据两次?

因为在您调用add(a1)上一行之后,第一个副本已经存在。

add()和之间的确切区别是addAll()什么?这两种方法都返回boolean

add添加单个项目,同时addAll逐个添加集合中的每个项目。最后,true如果集合已被修改,两种方法都会返回。在ArrayList这种情况下,这是微不足道的,因为集合总是被修改,但如果添加的项目已经存在Set,则其他集合(例如)可能会返回false

注意:部分混淆是您的列表是无类型的,因此它们包含混合对象:a1混合字符串和数字,同时a2混合字符串、数字和列表。为您的集合使用特定的泛型类型可以防止这种混淆,因为您可以使用addaddAll,但不能同时使用两者:

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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*hyM 5

该方法add()将一项添加到您的ArrayList,在本例中为另一项ArrayList
该方法addAll()将所有项目从一个添加ArrayList到另一个。

为了显示:

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
Run Code Online (Sandbox Code Playgroud)