2017-08-06 50 views
2

Collection.add()方法和Collection.addAll()方法之間的區別,我有兩個ArrayList S(a1a2)如下:是什麼在數據庫中的Java

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有何區別?這兩個方法都返回布爾值。
+0

不要使用*生*泛型類。總是指定通用類型,例如'ArrayList '。 – Andreas

+0

您是否打擾**閱讀['add()']的文檔**(https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#add- E-)*(附加指定的元素)*和['addAll()'](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#addAll-java。 util.Collection-)*(追加指定集合中的所有元素)*方法? – Andreas

+0

@Andreas - 是的,我閱讀文檔,但看着輸出很困惑。 thnx – CoderDS

回答

1

爲什麼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); 
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; 
    } 
0

add當你需要一個元素加入到集合中。
addAll用於您希望將源集合中的所有元素添加到集合中。

在這種特殊情況下,您使用的是ArrayList而沒有指定通用參數,因此假設爲ArrayList<Object>。當您使用add添加a1時,它會將a1視爲單個對象。

默認情況下,ArrayList將打印在方括號中,因此您會看到[[8, a1]]。之後,您正在使用addAll,因此,您只需複製a1中的所有元素,並再次預期結果。

希望它有幫助!

0

該方法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