Java List retainAll踩坑记录
在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踩坑记录相关推荐
- 第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密 java.lang.ClassNotFoundException 踩坑解决问题详细内幕版本
第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密 /* * *王家林老师授课http://weibo.com/ilovepains */ 每天晚上20: ...
- 使用Java读取 “Python写入redis” 的数据踩坑记录
https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...
- sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...
本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...
- mvn exec: java_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(下)
本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 六.注意事项汇总 修改 JAVA_OPTS 参数时,如果位置不对,可能造成代理无法启动. java - ...
- 微信退款 java工具类,微信支付中退款踩坑记录
首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...
- Java 线上惨痛踩坑记录,你也一定遇到过
线上问题年年有,今年特别多.记几次线上惨痛的踩坑记录,希望大家以史为鉴. 1. 包装类型自动解箱导致空指针异常 public int getId() { Integer id = null; retu ...
- Java线上惨痛踩坑记录,你也一定遇到过
线上问题年年有,今年特别多.记几次线上惨痛的踩坑记录,希望大家以史为鉴. 1. 包装类型自动解箱导致空指针异常 public int getId() {Integer id = null;return ...
- TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)
本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...
- SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题
SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...
- 转:android.support升级到androidx踩坑记录
原文链接:android.support升级到androidx踩坑记录 - 简书 年前想着Google老大之前提醒过将项目升级到androidx,所以年前一通操作猛如虎把Android Studio唰 ...
最新文章
- 贪吃蛇程序 php,php,函数 Web程序 - 贪吃蛇学院-专业IT技术平台
- atom编辑器的安装
- 「Excel技巧」Excel中根据某列的值去汇总另外一列的值
- 系列TCP/IP协议-广播与多播(010)
- WinCE开机默认语言设置 .
- wxWidgets:wxFrame类用法
- sysAK(青囊)系统运维工具集:如何实现高效自动化运维?| 龙蜥技术
- iview兼容ie8_如何解决iview在安卓4.4.4的webview中的兼容性
- 从AI打王者荣耀到自动驾驶,高通一口气公布了5G+AI未来的无数种可能
- Android核心模块内容概述
- csharp:SQLite and Access using C# code read data
- flutter 判断是不是调试模式_当永恒的软键盘问题遇到Flutter
- Java实现面向对象编程
- 计算机打字练习程序,指法练习打字软件
- SSH和SSM有什么区别?
- 基于嵌入式Linux的语音识别系统硬软件设计
- 如何讲好一个故事 - by锤子手机活动策划负责人草威
- CHERRY樱桃机械键盘按键
- mysql下载速度慢怎么办
- 群晖Docker容器“failed to initialize logging driver“解决办法
热门文章
- 下行文格式图片_正确的公文格式图片.doc
- Redis三大特殊类型介绍:GEO,hyperloglog,bitmap,Redis事务
- python编程游戏-Python游戏趣味编程
- ectouch后台添加菜单
- iphone抓包调试神器—Stream安装和使用
- vld/rdy协议 断言
- 18650锂电池保护板接线图_锂电池保护板的过流保护测试方案
- PyQt4--下拉列表QComboBox
- hustoj 配置java_HUSTOJ增加其他语言出现RuntimeError解决办法
- 交叉路口红绿灯控制程序linux,西门子PLC编程实例详解|十字路口交通灯自动控制系统...