先看陣列型別的迭代器,拿arraylist來說吧。
arraylistlist = new arraylist<>();
//一般迭代器的寫法
for (iterator iterator = list.iterator(); iterator.hasnext();)
//for-each隱藏迭代器的寫法,避免混亂和出錯的可能,也更簡潔。
for (integer integer : list)
//for寫法
for(int i = 0; i < list.size(); i++)
遍歷寫法基本如上,現在我們從原始碼的角度來看一下,arraylist.class檔案。
public e get(int index)
get方法是陣列下標方式確定。
@suppresswarnings("unchecked")
public e next()
可以看出,呼叫iterator.next( )方法其實也是獲取arraylist的陣列變數elementdata,然後下面就根據下標來確定具體的值了,所以其實原理兩者是一樣的。
至於隱藏迭代器的寫法原理是如何大家可以看一下這篇文章,這裡就不詳述了:
那麼當迭代器不是陣列型別的時候,又是如何呢,來看linkedlist.class這個類。
並沒有想要的東西,我們再進去看一下node(index).item
不知道讀者注意到了沒有(沒有還不是眼瞎,這麼大的箭頭),對於鍊錶的get方法,是通過遍歷鍊錶的方法,如果說我們需要輸出第999和第1000的數時候,
先從0到999,然後再從0-1000,時間浪費就不是一點點了。回過頭了看一下迭代器的方式。
如果我們需要輸出1-1000各個位置的數,那麼由於鍊錶是會保留下乙個節點的指標,那麼假設現在找到第999個數,找第1000個數,只需要再執行一次
next.next.item就行了,所以效率更高。
如果有錯希望指出。
使用 Java foreach 遇到的問題
本來以為使用foreach就和使用for迴圈是一樣的效果,結果,卻遇到了意料之外的事情。先來看乙個例子 public void testarray system.out.println 輸出剛剛定義的陣列 for int x arr 通過索引給陣列元素賦值 system.out.println 通過...
java for each的使用場景和使用方法
使用for each的可以是乙個陣列,或者是實現iterable這個介面的物件 collection繼承了這個介面,所有集合類都可以使用for each 既然for迴圈能遍歷乙個陣列或者集合,那麼為什麼還會有乙個for each做遍歷呢?下面 參考了jdk1.8api 舉例說明 for迴圈遍歷每乙個...
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...