1.通過擷取所有的key按照key來周遊
2.通過Map.entrySet使用iterator周遊key和value
3.通過Map.entrySet周遊key和value,推薦,尤其是容量大時
4.通過Map.values()周遊所有的value,但不能周遊key
第一種:
第二種:
第三種:
第四種:
主要有2種存儲方式:
1.順序存儲,Random Access(Direct Access):
這種方式,相鄰的資料元素存放于相鄰的記憶體位址中,整塊記憶體位址是連續的。可以根據元素的位置直接計算出記憶體位址,直接進行讀取。讀取一個特定位置元素的平均時間複雜度為O(1)。正常來說,隻有基于數組實作的集合,才有這種特性。Java中以ArrayList為代表。
2.鍊式存儲,Sequential Access:
這種方式,每一個資料元素,在記憶體中都不要求處于相鄰的位置,每個資料元素包含它下一個元素的記憶體位址。不可以根據元素的位置直接計算出記憶體位址,隻能按順序讀取元素。讀取一個特定位置元素的平均時間複雜度為O(n)。主要以連結清單為代表。Java中以LinkedList為代表。
每個周遊方法的實作原理是什麼?
1.傳統的for循環周遊,基于計數器的:
周遊者自己在集合外部維護一個計數器,然後依次讀取每一個位置的元素,當讀取到最後一個元素後,停止。主要就是需要按元素的位置來讀取元素。
2.疊代器周遊,Iterator:
每一個具體實作的資料集合,一般都需要提供相應的Iterator。相比于傳統for循環,Iterator取締了顯式的周遊計數器。是以基于順序存儲集合的Iterator可以直接按位置通路資料。而基于鍊式存儲集合的Iterator,正常的實作,都是需要儲存目前周遊的位置。然後根據目前位置來向前或者向後移動指針。
3.foreach循環周遊:
根據反編譯的位元組碼可以發現,foreach内部也是采用了Iterator的方式實作,隻不過Java編譯器幫我們生成了這些代碼。