1、测试代码
@Test public void test() { int n = 20; List<String> listA = new ArrayList<>(); for (int i = 0; i < n; i++) { listA.add("A" + i); } List<String> listB = new ArrayList<>(); for (int i = 0; i < n; i++) { listB.add("B" + i); if (i % 10 == 0) { listB.add("A" + i); } } long t1 = System.currentTimeMillis(); //循环遍历listB,如果listB中的元素也在listA中,则做某些操作(此处省略) for (String b : listB) { if (listA.contains(b)) { //System.out.println("listB包含listA中的" + b); } } long t2 = System.currentTimeMillis(); System.out.println("t2-t1=" + (t2 - t1)); long t3 = System.currentTimeMillis(); Map<String, String> mapA = listA.stream() .collect(Collectors.toMap(x -> x, x -> x,(k1,k2)->k1)); //循环遍历listB,如果listB中的元素也在listA中,则做某些操作(此处省略) for (String b : listB) { if (StringUtils.isNotBlank(mapA.get(b))) { //System.out.println("listB包含listA中的" + b); } } long t4 = System.currentTimeMillis(); System.out.println("t4-t3=" + (t4 - t3)); }
2、测试结果
int n = 20;
t2-t1=0
t4-t3=50
int n = 100;
t2-t1=1
t4-t3=54
int n = 200;
t2-t1=2
t4-t3=51
int n = 1000;
t2-t1=16
t4-t3=33
int n = 2000;
t2-t1=14
t4-t3=40
int n = 10000;
t2-t1=255
t4-t3=41
int n = 20000;
t2-t1=1051
t4-t3=35
3、结论
随着输入规模n的增大,list+list.contains()的遍历模式耗时线性增加,而list+map.get()模式耗时相对稳定,故当list的长度在几千以上时,转换成map.get()的方式去遍历是比list.contains()的方式快得多的。