1. 程式人生 > >java foreach與for遍歷效率對比

java foreach與for遍歷效率對比

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">由於本人在準備秋招,所以在看到foreach和for那個遍歷效率更高的問題的時候,我百度了,又谷歌了,但是基本有的人說for更好,foreach更好,但是我無意中看到有人說如果是陣列型別的迭代器的話,效率相差不大,如果硬要說那個更好就是for,因為迭代器增加了範圍的判斷,而for則我們自己判斷。如果是LinkedList連結串列型別的話就是foreach遍歷更好。個人覺得不需要一下子去寫例子,你弄懂了原理,自然就知道區別了。好了,先說結論,現在闡述一下原理吧。</span>

先看陣列型別的迭代器,拿ArrayList來說吧。

ArrayList<Integer> list = new ArrayList<>();
		//一般迭代器的寫法
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Integer integer = (Integer) iterator.next();
			System.out.println(integer);
		}
		//for-each隱藏迭代器的寫法,避免混亂和出錯的可能,也更簡潔。
		for (Integer integer : list) {
			System.out.println(integer);
		}
		//for寫法
		for(int i = 0; i < list.size(); i++){
			System.out.println(list.get(i));
		}
遍歷寫法基本如上,現在我們從原始碼的角度來看一下,ArrayList.class檔案。
public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

get方法是陣列下標方式確定。
@SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
可以看出,呼叫iterator.next( )方法其實也是獲取ArrayList的陣列變數elementData,然後下面就根據下標來確定具體的值了,所以其實原理兩者是一樣的。

至於隱藏迭代器的寫法原理是如何大家可以看一下這篇文章,這裡就不詳述了:http://blog.csdn.net/a596620989/article/details/6930479。

那麼當迭代器不是陣列型別的時候,又是如何呢,來看LinkedList.class這個類。

並沒有想要的東西,我們再進去看一下node(index).item

不知道讀者注意到了沒有(沒有還不是眼瞎,這麼大的箭頭),對於連結串列的get方法,是通過遍歷連結串列的方法,如果說我們需要輸出第999和第1000的數時候,

先從0到999,然後再從0-1000,時間浪費就不是一點點了。回過頭了看一下迭代器的方式。

如果我們需要輸出1-1000各個位置的數,那麼由於連結串列是會保留下一個節點的指標,那麼假設現在找到第999個數,找第1000個數,只需要再執行一次

next.next.item就行了,所以效率更高。

如果有錯希望指出。

相關推薦

java foreachfor效率對比

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">由於本人在準備秋招,所以在看到foreach和for那個遍歷效率更高的問

java map集合如何效率

                             java map集合如何遍歷效率高   一、前言 1、在看 《阿里巴巴

java幾種集合速度對比(部落格園遷移)

  對集合操作進行簡單的進行測試速度,資料量20w,對map,list,set,array,queue進行遍歷測試時間對比。   先貼上一段對這些集合的介紹: 1.1 Set介面   存入Set的每個元素都必須是唯一的,Set介面不保證維護元素的次序

Java 陣列 迴圈

Java 陣列 陣列由多個元素組成,每個元素都具有相同資料型別 陣列命名時名稱與[ ]可以隨意排列,但宣告的二維陣列中第一個中括號中必須要有值,它代表的是在該二維陣列中有多少個一維陣列 Java中,

java關於集合的增強for循環(foreach)的使用

鍵值 sys import i++ 叠代器 iterator int 傳統 內部 java集合類的使用可以說是無處不在,總的我們可以將之分為三大塊,分別是從Collection接口延伸出的List、Set和以鍵值對形式作存儲的Map類型集合。 許多情況需要我們遍

for循環和foreach循環集合的效率比較

tro [] exceptio each循環 手冊 代碼 val str print 先上代碼 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.

forforeach和Iterator有什麽(效率)區別

都是 exp i++ ret new 遍歷序列 ... com font (問:1.for、foreach和Iterator遍歷有什麽區別    2.遍歷刪除ConcurrentModificationException異常。) 1.在形式上 for的形式是 f

forDictionary字典 解決foreach修改字典報集合已修改:可能無法執行列舉操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 {     class Program  

for(){}iterator()迴圈的區別

以下例子證明第一點  ①     public static void removeEvensVer2(List<Integer> lst)      {          for (Integer x : lst)              if (x % 2 == 0)            

iOS迴圈 效能對比for 、forin、NSEnumerator.....)

前段時間學習了NSEnumerator的遍歷方法 感覺很好用 於是總結一下iOS生涯當中 所用到的遍歷。好奇的簡單了做了一個效率對比。沒想到最NB的居然是它。1、for迴圈for迴圈不做過多介紹,入門常用、可以正序、逆序查詢資料。也常用於建立九宮格。貼兩行程式碼自己體會。//

java數組的for

stat java數組 main static sys system length [] sta class ArrayDome { public static void main(String[] args) { int[] arr =

foreach 實現 MyBatis 集合批量操作資料

一、寫在前面 MyBatis 動態 SQL 的一個常用的操作需求是對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。foreach允許你指定一個集合,宣告可以在元素體內使用的集合項(item)和索引(index)變數。foreach 是動態 SQL 中

sqlite3樹形結構效率對照測試

效果 fcm 技術 art 一個點 解析 got log 創建數據庫 sqlite3樹形結構遍歷效率對照測試 一、緣起 項目數據結構:本人從事安防行業,視頻監控領域。項目中會遇到監控點位的組織機構劃分、暫時劃分的巡邏點位等。這些相機點位、連同組織機構,它們在邏輯

Map、List、Set在Java中的各種方法

try one out 循環 java light size i++ pre 一、Map的4種遍歷 Map<String, String> map = new HashMap<String, String>(); map.put("姓名", "

foreach和map

修改 fun .html htm 自己 bsp 原來 console fine 參考網址:http://www.cnblogs.com/jocyci/p/5508279.html 1.foreach : 理論上這個方法是沒有返回值的,僅僅是遍歷數組中的每一項,不對原來數組

Java中List集合的三種方式

asn tex iter for nbsp next next() ray string 首先創建一個List集合: List<String> list = new ArrayList<String>();list.add("name"); list

vue.js 1.0中用v-for出的li中的@click事件在移動端無效

play 需要 data class import child exp ons rec 在vue.js使用v-for遍歷出的li中的@click事件在移動端無效,在網頁端可以執行,代碼如下 <template> <div class="rating-

Java之數組

public int ack each [] ava print 數組 for 1 package basic; 2 //數組遍歷方法 3 public class ForEach { 4 5 public static void main(Str

java iffor循環的題

-1 g++ 循環 bre else == for循環 for 質數 //打印一個4*5的空心長方形 /* for (int i = 0; i < 5;i++ ) { if (i == 0 | i == 4) {

java 數組的 異常

越界 clas dem 打印 arr null 取數 ati 指針 在操作數組時,經常需要依次訪問數組中的每個元素,這種操作稱作數組的遍歷 1 public class ArrayDemo04 { 2 public static void main(String[