retainall java_瞬间教你学会使用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 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方法相关推荐
- 瞬间教你学会使用java中list的retainAll方法
retainAll方法简介 当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集.retainAll是Collection接口中提供的一个方法,各个实现类有自己 ...
- 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; // ...
- 电脑录屏工具_一分钟教你学会两种电脑录屏的方法,以后别再说不知道了
相信大家用电脑都会截图,但有时候需要用到录屏,这就难倒了很多人.那么如何在电脑是录屏呢?下面就来教你学会两种电脑录屏的方法,以后别再说不知道了. 阅读引导: •阅读完本文预计需要2分钟时间. •本文是 ...
- 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...
[多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 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是发挥不了作 用的)和分析,要 ...
最新文章
- NLP进阶之(七)膨胀卷积神经网络
- C语言----字符串左旋
- 一篇深入剖析PCA的好文
- java 词频_java程序:统计单词词频,
- 网络计算机应急处理,网络安全应急响应
- HTTP GET请求URL中IP被异常替换的问题
- 游戏开发电子书(PDF)下载分享
- zktime 协议_ZKTiMe5.0考勤管理系统使用介绍(1.3版).pdf
- Via板载声卡底噪严重、播放卡顿及耳机与扬声器音源切换问题【解决方法】
- gst-launch-1.0在Linux下的命令
- android支付宝转跳转,APP跳转支付宝指定界面
- 一起聊一聊数字化,信息化,数据化,数字化转型(建议收藏)
- POJ(8463)-----Stupid cat Doge(openjudge)
- mac上传文件到阿里云ECS及scp命令使用
- 疾病研究:重症肌无力
- 常见的exceptions总结
- 机器学习专题之概率论——雅可比式
- SSM+老年人社区服务平台 毕业设计-附源码211711
- 随机生成华人姓名的Java工具类:权重 + 随机
- 我多想时光都可以典当,你回来带我赎回过往