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