問題的產生:
在學習HashSet類時遇到一個案例:
金角大王有一個紫金葫蘆,里面裝進了“孫行者”, “行者孫”,“者行孫”,現在來了一個“孫悟空”, 他說:先放出我的朋友“孫行者”,再把我裝進去,
請用HashSet和Monkey類實作以上需求,
如果按常理使用迭代器進行增刪操作:
public static void main(String[] args) {
Monkey m1 = new Monkey("孫行者");
Monkey m2 = new Monkey("行者孫");
Monkey m3 = new Monkey("者行孫");
Monkey m = new Monkey("孫悟空");
HashSet set = new HashSet();
set.add(m1);
set.add(m2);
set.add(m3);
System.out.print("現在紫金葫蘆里有:");
for (Object s : set) {
System.out.print(s);
}
Iterator it = set.iterator();
while (it.hasNext()){
Object o = it.next(); // 此行運行報錯!
if (((Monkey)o).getName().equals("孫行者")){
set.remove(o); // 在此處進行洗掉操作
System.out.println("\n現在放出“孫行者”");
}
}
System.out.println("現在放入“孫悟空”");
set.add(m);
System.out.print("\n現在紫金葫蘆里有:");
for (Object s : set) {
System.out.print(s);
}
會報錯,結果如下:

問題的解決:
1.理論
后來理解了,迭代器的使用相當于是HashSet類物件將自己的元素暫時托管了給迭代器,所以如果要進行增刪操作,必須也要通過迭代器物件來完成,查閱原始碼可知,如果在迭代器里直接對HashSet類物件進行操作,會引起元素的修改次數和期待修改次數不等進而報錯,而通過迭代器物件增刪就不會引起問題,
2.實踐
將上文的洗掉操作這行代碼進行更改:
// set.remove(o); 原代碼
it.remove(); // 更改后
正常運行,結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/198598.html
標籤:其他
上一篇:Java面向物件總結
下一篇:陣列操作的兩個常見小問題
