a)Iterator
b)Iterable
Iterable接口包含一個可以產生Iterator的iterator()方法,建立了任何實現Iterable接口的類,均可以將它用於foreach語句中。
代碼示例java
/** * 遍歷list、map */ public static void test(){ List list = new ArrayList(); Map map = new HashMap(); for(int i = 0; i < 5; i ++){ list.add("list" + i); map.put(i, "list" + i); } //遍歷list Iterator iterator_list = list.iterator(); while (iterator_list.hasNext()){ String next = (String)iterator_list.next(); System.out.println(next); } //遍歷map map.put(13, "list" + 13); map.put(12, "list" + 12); Iterator iterator_map = map.entrySet().iterator(); while (iterator_map.hasNext()){ Map.Entry strMap=(Map.Entry)iterator_map.next(); System.out.println(strMap.getValue()); } }
主要在與remove方法上有區別,調用remove方法後,list.size()的大小變化。for循環中remove後可能致使錯誤。
iterator循環中remove後不只會刪除元素,還會維護一個標誌,用來記錄目前是否是可刪除狀態。 算法
代碼示例blog
/** * testRemove */ public static void testRemove(){ List<String> list = new ArrayList<>(); List<String> iterator_list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); iterator_list.add("A"); iterator_list.add("B"); iterator_list.add("C"); iterator_list.add("D"); //for循環 for(int i = 0; i < list.size(); i ++){ System.out.println(list.get(i)); if("C".equals(list.get(i))){ list.remove(list.get(i)); } } //iterator循環 Iterator<String> iterator = iterator_list.iterator(); while (iterator.hasNext()){ //iterator.remove(); 報錯;調用以前至少有一次next()方法的調用 String next = iterator.next(); System.out.println(next); if("C".equals(next)){ iterator.remove(); //iterator.remove();重複刪除會報錯,不能連續兩次remove } } }
若是使用 Iterator 來遍歷集合中元素,一旦再也不使用 List 轉而使用 Set 來組織數據,那遍歷元素的代碼不用作任何修改,
若是使用 for 來遍歷,那全部遍歷此集合的算法都得作相應調整,由於List有序,Set無序,結構不一樣,他們的訪問算法也不同。接口
a)for循環適合隨機結構:
ArrayList對隨機訪問比較快,而for循環中的get()方法,採用的便是隨機訪問的方法,所以在ArrayList裏,for循環較快。
b)iterator適合順序結構:
LinkedList則是順序訪問比較快,iterator中的next()方法,採用的便是順序訪問的方法,所以在LinkedList裏,使用iterator較快。
ArrayList對隨機訪問比較快,而for循環中的get()方法,採用的便是隨機訪問的方法,所以在ArrayList裏,for循環較快。
b)iterator適合順序結構:
LinkedList則是順序訪問比較快,iterator中的next()方法,採用的便是順序訪問的方法,所以在LinkedList裏,使用iterator較快。rem