简书新手,第一次写博客,一是为了巩固一下,加深印象,二是留作一个底稿,方便以后查看。还有呢,就是希望在这里能得到大神得指点,以免误人子弟。
如有不足,敬请谅解,欢迎指正,谢谢!
一、背景
昨天写项目时遇到一个需求,要求第一次把服务端请求回来的List保存到本地,下次进来,需要判断服务端请求下来的List与本地保存的List是否相同,如果相同,则使用本地保存的;如果不同,则把服务端请求下来的List覆盖本地原先保存的。
so,我简单列了一下提纲:
1、先判断本地中是否有保存的, 没有则把请求回来的保存的到本地中;
2、有则判断请求回来的与本地中List个数是否相等 若不相等,则把请求回来的覆盖原先在本地中保存的;
3、若相等,遍历请求下来List与本地中保存的List各个元素是否一致 若不一致,则把请求回来的覆盖原先在本地中保存的;
4、若一致,则不做操作,直接使用原先保存的
然而,这样遍历如果数据量小还好,如果数据量大的话就得考虑一下性能了。
二、实战(比较两个Java list是否相同的性能优化)
1、最粗暴的方法 (遍历两个List)
package com.example;
import java.util.ArrayList;
public class CheckDiffList {
public static void main(String[] args) {
List list1 = new ArrayList();
List list2 = new ArrayList();
for (int i = 0; i < 10000; i++) {
list1.add("test" + i);
list2.add("test" + i * 2);
}
System.out.println(getDiffrent(list1, list2));
// 判断两个List内的元素是否相同
// getDiffrent total times 2514359
// false
}
/**
* 判断两个List内的元素是否相同
*
* @param list1
* @param list2
* @return
*/
private static boolean getDiffrent(List list1, List list2) {
long st = System.nanoTime();
if (list1.size() != list2.size()) {
System.out.println("getDiffrent total times " + (System.nanoTime() - st));
return false;
}
for (String str : list1) {
if (!list2.contains(str)) {
System.out.println("getDiffrent total times " + (System.nanoTime() - st));
return false;
}
}
System.out.println("getDiffrent total times " + (System.nanoTime() - st));
return true;
}
}
这种方法也就是我最初想到的,总共要循环的次数是两个List的size的乘积,从输出看耗时也是比较长的。
2、利用Java中为List提供的方法retainAll()
package com.example;
import java.util.ArrayList;
import java.util.List;
public class CheckDiffList {
public static void main(String[] args) {
List list1 = new ArrayList();
List list2 = new ArrayList();
for (int i = 0; i < 10000; i++) {
list1.add("test" + i);
list2.add("test" + i * 2);
}
System.out.println(getDiffrent2(list1, list2));
// 判断两个List内的元素是否相同
// getDiffrent2 total times 7563
// false
}
/**
* 判断两个List内的元素是否相同
*
* 此方法有bug 见Food.class
*
* @param list1