背景:最近项目中遇到一个需求,需要比较两个大集合中的数据是否一致。(一般情况下是相等的,但是得用代码分析出来)
分析:对于这样的问题,第一个想法是,相比较两个集合大小,进而循环比较集合中每个元素。第二个思路是,看看List源码,是否可以从其API中,利用现有的方法组合,达到同样的效果。
基于第一个想法,这边直接上代码,并列出耗时时间。
public static void main(String[] args) { List<String> listA = new ArrayList<>(); List<String> listB = new ArrayList<>(); for (int i = 0; i < 50000000; i++) { listA.add("A"); listB.add("A"); } long startTime = System.currentTimeMillis(); if(listA.size()==listB.size()){ for (int i = 0; i < listA.size(); i++) { if(listA.get(i).equals(listB.get(i))){ continue; } } long endTime = System.currentTimeMillis(); System.out.println("比较时间"+(endTime-startTime)); } }
测试6次,时间分别是:55,54,56,59,55,57。
上述代码中如果(i < 90000000),时间分别是:92,91,91,93,91,92。
基于第二种思路,打算采用containsAll方法:listA.containsAll(listB)&& listB.containsAll(listA)
public static void main(String[] args) { List<String> listA = new ArrayList<>(); List<String> listB = new ArrayList<>(); for (int i = 0; i < 50000000; i++) { listA.add("A"); listB.add("A"); } long startTime = System.currentTimeMillis(); if (listA.containsAll(listB) && listB.containsAll(listA)) { long endTime = System.currentTimeMillis(); System.out.println("比较时间" + (endTime - startTime)); } }
测试6次,时间分别是:119,128,120,120,130,119。
上述代码中如果(i < 90000000),时间分别是:206,213,204,203,205,203。
综上:由于样本较少,测试的次数不过多。但是基本可以推断此两种方法的优缺点:
第一种for循环效率较高,代码量较多。
第二种效率较低,更易于理解,代码量较少。