您的位置:首页 > 编程语言 > Java开发

那些java集合里犯的错

2017-08-13 10:25 218 查看
首先,我个人有个习惯,在遍历集合的时候喜欢直接用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灵活。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: