那些java集合里犯的错
2017-08-13 10:25
218 查看
首先,我个人有个习惯,在遍历集合的时候喜欢直接用foreach的方式,在此之前并没有觉得什么,但是有一件事却改变了我这个习惯,首先来看一段代码
这段代码看上去没有什么问题对吧,执行之后也没有问题,但是我如果要删除的不是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灵活。
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灵活。
相关文章推荐
- Java集合中那些类是线程安全的
- java:集合那些事
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的
- Java集合中那些类是线程安全的 以及 Map线程安全几种实现方法
- java集合中那些知识
- 那些java集合里犯的错
- Java集合对象排序测试
- java基础-----集合!
- 对照Java学习Swift--集合类型
- Java集合(三)TreeSet的使用
- java复习之集合
- java的各种集合使用
- Java 运算符、集合框架、泛型、异常
- Java集合的深入剖析