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 work

for (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 list1= new ArrayList();

list1.add("123");

ArrayList list2= new ArrayList();

list2.add("123");

System.out.println(list1.retainAll(list2));

}

如上代码会返回false。

第二个:两个集合没有交集,会返回true。

public static void main(String[] args) {

ArrayList list1= new ArrayList();

list1.add("123");

ArrayList list2= new ArrayList();

list2.add("12345");

System.out.println(list1.retainAll(list2));

}

如上代码会返回true。

总结:当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False。

retainAll的判断方法

public static void main(String[] args) {

ArrayList list1= new ArrayList();

list1.add("123");

ArrayList list2= new ArrayList();

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方法的介绍和分析到此结束,文中难免有不足之处,望大家指正交流。

retainall java_瞬间教你学会使用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中list的retainAll方法

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

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

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

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

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

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

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

  7. java中读取文件的方法

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

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

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

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

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

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

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

最新文章

  1. NLP进阶之(七)膨胀卷积神经网络
  2. C语言----字符串左旋
  3. 一篇深入剖析PCA的好文
  4. java 词频_java程序:统计单词词频,
  5. 网络计算机应急处理,网络安全应急响应
  6. HTTP GET请求URL中IP被异常替换的问题
  7. 游戏开发电子书(PDF)下载分享
  8. zktime 协议_ZKTiMe5.0考勤管理系统使用介绍(1.3版).pdf
  9. Via板载声卡底噪严重、播放卡顿及耳机与扬声器音源切换问题【解决方法】
  10. gst-launch-1.0在Linux下的命令
  11. android支付宝转跳转,APP跳转支付宝指定界面
  12. 一起聊一聊数字化,信息化,数据化,数字化转型(建议收藏)
  13. POJ(8463)-----Stupid cat Doge(openjudge)
  14. mac上传文件到阿里云ECS及scp命令使用
  15. 疾病研究:重症肌无力
  16. 常见的exceptions总结
  17. 机器学习专题之概率论——雅可比式
  18. SSM+老年人社区服务平台 毕业设计-附源码211711
  19. 随机生成华人姓名的Java工具类:权重 + 随机
  20. 我多想时光都可以典当,你回来带我赎回过往

热门文章

  1. 计算机网络马宏伟应用层作业,计算机基础知识及试题4.doc
  2. java md5加密解密类_Java实现MD5加密解密类
  3. 震旦adc225打印机连接计算机,震旦adc225驱动
  4. 松本行弘:Ruby之父
  5. 分享 野人老师-高级信息系统项目管理师-全部的课程资料
  6. php模版推送方法,PHP快速推送微信模板消息
  7. 尚学堂第二章作业题答案
  8. android电视文件管理器,2018电视文件管理器排行榜(最新)
  9. 后台管理系统开发缺陷日志
  10. Java 游戏自动寻路,老游戏仙境传说RO私服自动寻路求交流(含代码)