java用retainALL 处理两个具有相同元素的list,竟然返回false,这是为什么?

设了两个list里面元素完全一样,但是用retainAll却获取不了元素,这是为什么的list代码如下String[]food={"eggs","bacon","lett... 设了两个list 里面元素完全一样,但是用retainAll却获取不了元素,这是为什么的
list代码如下
String[] food={"eggs","bacon","lettuce","beef","pork","chicken"};
ArrayList<String> list1=new ArrayList<String>();
ArrayList<String> list3=new ArrayList<String>();

for(String x: food){
list1.add(x);
list3.add(x);
}
然后用retainAll处理list3时一直没有返回值,测了下,竟然list3.retainAll(list1)是false 这是为什么呢?
System.out.println("retainall "+list3.retainAll(list1)); //输出retainall false
貌似没说明白,按理说这里应该返回true的,为什么成了false呢?
展开
 我来答
ifeilong
2014-09-17 · TA获得超过8068个赞
知道大有可为答主
回答量:1187
采纳率:100%
帮助的人:788万
展开全部

首先, 这个retainAll 方法的作用是 :

java.util.ArrayList.retainAll(Collection<?> collection)

仅保留此collection中那些也包含在指定collection的元素(可选操作)。
换句话说,移除此collection中未包含在指定collection中的所有元素。

此实现在此collection上进行迭代,依次检查该迭代器返回的每个元素,以查看其是否包含在指定的collection中。如果不是,则使用迭代器的remove方法将其从此collection中移除。


其次,返回值的意思是这样的,

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


再次,你这个list3 和list1 里面元素的内容 其实是一样的, 这样一来,调用 list3.retainAll(list1) 时候,发现,不需要从list3中去除不在list1中的元素,因此这个list3不需要发生更改,那么返回值就是是false,也就是说,这个方法的返回值是标识list3 有没有改变,而不是这个方法是否执行正常或者成功



最后,我们再来看看 JDK1.6 这个方法的 源码


	public boolean retainAll(Collection<?> c){
boolean modified = false;
Iterator<E> e = iterator();
while (e.hasNext()){
if (!c.contains(e.next())){
e.remove();
modified = true;
}
}
return modified;
}
arrow7880
2014-09-16 · TA获得超过100个赞
知道答主
回答量:140
采纳率:100%
帮助的人:115万
展开全部
因为retainAll方法本身就是被设定为反馈一个boolean值。
追问
我知道,但是按理说这里应该返回true的
追答

截自Java的API,注意那一行。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式