当前位置: 代码迷 >> J2SE >> Conllection中的retainAll步骤
  详细解决方案

Conllection中的retainAll步骤

热度:73   发布时间:2016-04-23 19:40:45.0
Conllection中的retainAll方法
如果是直接向两个集合中添加元素,再调用retainAll方法,返回的是true

如果是通过list给list2添加元素,就会出现false的情况,代码如下,求大神分析

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
public static void main(String[] args) {
List list = new ArrayList();
List list2 = new ArrayList();

list.add("HelloKitty1");
list.add("HelloKitty2");
list.add("HelloKitty4");
list.add("HelloKitty2");

//遍历list集合,将不同的元素存入list2集合中。
for (Iterator it = list.iterator(); it.hasNext();) {
String str =(String)it.next();
if(!(list2.contains(str))){
list2.add(str);
}

}

//System.out.println(list.retainAll(list2));

//遍历list2,中确实已经存入了3个不重复的元素
for (Iterator it = list2.iterator(); it.hasNext();) {
//String obj = (String) it.next();
System.out.println(it.next());
}



//为什么这里返回的是false??????
System.out.println(list.retainAll(list2));


}
}

------解决思路----------------------
看文档,首先是retainAll方法:
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。换句话说,移除此 collection 中未包含在指定 collection 中的所有元素。
此实现在此 collection 上进行迭代,依次检查该迭代器返回的每个元素,以查看其是否包含在指定的 collection 中。如果不是,则使用迭代器的 remove 方法将其从此 collection 中移除。
返回:
如果此 collection 由于调用而发生更改,则返回 true
另请参见:
remove(Object), contains(Object)

然后是contains方法:
如果此 collection 包含指定的元素,则返回 true。更确切地讲,当且仅当此 collection 至少包含一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,返回 true。

所以 (o==null ? e==null : o.equals(e))就是是否相等的条件,如果不相等就会调用remove,然后就会返回true。
所以,只要List中元素的值相等,不管有几个,返回都是false。在调用retainAll之后打出list发现list确实没有变化。

另外楼主是Java几过来的人啊……Java5增加了泛型和foreach写代码不用这么费劲了!
	public static void main(String[] args) {
List<String> list = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();

list.add("HelloKitty1");
list.add("HelloKitty2");
list.add("HelloKitty4");
list.add("HelloKitty2");

// 遍历list集合,将不同的元素存入list2集合中。
for (String str : list) {
if (!(list2.contains(str))) {
list2.add(str);
}
}

// System.out.println(list.retainAll(list2));

// 遍历list2,中确实已经存入了3个不重复的元素
for (String str : list2) {
System.out.println(str);
}

// 为什么这里返回的是false??????
System.out.println(list.retainAll(list2));
System.out.println(list);
}
  相关解决方案