黑马程序员技术交流社区
标题:
用Iterator 遍历集合的3种方法的几个问题。
[打印本页]
作者:
逝去的记忆ヽ
时间:
2012-6-20 20:23
标题:
用Iterator 遍历集合的3种方法的几个问题。
本帖最后由 逝去的记忆ヽ 于 2012-6-21 10:02 编辑
下面是部分遍历集合元素的代码。
//最常规的一种遍历方法
public static void work(Map<String, Student> map) {
Collection<Student> c = map.values();
Iterator it = c.iterator();
for (; it.hasNext();) {
System.out.println(it.next());
}
}
//利用keyset进行遍历
public static void workByKeySet(Map<String, Student> map) {
Set<String> key = map.keySet();
for (Iterator it = key.iterator(); it.hasNext();) {
String s = (String) it.next();
System.out.println(map.get(s));
}
}
//利用
entrySet进行
遍历
public static void workByEntry(Map<String, Student> map) {
Set<Map.Entry<String, Student>> set = map.entrySet();
for (Iterator<Map.Entry<String, Student>> it = set.iterator(); it.hasNext();) {
Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
}
}
那么我要问的就是,这三种方法在遍历集合时,他们的优缺点是什么?哪种方式更适合在实际开发中应用?为什么?
如果用高级for循环来遍历的话,又有什么区别呢?
作者:
sbeeqnui1987
时间:
2012-6-20 21:04
增强型的for循环 优点主要体现在集合中,随便举个例子
比如对 set 的遍历
一般是迭代遍历:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
for循环遍历:
for (String str : set) {
System.out.println(str);
}
优点还体现在泛型 假如 set中存放的是Object
Set<Object> set = new HashSet<Object>();
for循环遍历:
for (Object obj: set) {
if(obj instanceof Integer){
int aa= (Integer)obj;
}else if(obj instanceof String){
String aa = (String)obj
}
........
}
如果你用Iterator遍历,那就晕了
map list 也一样
唯一的缺点就是 在遍历 集合过程中,不能对集合本身进行操作
for (String str : set) {
set.remove(str);//错误!
}
作者:
耿鑫
时间:
2012-6-20 21:33
首先应该明确的是,Map底层维护的的Entry对象,当然使用EntrySet的遍历要效率高,这是以前老版本中唯一一个遍历map的方式,KeySet方法中取得键值的操作是非常耗时的,另外
最主要的缺点是你在遍历的时候可以删除,你可以在遍历时调用iterator.remove()来删除entries
,另两个方法则不能。
如果采用增强for循环,除了泛型的问题外,
最重要的就是如果你遍历的是一个空的map对象,for循环将抛出NullPointerException
,因此在遍历前你总是应该检查空引用。
作者:
whocases
时间:
2012-6-20 21:37
itertor即枚举器,枚举器是Java在后台自动排序好,比纯粹的for循环要快,因为如果用 for循环,也需要将List中的对象依次取出,这样对内存的调用是随机的,不如Iterator
作者:
燃烧端午
时间:
2012-6-20 22:58
对于keySet遍历了2次,一次是转为iterator,一次从取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2