增强型的for循环linkedlist_LinkedList给我深深的上了节for增强的课
前言:標(biāo)題既然這么說,就證明它的確坑了我一把。在平時(shí)習(xí)慣使用了普通的for循環(huán)。所以在寫遍歷的時(shí)候也是經(jīng)常使用這種。然而一味的使用它,給我?guī)砹寺闊m?xiàng)目開發(fā)中,有一個(gè)需求是插入多,讀少的需求。想著這不是LinkedList的特性嗎,就果斷的使用了它。然而不久,同事反饋這個(gè)業(yè)務(wù)在讀取時(shí),時(shí)間特別長(zhǎng)。開始想本來LinkedList讀就慢嘛,后來一個(gè)公司一個(gè)大佬看見了我這部分的代碼,這個(gè)地方慢的另外一個(gè)原因是因?yàn)槲沂褂昧似胀ǖ膄or循環(huán)。應(yīng)該使用for增強(qiáng)形式。
這里小編提一個(gè)疑問哈:“java中哪些數(shù)據(jù)類型可以用于增強(qiáng)for循環(huán)”?這是在群里看見的一個(gè)面試題,網(wǎng)上沒有找到答案,我認(rèn)為是基本類型和引用類型都可以,還有就是實(shí)現(xiàn)了Iterable接口的,比如集合。有知道答案的可以在下面評(píng)論下。不勝感激。
步入正題:首先看下在數(shù)組中有什么差異
未編譯代碼,也就是我們程序員寫的
使用jad查看反編譯代碼
jad命令
jad反編譯代碼
從反編譯代碼中,可以看出數(shù)組中沒有什么差別。基本一致。只不過for增強(qiáng)寫法上簡(jiǎn)單明了些。性能上沒有什么差別。
在看下在集合中有什么差異
未編譯代碼集合
jad反編譯代碼
可以看得出普通for和for增強(qiáng)使用了2種不一樣的方式實(shí)現(xiàn),那么那個(gè)性能更好呢。
arraylist測(cè)試
測(cè)試了幾次,發(fā)現(xiàn)執(zhí)行時(shí)間差不多,并且普通for還比for增強(qiáng)快了些。那在看看LinkedList
LinkedList測(cè)試
性能上立馬體現(xiàn)出來了。普通for慢很多。看過arraylist和LinkedList源碼的肯定知道八九不離十了。我這里就說下結(jié)論:需要循環(huán)數(shù)組結(jié)構(gòu)的數(shù)據(jù)時(shí),建議使用普通for循環(huán),因?yàn)閒or循環(huán)采用下標(biāo)訪問,需要循環(huán)鏈表結(jié)構(gòu)的數(shù)據(jù)時(shí),一定不要使用普通for循環(huán),這種做法很糟糕,數(shù)據(jù)量大的時(shí)候有可能會(huì)導(dǎo)致系統(tǒng)崩潰。
那for增強(qiáng)有沒有什么缺點(diǎn)呢,肯定是有的,上面的代碼中for增強(qiáng)最終會(huì)變成Iterator遍歷。Iterator的缺點(diǎn)也就是它的缺點(diǎn)了。如在迭代的過程中,除了使用迭代器(如:Iterator.remove()方法)對(duì)集合增刪元素外,是不允許直接對(duì)集合進(jìn)行增刪操作。否則將會(huì)拋出 ConcurrentModificationException異常。
for增強(qiáng)缺點(diǎn)
總結(jié):
無論是在數(shù)組中還是在集合中,加強(qiáng)型for循環(huán)都是它們各自的普通for循環(huán)的一種“簡(jiǎn)寫方式”,即兩者意思上是等價(jià)的,但前者方便簡(jiǎn)單,建議多使用。for增強(qiáng)不能完全代替普通for循環(huán),因?yàn)閒or增強(qiáng)有一定的局限性。(如數(shù)組中不能替換相應(yīng)索引下的值;集合中不能對(duì)集合進(jìn)行增刪操作、也不能獲取索引)for增強(qiáng)只能用于數(shù)組、Iterable類型(包括集合)。集合中的for增強(qiáng)本質(zhì)上使用了Ierator迭代器,所以要注意Itrator迭代陷阱。
總結(jié)
以上是生活随笔為你收集整理的增强型的for循环linkedlist_LinkedList给我深深的上了节for增强的课的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动加域脚本,bat和vbs配合使用,使
- 下一篇: 各种IPTV系统整体架构参考图