leetcode 394 字串解碼.
阿新 • • 發佈:2021-06-12
集合元素的遍歷操作,使用迭代器Iterator介面
- 內部方法:hasNext() 和 next()
- 集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。
- 內部定義了remove(),可以在遍歷的時候,刪除集合中的元素。此方法不同於集合直接呼叫remove()
1. 集合元素的遍歷
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); Iterator iterator = coll.iterator(); //方式一: // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // //報異常:NoSuchElementException // System.out.println(iterator.next()); //方式二:不推薦 for (int i = 0; i < coll.size(); i++) { System.out.println(iterator.next()); } //方式三:推薦 //hasNext():判斷是否還有下一個元素 while(iterator.hasNext()){ //next():1.指標下移 2.將下移以後集合位置上的元素返回 System.out.println(iterator.next()); } }
2. 錯誤的遍歷方式
// 錯誤方式一: // Iterator iterator = coll.iterator(); // while ((iterator.next()) != null){ // System.out.println(iterator.next()); // } // 錯誤方式二: // 集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。 // while (coll.iterator().hasNext()){ // System.out.println(coll.iterator().next()); // }
3. 測試Iterator中的remove()
結論:如果還未呼叫next()或在上一次呼叫next方法之後已經呼叫了remove方法,再呼叫remove都會報IllegalStateException。
//刪除集合中"Tom" Iterator iterator = coll.iterator(); while (iterator.hasNext()){ // iterator.remove();//如果還未呼叫next()就呼叫remove(),就會報異常 Object obj = iterator.next(); if("Tom".equals(obj)){ iterator.remove(); // iterator.remove();如果在上一次呼叫next方法之後已經呼叫了remove方法,同理,也會報異常 } }
4. 使用增強for迴圈遍歷集合
jdk5.0新增了foreach迴圈,用於遍歷集合、陣列。
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//for(集合元素的型別 區域性變數 : 集合物件)
//內部仍然呼叫了迭代器。
for(Object obj : coll) {
System.out.println(obj);
}
}
@Test
public void test2(){
int[] arr = new int[]{1,2,3,4,5,6};
//for(陣列元素的型別 區域性變數 : 陣列物件)
for (int i : arr) {
System.out.println(i);
}
}