java 高效对比两个list或者list泛型

595 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。

bbs.csdn.net/topics/3901…

前段时间有个数据对比的操作,原来编写的时候写的比较随意,后面测试数据量大之后性能问题凸显,百度性能对比的方法,看到上面链接里的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;
 
    }