您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關for與foreach在遍歷集合時的差別有什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
雖然遍歷方式的寫法有多種,但是底層無非就是for循環和foreach(迭代器)兩種方式!這兩種遍歷方式都能達到遍歷集合的效果,但是在效率上孰優孰劣?我們先看一段代碼:
1public static void main(String[] args) {
2 List<String> linkedList = new LinkedList<>();
3 for (int i = 0; i < 100000; i++) {
4 linkedList.add("L1");
5 }
6 long time1 = System.currentTimeMillis();
7 //for遍歷
8 for (int i = 0; i < linkedList.size(); i++) {
9 System.out.println(linkedList.get(i));
10 }
11 long time2 = System.currentTimeMillis();
12 //foreach遍歷
13 for (String s : linkedList) {
14 System.out.println(s);
15 }
16 long time3 = System.currentTimeMillis();
17 System.out.println("for執行時間:" + (time2 - time1));
18 System.out.println("foreach執行時間:" + (time3 - time2));
19}
??這次我們創建的是一個LinkedList,通過循環往集合里面寫入了十萬個元素,然后分別通過foreach(迭代器)和for的方式對集合進行遍歷輸出,并且記錄了兩種方式的耗時。那我們先思考一下哪種方式的耗時更長呢?我們看下結果:
??
??我們能看到使用for遍歷的耗時是foreach的好幾倍!如果想知道為什么會有這么大的差距,我們只能通過源碼找答案了!其實差距不是在循環本身,而是在循環內獲取元素的時候!我們先看下使用for循環時的linkedList.get(i) 的實現:
1public E get(int index) {
2 checkElementIndex(index);
3 return node(index).item;
4}
??LinkedList的get方法內部先調用了checkElementIndex方法檢查了index參數的合法性,然后調用node(index)方法獲取元素。我們進入node方法:
1Node<E> node(int index) {
2// assert isElementIndex(index);
3if (index < (size >> 1)) {
4 Node<E> x = first;
5 for (int i = 0; i < index; i++)
6 x = x.next;
7 return x;
8} else {
9 Node<E> x = last;
10 for (int i = size - 1; i > index; i--)
11 x = x.prev;
12 return x;
13}
}
??從上面代碼我們能分析出下面幾點特性
1、LinkedListd底層是一個雙向鏈表,可以從頭部遍歷也可以從尾部遍歷,這樣做可以提高獲取元素的效率!
2、當獲取元素的索引小于集合元素數量的一半,則從隊列頭部開始遍歷直到目標元素!如果大于一半則從隊列尾部開始遍歷直到目標元素!
3、每次在獲取元素的時候,都需要從隊列頭或者隊列尾部逐個遍歷直到找到目標元素。這也就是為什么使用for循環遍歷LinkedList慢的原因!并且,當集合的元素數量越多,for遍歷與foreach的差距就越大!
??那么如果我們的集合類型是ArrayList,使用for和foreach的差距大嗎?由于ArrayList底層是數組,通過索引獲取數組的效率是非常高的,因此使用for與foreach在效率基本沒太大差別!
上述就是小編為大家分享的for與foreach在遍歷集合時的差別有什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。