「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。
前段时间有个数据对比的操作,原来编写的时候写的比较随意,后面测试数据量大之后性能问题凸显,百度性能对比的方法,看到上面链接里的c的对比方法。
参照这个c的写法,java也可以极大的缩减时间,原帖能比元素对比快十分钟。我这边没这么大数据量,但是确实有效。下面放两个方法,一个hashset,一个hashmap。经过验证,这个方法不但可以对比基础数据类型,class也可以对比,非常好用
\
public static void main(String[] args) {
List<String> strings1 = new ArrayList<String>();
List<String> strings2 = new ArrayList<String>();
List<String> jdks = asList("JDK6", "JDK8", "JDK10");
List<String> jdks2 = asList("JDK5","JDK6", "JDK8", "JDK10");
strings1.add("a");
strings1.add("b");
strings1.add("c");
strings1.add("d");
strings2.add("a");
strings2.add("b");
strings2.add("c");
HashSet<String> h1 = new HashSet<String>(strings1);
HashSet<String> h2 = new HashSet<String>(strings2);
List<String> list = new ArrayList<String>();
for (String h : h1) {
if (!h2.contains(h)) {
list.add(h);
}
}
System.out.println(list);
}
// 这个方法也能直接对比class,如果有字段参数不一致也能被contains识别
public static void main(String[] args) {
String s = “json字符串”
String s2 = “json字符串”
List<Device> fileHelps = JSONObject.parseArray(s2, Device.class);
QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
List<Device> devices3 = deviceDao.selectList(deviceQueryWrapper);
String s1 = JSONObject.toJSONString(devices3);
HashSet<Device> devices1 = new HashSet<>(fileHelps);
HashSet<Device> devices2 = new HashSet<>(devices3);
ArrayList<Device> difference = new ArrayList<>();
for (Device device : devices1) {
//如果数据库里没有包含
if (!devices2.contains(device)) {
difference.add(device);
}
}
}
\
\
private static List<String> getDiffrent4(List<String> list1, List<String> list2) {
List<String> diff = new ArrayList<String>();
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
List<String> maxList = list1;
List<String> minList = list2;
if (list2.size() > list1.size()) {
maxList = list2;
minList = list1;
}
for (String string : maxList) {
map.put(string, 1);
}
for (String string : minList) {
Integer count = map.get(string);
if (count != null) {
map.put(string, ++count);
continue;
}
map.put(string, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
System.out.println("方法4 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff;
}