迭代器模式:
把訪問邏輯從不同類型的集合類中抽取出來,從而避免向外部暴露集合的內部結構。
Iterable接口:
foreach遍歷集合的優勢在於代碼更加的簡潔,更不容易出錯,不用關心下標的起始值和終止值。
從本質上說,foreach其實就是在使用迭代器,在使用foreach遍歷時對集合的結構進行修改,和在使用Iterator遍歷時對集合結構進行修改本質上是一樣的。同樣會拋出異常,執行快速失敗機制。
在使用Iterator的時候禁止對所遍歷的容器進行改變其大小結構的操作。例如,在使用Iterator進行迭代時,如果對集合進行了add/remove操作就會出現ConcurrentModificationException異常。
RandomAccess
what is random and sequential access lists?
java集合類中元素的訪問分為隨機訪問和順序訪問。
隨機訪問一般是通過index下標訪問,行為類似數組的訪問。而順序訪問類似於鏈表的訪問,通常為迭代器遍歷。
ArrayList是典型的隨機訪問型,而LinkedList則是順序訪問型。
List接口既定義了下標訪問方法,又定義了迭代器方法。因此,其實例既可使用下標隨機訪問也可以使用迭代器進行遍歷,但這兩種方式的性能差異很明顯。(下標訪問比迭代器訪問更快)
for循環與迭代器的對比:
1、ArrayList對隨機訪問比較快,而for循環中使用的get()方法,采用的即是 隨機訪問的方法,因此在ArrayList里for循環更快(foreach是一個內部循環體,多了其它的邏輯,雖然比for循環慢一些,但還是一個量級的);
2、LinkedList則是順序訪問比較快,Iterator中的next()方法,采用的是 順序訪問方法,因此在LinkedList里只用Iterator更快。
主要還是依據集合的數據結構不同的判斷。
ArrayList和LinkedList隨機訪問的區別
ArrayList是數組結構,隨機訪問具有常量時間。
LinkedList是鏈表結構,隨機訪問分為兩步:
1)根據index查找Node,通常是一個for循環查找到index對應的Node
2)返回Node中存儲的元素
ArrayList的下標遍歷性能高於LinkedList的下標遍歷。
