java中retain_瞬间教你学会使用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方式的先容和剖析到此结束,文中难免有不足之处,望人人指正交流。

原文链接:https://www.cnblogs.com/jichi/p/12892150.html

本站声明:网站内容来源于网络,若有侵权,请联系我们,我们将及时处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值