本文共 3704 字,大约阅读时间需要 12 分钟。
我们在编码时经常需要将一些元素添加到一个List中,此时我们一般有两种选择:Collections.addAll()或者是ArrayList.addAll()。
1. 在需添加元素比较少的情况下,并在List的size在万级以上时,一般建议Collections.addAll(),但当List的size较小时,两种方法没有什么区别,甚至ArrayList.addAll()更好。
2. 当我们将一个数组添加到一个List中时,Collections.addAll()和ArrayList.addAll()没有什么性能差异,但当我们将一个List添加到一个List中时,建议使用ArrayList.addAll()。
3. 添加数组和列表,要比添加元素快。
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);
- }
- }
运行截图: