1.關于List的周遊删除
當我們想删除list中的某一條資料時候,通常會周遊list,找到那一個元素,然後移除。
【錯誤】的做法執行個體1
List<String> list = new ArrayList<String>();
list.add("aa1");
list.add("aa2");
list.add("aa2");
list.add("aa4");
for (int i = 0; i < list.size(); i++) {
if ("aa2".equals(list.get(i))) {
list.remove("aa2");
}
}
System.out.println(list);
輸出結果:
<span style="font-size:12px;">[aa1, aa2, aa4]</span>
雖然程式沒有報錯崩潰,但是這結果顯然是錯誤的,不是我們想要的。因為從前往後周遊list删除元素,會導緻取list元素不是我們想要的那一個(删除某個元素會導緻後面元素的角标改變)
【錯誤】的做法執行個體2
<span style="font-size:12px;">for(String s :list){
if("aa2".equals(s)){
list.remove(s);
}
}
System.out.println(list);</span>
輸出結果:
<span style="font-size:12px;">java.util.ConcurrentModificationException</span>
産生這個錯誤就說明你在周遊集合的時候删除了集合中的元素了或者是在多線程中删除了同一集合中的元素。
【正确】的做法1
for (int i = list.size()-1; i >=0; i--) {
System.out.println("i:" + i + ",size:" + list.size());
if ("aa2".equals(list.get(i))) {
list.remove("aa2");
}
}
System.out.println(list);
輸出結果:
[aa1, aa4]
通過反向周遊集合可以避免出現問題
【正确】的做法2(推薦)
Iterator<String > iterator = list.iterator();
while (iterator.hasNext()){
if("aa2".equals(iterator.next())){
iterator.remove();
}
}
System.out.println(list);
輸出結果:
[aa1, aa4]
最佳的方法是通過java的疊代器實作删除元素
2.快速輸出map
<span style="font-size:12px;">Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1,"a");
map.put(2,"b");
map.put(3,"c");
map.put(4,"d");
Iterator it = map.entrySet().iterator();
while (it.hasNext()){
Map.Entry<Integer,String> entry = (Map.Entry<Integer, String>) it.next();
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
}</span>
輸出結果
<span style="font-size:12px;">key:1,value:a
key:2,value:b
key:3,value:c
key:4,value:d</span>