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

时间:2017-08-06 08:08:41

标签: java collections

我有两个ArrayList s(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]

我的问题:

  1. 为什么a2.addAll()方法会打印两次数据?
  2. addaddAll之间的确切区别是什么?这两个方法都返回boolean。

5 个答案:

答案 0 :(得分:3)

  

为什么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);

答案 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