描述

我们知道使用List的retainAll方法可以获取两个集合的交集,但是在某些情况下方法的返回值并非我们想象那样。

现象

先看两个例子:

   public static void main(String[] args) {List<String> a = new ArrayList<>();a.add("READ");a.add("DELETE");a.add("TTT");List<String> b = new ArrayList<>();b.add("READ");b.add("WRITE");System.out.println(b.retainAll(a));System.out.println(b);}

代码运行结果如下:

这个运行结果是我们想要的结果:方法返回true,b集合中剩下交集的元素。

再看个情况

    public static void main(String[] args) {List<String> a = new ArrayList<>();a.add("READ");a.add("DELETE");a.add("TTT");List<String> b = new ArrayList<>();b.add("READ");System.out.println(b.retainAll(a));System.out.println(b);}

运行结果如下:

两个集合有交集"READ",但是运行结果返回的是false

发现这个结果并不是我们想要的true。

我们来查询下源码:注释中写到只有当这个list发生change的时候,才会return true。

    /*** Retains only the elements in this list that are contained in the* specified collection.  In other words, removes from this list all* of its elements that are not contained in the specified collection.** @param c collection containing elements to be retained in this list* @return {@code true} if this list changed as a result of the call* @throws ClassCastException if the class of an element of this list*         is incompatible with the specified collection* (<a href="Collection.html#optional-restrictions">optional</a>)* @throws NullPointerException if this list contains a null element and the*         specified collection does not permit null elements* (<a href="Collection.html#optional-restrictions">optional</a>),*         or if the specified collection is null* @see Collection#contains(Object)*/public boolean retainAll(Collection<?> c) {return batchRemove(c, true, 0, size);}boolean batchRemove(Collection<?> c, boolean complement,final int from, final int end) {Objects.requireNonNull(c);final Object[] es = elementData;int r;// Optimize for initial run of survivorsfor (r = from;; r++) {if (r == end)return false;if (c.contains(es[r]) != complement)break;}int w = r++;try {for (Object e; r < end; r++)if (c.contains(e = es[r]) == complement)es[w++] = e;} catch (Throwable ex) {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.System.arraycopy(es, r, es, w, end - r);w += end - r;throw ex;} finally {modCount += end - w;shiftTailOverGap(es, w, end);}return true;}

下面我们来debug测试下

当我们debug到batchRemove的第一个for循环的时候,发现在第二次循环的时候就直接return了false。

而只有当c中有不包含es的元素的时候,代码才会继续往下走,只要不抛异常就会返回true,从而我们知道方法的返回值对我们取两个集合的交集并没有太大作用。

结论

方法的返回值仅供参考该list是否发生过元素的remove,而不应该作为两个集合是否有交集的依据。可以通过判断b  list中元素个数是否大于1来判断是否有交集。

Java List retainAll 记录坑相关推荐

  1. Java中MessageFormat的坑

    文章目录 Java中MessageFormat的坑 问题现象 问题排查 如何解决 Java中MessageFormat的坑 问题现象 某个业务功能需要通过SSH协议执行命令查询一些数据,而某次查询居然 ...

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

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

  3. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  4. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  5. 一起初学java,笔记记录的第五天:数组、排序和查找

    一起初学java,笔记记录的第五天:数组.排序和查找 适用于初学java者 这个首先指出本文中图片和资源来自**韩顺平**老师,感谢老师做的无私奉献的教学! 1. 数组介绍 数组可以存放多个同一类型的 ...

  6. java计算机毕业设计三坑购物平台演示录像2020源代码+数据库+系统+lw文档

    java计算机毕业设计三坑购物平台演示录像2020源代码+数据库+系统+lw文档 java计算机毕业设计三坑购物平台演示录像2020源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 ...

  7. java正则校验的坑正则校验公式正确性

    1,首先讲一下java中正则表达式的坑 举例: 欲校验公式(+x+1)合法性,正则表达式\([+\-*/]+,使用菜鸟在线正则校验就可以匹配,而使用java的String.matches方式竟然匹配不 ...

  8. NWJS 调用java问题处理记录

    NWJS 调用java问题处理记录 有关NWJS调用JAVA安装与发布运行时的问题: 1:确认nwjs使用的版本(x86或x86-64)与本机使用的node版本一致. 2:提示Error: Canno ...

  9. 2019个人Java实习生面试记录

    2019个人Java实习生面试记录 第一次: 1.sql排序语句 2.对框架的理解 3.说一下对Spring的理解 4.说一下对mvc的理解 第二次 5.&与&&的区别 6.S ...

  10. java同事不写泛型_跳了一次JAVA泛型擦除的坑

    记录一下今天在帮同事解决使用spring参数注入问题的时候由于对泛型的理解不到位而遇到的坑. 如下代码所示: @RequestMapping(value="saveAll") pu ...

最新文章

  1. 有哪些堪称神器的实用网站?这8个可以解你燃眉之急!
  2. 生命银行怎么样_银行双职工的家庭现状...
  3. php 汉字处理 json,php处理json时中文问题的解决方法
  4. js入门系列演示·数组
  5. 首页显示登陆用户名php,首页登录后怎么在首页显示用户名以及隐藏登录框?
  6. single java_java single Pattern 单例模式
  7. 网际风全推数据接口_智能风控系统设计与实践
  8. java vo对象转bo对象_java的几种对象(PO,VO,DAO,BO,POJO)解释(转)
  9. 25 岁的老 Delphi,还值得程序员入手吗?
  10. 带你十分钟了解BFC(渡一教育笔记)
  11. yii2 联表查询时,查询关联表的字段时,使用asArray方法
  12. 中国2017 Google 开发者大会第二天简单回顾
  13. 王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
  14. Android 反编译修改源码
  15. 《透视盒马:新零售操作系统的秘密》
  16. 获取微信公众号关注总人数和用户列表
  17. Spring Security登录用户数据获取(4)
  18. 传奇列表上传登录器公告小窗口怎么修改
  19. 移动端js判断iPhone浏览器还是Android浏览器
  20. 基础知识------我所知道的、应该知道的

热门文章

  1. 用计算机分析卫星云图 进行实时天气,卫星云图,气象卫星云图,卫星云图高清实时滚动播放 - 围观天气...
  2. 单片机蜂鸣器源代码+仿真
  3. html在网页中图片打不开,网页图片不显示,教您网页图片不显示如何解决
  4. 科技文献检索与计算机应用试卷,科技文献检索试卷
  5. win10家庭版升级到企业版的教程
  6. Origin 2017去除水印的方法
  7. 【WEB程序设计】web程序设计的一些基本知识
  8. Matlab中freqz函数使用
  9. 无需服务端的多平台同步利器(btsync)
  10. wifi修复记录(8个方法)