在Java中两个集合的交集可以使用 List.retainAll(Collection<?> c) 方法,其返回值为 boolean 类型,官方说明是:

/*** Retains only the elements in this list that are contained in the* specified collection (optional operation).  In other words, removes* from this list all of its elements that are not contained in the* specified collection.* */

我们不假思索的使用这个返回值进行判断集合A和集合B是否有交集。
但是注意当两个集合中的元素相同或者集合没有变化时,返回结果可能会大跌眼镜:

List<String> list1= new ArrayList<>();
List<String> list2= new ArrayList<>();
list1.add("haha");
list1.add("heihei");list2.add("haha");
list2.add("heihei");
boolean isRetain= list1.retainAll(list2);
System.out.println(isRetain);
System.out.println(list1);

讲道理应该输出 true,实际输出是:

I/System.out: false
I/System.out: [haha, heihei]

翻阅源码(当前使用的是JDK1.8)

public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, true);
}
private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for (; r < size; r++)//循环判断list2中是否包括list1中的元素,将相等的元素放到list1的数组中//其中w就是相等元素的个数,elementData中0至w都是相等的元素if (c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {if (r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}//只有相等元素的数量和源集合的数量不一致才能进到这个if中,modified 才会为trueif (w != size) {for (int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;
}

发现javadoc说明是:

* @return <tt>true</tt> if this list changed as a result of the call


当两个集合中的元素相同时,使用retainAll返回的结果是false
因此不能用返回值来判断两个集合中是否有交集,作交集运算后,可以使用集合的长度是否 >0来进行判断交集是否有。

另外,需要注意的是,如果比较的是对象集合的交集,还需要针对该对象处理equals方法和hashCode方法

Java List retainAll踩坑记录相关推荐

  1. 第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密 java.lang.ClassNotFoundException 踩坑解决问题详细内幕版本

    第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密    /* * *王家林老师授课http://weibo.com/ilovepains */  每天晚上20: ...

  2. 使用Java读取 “Python写入redis” 的数据踩坑记录

    https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...

  3. sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...

    本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...

  4. mvn exec: java_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(下)

    本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 六.注意事项汇总 修改 JAVA_OPTS 参数时,如果位置不对,可能造成代理无法启动. java - ...

  5. 微信退款 java工具类,微信支付中退款踩坑记录

    首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...

  6. Java 线上惨痛踩坑记录,你也一定遇到过

    线上问题年年有,今年特别多.记几次线上惨痛的踩坑记录,希望大家以史为鉴. 1. 包装类型自动解箱导致空指针异常 public int getId() { Integer id = null; retu ...

  7. Java线上惨痛踩坑记录,你也一定遇到过

    线上问题年年有,今年特别多.记几次线上惨痛的踩坑记录,希望大家以史为鉴. 1. 包装类型自动解箱导致空指针异常 public int getId() {Integer id = null;return ...

  8. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  9. SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

    SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...

  10. 转:android.support升级到androidx踩坑记录

    原文链接:android.support升级到androidx踩坑记录 - 简书 年前想着Google老大之前提醒过将项目升级到androidx,所以年前一通操作猛如虎把Android Studio唰 ...

最新文章

  1. 贪吃蛇程序 php,php,函数 Web程序 - 贪吃蛇学院-专业IT技术平台
  2. atom编辑器的安装
  3. 「Excel技巧」Excel中根据某列的值去汇总另外一列的值
  4. 系列TCP/IP协议-广播与多播(010)
  5. WinCE开机默认语言设置 .
  6. wxWidgets:wxFrame类用法
  7. sysAK(青囊)系统运维工具集:如何实现高效自动化运维?| 龙蜥技术
  8. iview兼容ie8_如何解决iview在安卓4.4.4的webview中的兼容性
  9. 从AI打王者荣耀到自动驾驶,高通一口气公布了5G+AI未来的无数种可能
  10. Android核心模块内容概述
  11. csharp:SQLite and Access using C# code read data
  12. flutter 判断是不是调试模式_当永恒的软键盘问题遇到Flutter
  13. Java实现面向对象编程
  14. 计算机打字练习程序,指法练习打字软件
  15. SSH和SSM有什么区别?
  16. 基于嵌入式Linux的语音识别系统硬软件设计
  17. 如何讲好一个故事 - by锤子手机活动策划负责人草威
  18. CHERRY樱桃机械键盘按键
  19. mysql下载速度慢怎么办
  20. 群晖Docker容器“failed to initialize logging driver“解决办法

热门文章

  1. 下行文格式图片_正确的公文格式图片.doc
  2. Redis三大特殊类型介绍:GEO,hyperloglog,bitmap,Redis事务
  3. python编程游戏-Python游戏趣味编程
  4. ectouch后台添加菜单
  5. iphone抓包调试神器—Stream安装和使用
  6. vld/rdy协议 断言
  7. 18650锂电池保护板接线图_锂电池保护板的过流保护测试方案
  8. PyQt4--下拉列表QComboBox
  9. hustoj 配置java_HUSTOJ增加其他语言出现RuntimeError解决办法
  10. 交叉路口红绿灯控制程序linux,西门子PLC编程实例详解|十字路口交通灯自动控制系统...