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]

保留了两个结合的交集。

日媒:奥运会若推迟 经济损失预计超3.2万亿日元

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

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

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

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

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

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

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

  4. java中读取文件的方法

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

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

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

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

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

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

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

  8. php url乱码java接收,java中url乱码解决方法

    java中url乱码解决方法:(推荐:java视频教程) 1.将字符串转码:newString("xxxxx".getBytes("iso-8859-1"),& ...

  9. java中容易混淆的方法_java中容易混淆的区别

    本文会随时更新一些java中容易混淆的关键字或者知识点,如有偏见之处,望留言! final和static的差别: 1,final的英语意思"最后的",在java中修饰类,方法和变量 ...

最新文章

  1. 《数学之美》第28章 逻辑回归和搜索广告
  2. 量子纠缠背后的故事(廿五):深藏幕后的神秘力量
  3. VS2010解决方案转换到VS2008
  4. UA MATH564 概率论 高阶矩的计算:有限差算子方法2
  5. 无法使用前导 .. 在顶级目录上退出
  6. Windows右键在当前目录打开Cygwin终端
  7. adf开发_ADF BC:创建绑定到业务组件的UI表
  8. 4300 字Python列表使用总结,用心!
  9. python菱形_python如何输出菱形与空心菱形详解与巧妙地使用center方法
  10. linux 目录与分区与文件,LINUX中的分区与文件系统
  11. 解决办法!!!!UnsupportedClassVersionError Unsupported major.minor version 52.0
  12. 理解常量指针与指针常量?
  13. 用python模拟微信支付_微信app支付python代码实现
  14. 迁移学习—Geodesic Flow Kernel for Unsupervised Domain Adaptation
  15. 如何使用C++做个简单推箱子游戏
  16. Technorati Blog Finder BETA
  17. [ 2204阅读 ] 题型专项 - 句子简化题
  18. android 三级级联筛选列表,写给程序员的Flutter详细教程
  19. Matlab实现Lasso-Lars
  20. 中小项目敏捷实践之一(关于项目所有者和责任人)

热门文章

  1. python读取大文件csv内存溢出_Python,内存错误,csv文件太大
  2. 以太坊白皮书_区块链60讲第33集~什么是以太坊?
  3. Blend for Visual Studio 2013
  4. JavaScript中的递归
  5. Ubuntu Nginx uwsgi django 初试
  6. JVM致命错误日志(hs_err_pid.log)分析
  7. 解决Table td设置了相同百分比,由于文字个数不同导致列宽不同问题
  8. Linux ext2文件系统小结
  9. VMware虚拟网络相关知识
  10. Deploying Windows Mobile 6 with Exchange Server 2007 白皮书