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.class檔案。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)); }
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
get方法是陣列下標方式確定。
可以看出,呼叫iterator.next( )方法其實也是獲取ArrayList的陣列變數elementData,然後下面就根據下標來確定具體的值了,所以其實原理兩者是一樣的。@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]; }
至於隱藏迭代器的寫法原理是如何大家可以看一下這篇文章,這裡就不詳述了: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 foreach與for遍歷效率對比
<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.
for、foreach和Iterator遍歷有什麽(效率)區別
都是 exp i++ ret new 遍歷序列 ... com font (問:1.for、foreach和Iterator遍歷有什麽區別 2.遍歷刪除ConcurrentModificationException異常。) 1.在形式上 for的形式是 f
for遍歷Dictionary字典 解決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 if與for循環的題
-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[