A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个方法是用来取两个集合的交集,实验了一下这个方法,这个方法的返回值类型是boolean。但是发现一个问题,比如说以下代码:
  1. ArrayList al1 = new ArrayList();
  2.                 ArrayList al2 = new ArrayList();
  3.                
  4.                 al1.add("abc");
  5.                 al1.add("789");
  6.                 al1.add("ddd");
  7.                
  8.                 System.out.println(al1.retainAll(al2));
  9.                 System.out.println(al1);
复制代码
在al2中添加的元素,如果和al1没有交集,也会返回true,然后原来的集合变为空,后来在al2中添加的是与al1元素不同类型的元素或者根本不添加元素,用这个方法始终返回true,原集合变为空,竟然从来不会返回false。
有没有大神给我个返回false的例子啊。
如果不能返回false,那还要返回值干嘛啊。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 李哲 于 2012-5-19 12:14 编辑

retainAll
boolean retainAll(Collection<?> c)仅在列表中保留指定 collection 中所包含的元素(可选操作)。换句话说,该方法从列表中移除未包含在指定 collection 中的所有元素。

指定者:
接口 Collection<E> 中的 retainAll
参数:
c - 包含将保留在此列表中的元素的 collection
返回:
如果此列表由于调用而发生更改,则返回 true
抛出:
UnsupportedOperationException - 如果列表不支持 retainAll 操作
ClassCastException - 如果此列表的元素的类和指定的 collection 不兼容(可选)
NullPointerException - 如果此列表包含一个 null 元素,并且指定的 collection 不允许 null 元素(可选),或者指定的 collection 为 null

回复 使用道具 举报
本帖最后由 孙宇晨 于 2012-5-19 14:33 编辑

ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList();
al1.add("abc");
al2.add("abc");
  System.out.println(al1.retainAll(al2));
                System.out.println(al1);
你试一下. 应该返回的就是false了. 返回fasle的条件是不符合纯在移除条件的对象
retainAll 的作用是保留交集  也就是移除交集以外的

点评

不过你下面的文字 解释倒是对的  发表于 2012-5-19 14:33
你这样还是返回true的 除非你 System.out.println(al2.retainAll(al1)); 1和2调换一个位置 才会false  发表于 2012-5-19 14:30
回复 使用道具 举报
李哲 发表于 2012-5-19 11:15
retainAll
boolean retainAll(Collection c)仅在列表中保留指定 collection 中所包含的元素(可选操作)。 ...

的确存在false的情况 两个集合元素相同时
回复 使用道具 举报
本帖最后由 李哲 于 2012-5-19 12:19 编辑
孙宇晨 发表于 2012-5-19 12:03
的确存在false的情况 两个集合元素相同时

谢谢指教。
我思想有些先入为主。

总是在寻找为什么会这样的现象,却没有想到这现象本来就是特例,不能表示代表真实。

如果此列表由于调用而发生更改,则返回 true

看来此列表由于调用而未发生更改,就false
回复 使用道具 举报
孙宇晨 发表于 2012-5-19 12:03
的确存在false的情况 两个集合元素相同时

谢谢指导
回复 使用道具 举报
孙宇晨 发表于 2012-5-19 11:57
ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList();
al1.add("abc");

是我马虎了.
回复 使用道具 举报
本帖最后由 杨尧 于 2012-5-19 22:23 编辑

这个返回值 true false 意思是说这个方法是否操作了
retainAll的功能是仅保留 al1 中那些也包含在 al2 中元素。换句话说,移除al1 中未包含在指定 al2 中的所有元素。
他的返回值是这一操作是否执行了,如果执行了就返回true,就是 al1中移除了一些元素
是false的情况就是没有做任何操作,也就是2个集合完全相同!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马