带你正确的使用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)文件 ...
随机推荐
- [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]
题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...
- R绘图 第十篇:绘制文本、注释和主题(ggplot2)
使用ggplot2包绘制时,为了更直观地向用户显示报表的内容和外观,需要使用geom_text()函数添加文本说明,使用annotate()添加注释,并通过theme()来调整非数据的外观. 一,文本 ...
- sudo apt-get update 去除设置的代理
今天想装个软件(wine),使用 sudo apt-get update 命令时,发现给出很多Ign 语句,总出现 Connecting to proxy.http://10.0.126.1:1312 ...
- git 报错git-upload-pack 解决方法
报错如下: bash: git-upload-pack: command not foundfatal: The remote end hung up unexpectedly 原因:原来代码服务器上 ...
- ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写
参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...
- CentOS7使用winbind加入AD
https://ishm.idv.tw/?p=336 CentOS 7 使用 winbind 加入 AD 需求:已經熟悉 CentOS 6 的 AD 加入方式,CentOS 7 已將 winbind ...
- [T-ARA][Tic Tic Toc]
歌词来源:http://music.163.com/#/song?id=22704478 Tic Tic Toc RA Tic Tic Toc RA [Tic Tic Toc RA Tic Tic T ...
- 转载:ArcEngine 唯一值查询
转载 http://virgoooos.iteye.com/blog/512329 转载:http://blog.csdn.net/mydriverc/archive/2007/07/26/17092 ...
- redis启动停止+密码认证
redis启动停止命令 ./bin/redis-server redis.conf ./bin/redis-cli -h 127.0.0.1 -p 6379 shutdown flushall ——& ...
- Linux内核设计与实现 第五章
1. 什么是系统调用 系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备 ...