首先我们有两个集合A,B,我们以其中一个集合A为基准

想获得B集合中的元素,相对于A集合来说,哪些元素不存在,哪些元素A没有

业务场景:以db1中的数据为准,更新db2中的数据,db1有的,db2没有的进行添加操作,db2有的,db1没有的进行删除操作

那么我们就需要知道,哪些元素是要添加的,哪些是要删除的

传统做法:通过标记实现

  private static Map<String, List<String>> getContrast(List<String> newTypeList, List<String> oldTypeList){
    Map<String,Integer> map = new HashMap<>();
    Map<String,List<String>> resultMap = new HashMap<>();
    //被删除的集合
    List<String> deleteList = new ArrayList<>();
    //添加的集合
    List<String> addList = new ArrayList<>();
    //遍历标记新的集合元素为1
    for (String nItem : newTypeList) {
      map.put(nItem,1);
    //遍历标记相同的集合元素为2
    for (String oItem : oldTypeList) {
      Integer tag = map.get(oItem);
      if (tag != null) {
        map.put(oItem,2);
        continue;
      //标记 旧集合元素为3
      map.put(oItem,3);
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
      if (entry.getValue().equals(1)) {
        addList.add(entry.getKey());
        resultMap.put("addList",addList);
      if (entry.getValue().equals(3)) {
        deleteList.add(entry.getKey());
        resultMap.put("delList",deleteList);
    return resultMap;
public static void main(String[] args) {
    List<String> newList = new ArrayList<>();
    newList.add("apple");
    newList.add("banana");
    newList.add("pina");
    List<String> oldList = new ArrayList<>();
    oldList.add("apple");
    oldList.add("mikl");
    Map<String, List<String>> contrast = getContrast(newList, oldList);
    for (Map.Entry<String, List<String>> stringListEntry : contrast.entrySet()) {
      System.out.println(stringListEntry.getKey() + "-" + stringListEntry.getValue());

测试结果:我们可以看到相对新的集合来说,老的集合没有“banana”和“pina”,而老的集合有的“milk”新的集合则没有,结果正确

JAVA8做法:通过流实现

public static void main(String[]args){
    List<String> list1 = new ArrayList<String>();
    list1.add("apple");
    list1.add("banana");
    list1.add("pina");
    List<String> list2 = new ArrayList<String>();
    list2.add("apple");
    list2.add("mikl");
    List<String> collect1 = list1.stream().filter(num -> list2.contains(num))
            .collect(Collectors.toList());
    System.out.println("交集: " + collect1);
//    collect1.stream().forEach(System.out::println);
    //差集 list1-list2
    List<String> collect2 = list1.stream().filter(num -> !list2.contains(num))
            .collect(Collectors.toList());
    System.out.println("addList 即差集list1-list2: " + collect2);
//    collect2.stream().forEach(System.out::println);
    //差集list2-list1
    List<String> collect3 = list2.stream().filter(num -> !list1.contains(num))
            .collect(Collectors.toList());
    System.out.println("delList 即差集list2-list1: " + collect3);
//    collect3.stream().forEach(System.out::println);
    //并集  不去重
    list1.addAll(list2);
    System.out.println("并集 不去重: " + list1);
//    list1.stream().forEach(System.out::println);
    //并集  去重
    List<String> collect4 = list1.stream().distinct().collect(Collectors.toList());
    System.out.println("并集 去重: " + collect4);
//    collect4.stream().forEach(System.out::println);

效果是一样的,但是代码量少了很多

Java 查找两个集合的相同元素和不同元素 假设有这个集合, List<Category> metaCategs , 只要categId 在下面数组,就从metaCategs移除 Integer[] removeCategIds =ne... 如上图所示,Stream的操作可以分为两大类:间操作与结束操作。 间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。间操作又可以分为无状态(Stateless)操作与... 在Java编程,如何比较集合元素?以下示例通过使用Collection类的Collection.min()和Collection.max()方法将字符串转换为树形集合比较集合元素。package com.yiibai;import java.util.Collections;import java.util.Set;import java.util.TreeSet;public cla... 优点:时间复杂度为O(n)级别;缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多。理论分析:两个集合元素之和以及之积相同则,这两个集合相等。(前提是两个集合的数量一致)证明: 先证明集合只有两个元素的情况A={a,b} B={x,y}a+b=x+y,a*b=x*y 联立之后可以得出2组解a=x,b=y;a=y,b=x;说明2个集合相等。更多的元素集合。我们只需要假设k元素的... 间操作:间操作都是filter()、distinct()、sorted()、map()、flatMap()等,其一般是对数据集的整理(过滤、排序、匹配、抽取等),将一个stream转换成另一个stream。 终止方法:往往是完成对数据集数据的处理,如forEach(),还有allMatch()、anyMatch()、findAny()、 findFirst(),数值计算类的方法有sum、m... 今天开发一个需求时,要对A和B两个List集合遍历,并比较集合A有,而集合B没有的值。 比如说List集合A有’one’,‘two’,‘three’三个值,List集合B有’one’,‘three’两个值。 那么最终打印’two’。 下面我就用stream流来做个例子。 例子集合A的泛型为HashMap,集合B的泛型为String。 Stream流,forEach()方法用于对一个流进行结尾动作,同时对最终过滤后的元素结果进行一个遍历操作。 我们可以在forEach()直接写入类和其对应方法名,来 if (levelNames.size() > 1) { for (int i = 0; i < levelNames.size(); i++) { for (int j = levelNames.size() - 1; j > i; j--) { List<List<Long>> lists = new ArrayList<>(); List<Long> o1 = (. 如题:有List list1和List list2,两个集合各有上万个元素,怎样取出两个集合不同的元素?方法1:遍历两个集合:packagecom.czp.test;importjava.util.ArrayList;importjava.util.List;public classTestList {public static voidmain(String[] args) {List lis...