瞬间教你学会使用java中list的retainAll方法
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方法相关推荐
- java中retain_瞬间教你学会使用java中list的retainAll方式
retainAll方式简介 当我们有两个list聚集的时刻,我们可以使用retainAll方式求得两个list聚集的子集.retainAll是Collection接口中提供的一个方式,各个实现类有自己 ...
- 瞬间学会使用java中list的retainAll方法
boolean retainAll(Collection<?> c); 进入arrayList的方法实现.可以看到如下代码: public boolean retainAll(Collec ...
- java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库
本文主要向大家介绍了Oracle数据库之一分钟教你学会用java连接Oracle数据库,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. package java_jdbc; // ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...
- 电脑录屏工具_一分钟教你学会两种电脑录屏的方法,以后别再说不知道了
相信大家用电脑都会截图,但有时候需要用到录屏,这就难倒了很多人.那么如何在电脑是录屏呢?下面就来教你学会两种电脑录屏的方法,以后别再说不知道了. 阅读引导: •阅读完本文预计需要2分钟时间. •本文是 ...
- java中读取文件的方法
总结一下java中读取文件的方法: 方法一(逐行的读取文件内容): private FileReader fileReader; private BufferedReader bufferedRead ...
- JAVA中线程同步的方法(7种)汇总
JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...
- Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- 详细讲解Java中log4j的使用方法
详细讲解Java中log4j的使用方法 作者: 网络 来源: 日期: 2008-1-3 23:40:24 1.Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要 ...
最新文章
- goaheadlinux移植_Linux下goahead3.3.6的移植以及文件上传下载示例
- 201771010102 常惠琢 《2018面向对象程序设计(Java)》第9周学习总结
- java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例
- c语言iso校验算法,模式识别c语言ISODATA算法.doc
- php tp写构造函数,详细介绍ThinkPHP中类的构造函数_construct()与_initialize()的区别
- java scjp 试题_JAVA认证历年真题:SCJP考试真题和解析
- 第45届ICPC 昆明站 临时模板补充
- 实验三十三、标准访问控制列表的配置
- jquery+baidu map api 仿安居客地图找房源(基于百度地图)
- python视频教程马哥_【进阶】51CTO马哥Python从入门到精通视频 60课
- 禁用EnableViewState和启用EnableViewStat时请注意
- Installed Build Tools revision 33.0.0 is corrupted. Remove and install again using the SDK Manager
- VMware16.0如何装win7和win10
- 宾客往来络绎不绝 企业访客管理如何不失礼仪
- 【五一创作】(2017NHOI-GOC测评)第1题 鱼形(fish)
- jQuery Validate详解
- 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
- 英特尔睿频加速技术概况(Turbo Boost)
- 完全背包问题(f m)
- Android解压apk包