带你正确的使用List的retainAll方法求交集
一、 retainAll 方法
public boolean retainAll(Collection<?> c) {
//调用自己的私有方法
return batchRemove(c, true);
}
二、batchRemove 方法解析
如果此 collection 由于调用而发生更改,则返回 true
//集合A比较与集合B的交集
private boolean batchRemove(Collection<?> c, boolean complement) {
//获得当前对象的所有元素
final Object[] elementData = this.elementData;
//w:标记两个集合公共元素的个数
int r = 0, w = 0;
//设置标志位
boolean modified = false;
try {
//遍历集合A
for (; r < size; r++)
//判断集合B中是否包含集合A中的当前元素
if (c.contains(elementData[r]) == complement)
//如果包含则直接保存。
elementData[w++] = elementData[r];
} finally {
// 如果 c.contains() 抛出异常
if (r != size) {
//复制剩余的元素
System.arraycopy(elementData, r,
elementData, w,
size - r);
//w为当前集合A的length
w += size - r;
}
//如果集合A的大小放生改变
if (w != size) {
// 清除工作
for (int i = w; i < size; i++)
elementData[i] = null;
//记录集合中元素的改变(add/remove)
modCount += size - w;
//设置当前数组的大小
size = w;
//返回为true
modified = true;
}
}
return modified;
}
1、关于modCount变量的说明
AbstractList包含一个modCount变量,它的初始值是0,当集合中的内容每被修改一次时(调用add(), remove()等方法),modCount加1
2、关于返回值的说明
如果集合A数组的大小没有改变,则返回false。如果集合A和集合B是完全相同的集合,也会返回false。
public static void main(String[] args) {
ArrayList<String> listA= new ArrayList<String>();
listA.add("Tom");
ArrayList<String> listB= new ArrayList<String>();
listB.add("Tom");
System.out.println(listA.retainAll(listB)); //false
}
即使两个集合没有交集,也会返回true。
public static void main(String[] args) {
ArrayList<String> listA= new ArrayList<String>();
listA.add("Tom");
ArrayList<String> listB= new ArrayList<String>();
listB.add("Jack");
System.out.println(listA.retainAll(listB));//true
}
所以,我们要记住:当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False。
三、正确的使用 retainAll 方法
public static void main(String[] args) {
ArrayList<String> listA= new ArrayList<String>();
listA.add("Tom");
ArrayList<String> listB= new ArrayList<String>();
listB.add("Tom");
listA.retainAll(listB);
if(listA.size()>0){
System.out.println("这两个集合有相同的交集");
}else{
System.out.println("这两个集合没有相同的交集");
}
}
1、首先调用retainAll的方法
2、通过判断集合的大小,来确定是否存在交集。不能通过方法返回的True和False来判断。
带你正确的使用List的retainAll方法求交集的更多相关文章
- 【转】带你正确的使用List的retainAll方法求交集
一. retainAll 方法 public boolean retainAll(Collection<?> c) { //调用自己的私有方法 return batchRemove(c, ...
- win7自带wifi win7无线网络共享设置图文方法
win7自带wifi win7无线网络共享设置图文方法 点评:开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器 ...
- 正确的lnamp支持SSI的方法!即支持SHTML和include调用!
正确的lnamp支持SSI的方法!即支持SHTML和include调用! 个地方:一个是apache和nginx里的conf文件 第一步:修改apache里的httpd.conf文件 查找:AddTy ...
- 你的服务器没有正确响应Token验证的解决方法
你的服务器没有正确响应Token验证,请阅读消息接口使用指南 微信 微信公众平台开发模式 平台 消息 接口 启用 URL Token作者:http://txw1958.cnblogs.com/ 原文: ...
- 微信公众平台消息接口开发(2)你的服务器没有正确响应Token验证的解决方法
你的服务器没有正确响应Token验证,请阅读消息接口使用指南 微信 微信公众平台开发模式 平台 消息 接口 启用 URL Token作者:http://txw1958.cnblogs.com/ 本系统 ...
- 瞬间教你学会使用java中list的retainAll方法
retainAll方法简介 当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集.retainAll是Collection接口中提供的一个方法,各个实现类有自己 ...
- 理解Vue.mixin,带你正确的偷懒
关于Vue.mixin在vue官方文档中是这么解释的: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有 ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- 【MySQL】MySQL使用正确密码却认证失败问题解决方法
前言:笔者根据 #MySQL忘记密码,重置密码方法 ,修改密码后.使用修改后的正确密码怎么也登录不上数据库,然后经过以下方法,重新登录数据库. 1.确认MySQL安装目录下没有data(Data)文件 ...
随机推荐
- 软件测试 —— Bug
[Bug规范] Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题尽量简明 做什么操作 + 出现什么结果,比如(点击提交按钮,出现卡顿现象 ...
- 5、Docker网络配置(单机)
一.概述 以下内容参考:https://docs.docker.com/network/#network-drivers Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连 ...
- Js_获取浏览器等高宽
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document. ...
- allegro 封装 (引脚编号修改)
1. 打开dra文件在find里面 off all 然后只点击text 2.点击需要更改的焊盘 3.菜单栏edit - text 4.弹出窗口修改即可
- supervisor管理进程 superlance对进程状态报警
supervisor介绍 首先,介绍一下supervisor.Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linu ...
- 使用kubeadm安装kubernetes高可用集群
kubeadm安装kubernetes高可用集群搭建 第一步:首先搭建etcd集群 yum install -y etcd 配置文件 /etc/etcd/etcd.confETCD_NAME=inf ...
- 揭秘memset与sizeof的结合使用方法
memset与sizeof为什么经常结合起来用呢? 一.memset介绍 memset函数是C++中的一个函数,它将从给定地址开始,逐个字节刷内存,初始化它们为给定的参数. 基本用法: void * ...
- Notes of Daily Scrum Meeting(11.12)
今天我们召开了Beta阶段MOOC项目开发的第一次Scrum Meeting,在会上就alpha阶段进行了总结,然后我们确定了 接下来的Beta阶段的项目分工,并且就每天的进度汇报做了一个约定,就是每 ...
- 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...
- Daily Scrum - 12/02
Meeting Minutes Shuo终于把文件存取弄好了!Wei大致把后端的代码整合好了,现在是可以基本实现算法的一个简易背单词版本.另外我们又交流了一下UI方面的事情,发现还是有一些问题(特别是 ...