首先,我个人有个习惯,在遍历集合的时候喜欢直接用foreach的方式,在此之前并没有觉得什么,但是有一件事却改变了我这个习惯,首先来看一段代码
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
// 删除内容为b的
for(String str : list) {
if("b".equals(str)) {
list.remove(str);
}
}
for(String str : list) {
System.out.println(str);
}这段代码看上去没有什么问题对吧,执行之后也没有问题,但是我如果要删除的不是b而是c呢?神奇的事情就发生了。下面是控制台信息
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at test.cn.wxy.Test.main(Test.java:15)
于是修改成如下代码,问题解决了。
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> it = list.iterator();
// 删除内容为c的
while(it.hasNext()) {
if("c".equals(it.next())) {
it.remove();
}
}
for(String str : list) {
System.out.println(str);
}正是发生了上面这样的问题,让我对iterator产生了重视。在动态操作集合的时候使用迭代器是更安全的一种方式
在遍历map的时候呢,之前通常是先用keyset渠道key然后就可以根据key拿到map里的值,但是用一种更好的方式entryset,
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a",1);
map.put("b", 2);
// keySet
for(String key : map.keySet()) {
// 这里取得了key,如果想要取得value
map.get(key);
}
// entrySet
for(Entry<String, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
}在这里,虽然代码形式差不多,但entrySet的效率是要比keySet高的,而且无论取value还是取key都要比keySet灵活。
2699

被折叠的 条评论
为什么被折叠?



