Java Collections.addAll() 与 ArrayList.addAll() 的区别

我们在编码时经常需要将一些元素添加到一个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);
	}
}
运行截图:



  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值