我們在編碼時經常需要將一些元素添加到一個List中,此時我們一般有兩種選擇:Collections.addAll()或者是ArrayList.addAll()。在需添加元素比較少的情況下,並在List的size在萬級以上時,一般建議Collections.addAll(),但當List的size較小時,兩種方法沒有什麼區別,甚至ArrayList.addAll()更好。
當我們將一個數組添加到一個List中時,Collections.addAll()和ArrayList.addAll()沒有什麼性能差異。
但當我們將一個List添加到一個List中時,建議使用ArrayList.addAll()。
添加數組和列表,要比添加元素快。
HashMap和HashSet有類似用法。
示例代碼如下(爲了儘量不讓gc對實驗結論影響,特意將jvm設置成了16G):
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class CollectionsTest {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>() {{add(0); add(-1);}};
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(2, 4, -9));
list1.addAll(list2);
System.out.println(list1);
list2.set(0, 100000);
System.out.println(list1);//深複製
System.out.println();
//功能性展示
Collections.addAll(list2, 34, 67, 78);
System.out.println(list2);
list2.addAll(Arrays.asList(34, 67, 78));
System.out.println(list2);
System.out.println();
//性能展示
System.out.println("添加元素---------------------------\n");
for(int size = 1000; size < 100000000; size *= 10) {
long time = System.nanoTime();
List<Integer> list3 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
list3.addAll(Arrays.asList(1, 45, 34, 456, 1212, -6, 43, 55));
}
System.out.println("ArrayList.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time));
time = System.nanoTime();
List<Integer> list4 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
Collections.addAll(list4, 1, 45, 34, 456, 1212, -6, 43, 55);
}
System.out.println("Collections.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time) + "\n");
}
System.gc();
System.out.println("添加數組---------------------------\n");
Integer[] arr = {1, 45, 34, 456, 1212, -6, 43, 55};
for(int size = 1000; size < 100000000; size *= 10) {
long time = System.nanoTime();
List<Integer> list3 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
list3.addAll(Arrays.asList(arr));
}
System.out.println("ArrayList.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time));
time = System.nanoTime();
List<Integer> list4 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
Collections.addAll(list4, arr);
}
System.out.println("Collections.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time) + "\n");
}
System.gc();
System.out.println("添加列表---------------------------\n");
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 45, 34, 456, 1212, -6, 43, 55));
for(int size = 1000; size < 100000000; size *= 10) {
long time = System.nanoTime();
List<Integer> list3 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
list3.addAll(list);
}
System.out.println("ArrayList.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time));
time = System.nanoTime();
List<Integer> list4 = new ArrayList<Integer>();
for(int i = 0; i < size; i++) {
Collections.addAll(list4, list.toArray(new Integer[0]));
}
System.out.println("Collections.addAll()@size = " + size + "\ntime:" + (System.nanoTime() - time) + "\n");
}
}
}
運行截圖展示:
HashMap和HashSet的類似用法
示例代碼:
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
public class CollectionsTest {
public static void main(String[] args) {
HashSet<Integer> set1 = new HashSet<Integer>();
HashSet<Integer> set2 = new HashSet<Integer>() {{add(5);}};
Collections.addAll(set1, 2, 4, 6, 7);
System.out.println(set1);
set1.addAll(set2);
System.out.println(set1);
HashMap<Integer, Integer> map1 = new HashMap<Integer, Integer>(){{put(1, 5);}};
HashMap<Integer, Integer> map2 = new HashMap<Integer, Integer>(){{put(3, 4);}};
map1.putAll(map2);
System.out.println(map1);
}
}
運行截圖: