【转】带你正确的使用List的retainAll方法求交集
一、 retainAll 方法
public boolean retainAll(Collection<?> c) { //调用自己的私有方法 return batchRemove(c, true); }
二、batchRemove 方法解析
如果此 collection 由于调用而发生更改,则返回 true
//集合A比较与集合B的交集 private boolean batchRemove(Collection<?> c, boolean complement) { //获得当前对象的所有元素 final Object[] elementData = this.elementData; //w:标记两个集合公共元素的个数 int r = 0, w = 0; //设置标志位 boolean modified = false; try { //遍历集合A for (; r < size; r++) //判断集合B中是否包含集合A中的当前元素 if (c.contains(elementData[r]) == complement) //如果包含则直接保存。 elementData[w++] = elementData[r]; } finally { // 如果 c.contains() 抛出异常 if (r != size) { //复制剩余的元素 System.arraycopy(elementData, r, elementData, w, size - r); //w为当前集合A的length w += size - r; } //如果集合A的大小放生改变 if (w != size) { // 清除工作 for (int i = w; i < size; i++) elementData[i] = null; //记录集合中元素的改变(add/remove) modCount += size - w; //设置当前数组的大小 size = w; //返回为true modified = true; } } return modified; }
1、关于modCount变量的说明
AbstractList包含一个modCount变量,它的初始值是0,当集合中的内容每被修改一次时(调用add(), remove()等方法),modCount加1
2、关于返回值的说明
如果集合A数组的大小没有改变,则返回false。如果集合A和集合B是完全相同的集合,也会返回false。
public static void main(String[] args) { ArrayList<String> listA= new ArrayList<String>(); listA.add("Tom"); ArrayList<String> listB= new ArrayList<String>(); listB.add("Tom"); System.out.println(listA.retainAll(listB)); //false }
即使两个集合没有交集,也会返回true。
public static void main(String[] args) { ArrayList<String> listA= new ArrayList<String>(); listA.add("Tom"); ArrayList<String> listB= new ArrayList<String>(); listB.add("Jack"); System.out.println(listA.retainAll(listB));//true }
所以,我们要记住:当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False。
三、正确的使用 retainAll 方法
public static void main(String[] args) { ArrayList<String> listA= new ArrayList<String>(); listA.add("Tom"); ArrayList<String> listB= new ArrayList<String>(); listB.add("Tom"); listA.retainAll(listB); if(listA.size()>0){ System.out.println("这两个集合有相同的交集"); }else{ System.out.println("这两个集合没有相同的交集"); } }
1、首先调用retainAll的方法
2、通过判断集合的大小,来确定是否存在交集。不能通过方法返回的True和False来判断。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理