retainAll方法简介

当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集。retainAll是Collection接口中提供的一个方法,各个实现类有自己的实现方式,我们这里介绍ArrayList的实现方式。

retainAll源码深入

可以看到collection接口中的retainAll方法,需要传入一个集合。

boolean retainAll(Collection<?> c);

进入arrayList的方法实现。可以看到如下代码:

    public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, true);}

由以上代码可知,传入的集合不能为null。接下来看看batchRemove方法。

    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++)if (c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if (r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}if (w != size) {// clear to let GC do its workfor (int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}

我们看到上述方法的流程如下:
首先获得当前对象的所有元素,然后通过r和w变量标记两个集合公共元素的个数。初始化标志位为false。然后进入循环遍历当前集合,如果传入的集合中包含当前集合的元素,就直接将这个元素保存下来。最后到finally块中,如果r不等于size,证明在循环的过程中出现了异常,然后将剩余的元素进行复制,重新计算数组的剩余元素值。如果剩余的元素值不等于size,则将多余的位置进行清空。更改modcount的值。这个modcount是父类abstarctlist的值,初始值为0,集合中的内容没修改一次则增加1。最后重新设置size的大小。返回是否修改值。

retainAll返回值的说明

这里有两个说明。
第一个:如果集合A数组的大小没有改变,则返回false。如果集合A和集合B是完全相同的集合,也会返回false。

public static void main(String[] args) {ArrayList<String> list1= new ArrayList<String>();list1.add("123");ArrayList<String> list2= new ArrayList<String>();list2.add("123");System.out.println(list1.retainAll(list2)); }

如上代码会返回false。
第二个:两个集合没有交集,会返回true。

public static void main(String[] args) {ArrayList<String> list1= new ArrayList<String>();list1.add("123");ArrayList<String> list2= new ArrayList<String>();list2.add("12345");System.out.println(list1.retainAll(list2));}

如上代码会返回true。
总结:当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False。

retainAll的判断方法

public static void main(String[] args) {ArrayList<String> list1= new ArrayList<String>();list1.add("123");ArrayList<String> list2= new ArrayList<String>();list2.add("123");list1.retainAll(list2);if(list1.size()>0){System.out.println("有交集");}else{System.out.println("没有交集");}}

通过判断集合的大小,来确定是否存在交集。不能通过方法返回的True和False来判断。

retainAll的实际效果使用

我们声明两个集合,通过调用retainAll,保留两个集合的交集。最后再看输出的效果。

    public static void main(String[] args) {Collection collection1 = new ArrayList();collection1.add("a");collection1.add("b");collection1.add("c");Collection collection2 = new ArrayList();collection2.add("ab");collection2.add("abc");collection2.add('a');System.out.println(collection1);boolean flag = collection1.retainAll(collection2);System.out.println(flag);System.out.println(collection1);}

执行结果如下:

[a, b, c]
true
[a]

保留了两个结合的交集。

总结

list的retainAll方法的介绍和分析到此结束,文中难免有不足之处,望大家指正交流。

瞬间教你学会使用java中list的retainAll方法相关推荐

  1. java中retain_瞬间教你学会使用java中list的retainAll方式

    retainAll方式简介 当我们有两个list聚集的时刻,我们可以使用retainAll方式求得两个list聚集的子集.retainAll是Collection接口中提供的一个方式,各个实现类有自己 ...

  2. 瞬间学会使用java中list的retainAll方法

    boolean retainAll(Collection<?> c); 进入arrayList的方法实现.可以看到如下代码: public boolean retainAll(Collec ...

  3. java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库

    本文主要向大家介绍了Oracle数据库之一分钟教你学会用java连接Oracle数据库,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. package java_jdbc; // ...

  4. 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...

    [多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...

  5. 电脑录屏工具_一分钟教你学会两种电脑录屏的方法,以后别再说不知道了

    相信大家用电脑都会截图,但有时候需要用到录屏,这就难倒了很多人.那么如何在电脑是录屏呢?下面就来教你学会两种电脑录屏的方法,以后别再说不知道了. 阅读引导: •阅读完本文预计需要2分钟时间. •本文是 ...

  6. java中读取文件的方法

    总结一下java中读取文件的方法: 方法一(逐行的读取文件内容): private FileReader fileReader; private BufferedReader bufferedRead ...

  7. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  8. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  9. 详细讲解Java中log4j的使用方法

    详细讲解Java中log4j的使用方法 作者: 网络 来源: 日期: 2008-1-3 23:40:24 1.Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要 ...

最新文章

  1. goaheadlinux移植_Linux下goahead3.3.6的移植以及文件上传下载示例
  2. 201771010102 常惠琢 《2018面向对象程序设计(Java)》第9周学习总结
  3. java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例
  4. c语言iso校验算法,模式识别c语言ISODATA算法.doc
  5. php tp写构造函数,详细介绍ThinkPHP中类的构造函数_construct()与_initialize()的区别
  6. java scjp 试题_JAVA认证历年真题:SCJP考试真题和解析
  7. 第45届ICPC 昆明站 临时模板补充
  8. 实验三十三、标准访问控制列表的配置
  9. jquery+baidu map api 仿安居客地图找房源(基于百度地图)
  10. python视频教程马哥_【进阶】51CTO马哥Python从入门到精通视频 60课
  11. 禁用EnableViewState和启用EnableViewStat时请注意
  12. Installed Build Tools revision 33.0.0 is corrupted. Remove and install again using the SDK Manager
  13. VMware16.0如何装win7和win10
  14. 宾客往来络绎不绝 企业访客管理如何不失礼仪
  15. 【五一创作】(2017NHOI-GOC测评)第1题 鱼形(fish)
  16. jQuery Validate详解
  17. 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
  18. 英特尔睿频加速技术概况(Turbo Boost)
  19. 完全背包问题(f m)
  20. Android解压apk包

热门文章

  1. oracle部署在mysql_Oracle数据库部署实施流程
  2. 计算机考研逻辑学,管综专硕:走出不考逻辑学专业知识的误区
  3. mvp的全称_现役最强外援,总决赛MVP,来到CBA之后赚了多少钱?
  4. Apache Flink不止于计算,数仓架构或兴起新一轮变革
  5. 程序员的“鱿鱼游戏”,你能活到第几关?
  6. 深入解读阿里云Redis开发规范:不要只会setget
  7. 一文了解Spring Cloud Stream体系
  8. 3台廉价服务器支撑200万TPS的消息中间件
  9. 多线程Java Socket编程示例
  10. yolov5 mobile 剪枝