一,遍歷方法的實現原理
1、傳統的for循環遍歷,基於計數器的:
遍歷者自己在集合外部維護一個計數器,然后依次讀取每一個位置的元素,當讀取到最后一個元素后,停止。主要就是需要按元素的位置來讀取元素。
2、迭代器遍歷,Iterator:
每一個具體實現的數據集合,一般都需要提供相應的Iterator。相比於傳統for循環,Iterator取締了顯式的遍歷計數器。所以基於順序存儲集合的Iterator可以直接按位置訪問數據。
而基於鏈式存儲集合的Iterator,正常的實現,都是需要保存當前遍歷的位置。然后根據當前位置來向前或者向后移動指針。
3、foreach循環遍歷:
根據反編譯的字節碼可以發現,foreach內部也是采用了Iterator的方式實現,只不過Java編譯器幫我們生成了這些代碼。
二,數組的遍歷
1.for循環遍歷
/** * for循環遍歷 */ public static void forArr() { int[] arr = new int[] { 1, 2, 3 }; for (int i = 0; i < arr.length; i++) { int j = arr[i]; System.out.println(j); } }
2.foreach語句遍歷
/** * foreach語句遍歷 */ public static void foreachArr(){ int[] arr = new int[] { 1, 2, 3 }; for (int i : arr) { System.out.println(i); } }
三,ArrayList的遍歷
1.for
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); // for for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
2.foreach
// foreach
for (Integer integer : list) { System.out.println(integer); }
3.iterator
// iterator Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { int item = iterator.next(); System.out.println(item); }
四,HashMap的遍歷
1.通過獲取所有的key按照key來遍歷.
keySet()方法:將Map中所有的鍵存入到set集合中。因為set具備迭代器。所有可以迭代方式取出所有的鍵,再根據get方法。獲取每一個鍵對應的值。 keySet():迭代后只能通過get()取key
Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "first"); map.put(2, "second"); map.put(3, "three"); /** * 通過獲取所有的key按照key來遍歷 */ public static void byKey() { Set<Integer> keySet = map.keySet(); // map集合的所有key鍵的Set集合 for (Integer key : keySet) { String value = map.get(key); // 得到每個key對應的value值 System.out.println("key: " + key + " -->value: " + value); } }
2.通過Map.entrySet遍歷key和value,推薦,尤其是容量大時
entrySet()方法:Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射關系的 Set 視圖。 Map.Entry表示映射關系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。
/** * 通過Map.entrySet遍歷key和value,推薦,尤其是容量大時 */ public static void byEntrySet() { Set<Entry<Integer, String>> entrySet = map.entrySet(); // 通過entrySet()方法將map集合中的映射關系取出(這個關系就是Map.Entry類型) for (Entry<Integer, String> entry : entrySet) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } }
3.通過Map.values()遍歷所有的value,但不能遍歷key
values()方法:是獲取集合中的所有的值----沒有鍵,沒有對應關系
/** * 通過Map.values()遍歷所有的value,但不能遍歷key */ public static void byValues() { Collection<String> values = map.values(); for (String value : values) { System.out.println("value= " + value); } }
說明:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍歷Map的性能不如entrySet性能好,為了提高性能多考慮用entrySet()方式來進行遍歷。
五,HashSet的遍歷
1.foreach
Set<String> set = new HashSet<String>(); set.add("first"); set.add("second"); set.add("three"); // foreach for (String string : set) { System.out.println(string); }
2.iterator
// iterator Iterator<String> setIterator = set.iterator(); while (setIterator.hasNext()) { String string = (String) setIterator.next(); System.out.println(string); }