原文地址:http://blog.csdn.net/insistgogo/article/details/19619645
1、創建一個ArrayList
?
- List<Integer>?list?=?new?ArrayList<Integer>();??
2、List常用的遍歷方法有三種:
(1)下標循環
?
- for?(int?i?=?0,?len?=?list.size();?i?<?len;?i++)?{??
- ????System.out.print(list.get(i).toString());??
- }??
說明:
1)最一般的方法
2)idea快捷鍵:itar + Tab 或者 fori + Tab
(2)for each循環
?
- for?(Integer?elem?:?list)?{??
- ????System.out.print(elem.toString());??
- }??
說明:在不修改容器長度時,僅僅遍歷容器時推薦使用。
?
1)優點:代碼簡潔美觀:不存在索引,所以不用關心下標、初始值、是否越界等
2)缺點:刪除容器中的元素容易出錯。
3)idea快捷鍵:iter + Tab 或者 i + Tab
(3)迭代器循環
?
- for?(Iterator?iter?=?list.iterator();?iter.hasNext();?)?{??
- ????System.out.print(iter.next());??
- }??
或者
?
- Iterator<Integer>?iter?=?list.iterator();??
- while?(iter.hasNext())?{??
- ????System.out.print(iter.next());??
- }??
說明:在刪除容器中元素時,最好使用迭代器循環
1)優點:能對容器中的元素進行刪除
2)idea快捷鍵:itco + Tab
3、三種遍歷方法的效率比較
見文章:ArrayList和LinkedList的幾種循環遍歷方式及性能對比分析
這里該文章總結下:
(1)對于ArrayList而言:
1)從速度上看,foreach和迭代器循環速度差不多,但是都比下標遍歷慢。
2)綜合編碼難度,在僅僅對集合進行遍歷的時候,只使用for each
?
(2)對于LinkedList而言:
1)從速度上看,foreach和迭代器循環速度差不多,但是遠比下標遍歷快。
2)綜合編碼難度,在僅僅對集合進行遍歷的時候,只使用for each
說明:
(1)對于LinkedList,GetAt方法需要一次遍歷鏈表,其時間復雜度為O(n),因此使用下標遍歷時,速度很慢,級別為n^2。
(2)對于ArrayList,GetAt方法直接使用下標定位,其時間復雜度為O(1),因此使用下標遍歷時,級別為n。
總結:無論對于ArrayList還是LinkedList,
(1)僅對其遍歷而不修改容器大小時,只使用foreach循環
(2)需要邊遍歷邊修改容器大小時(插入刪除元素),只使用迭代器循環