以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個(gè)人學(xué)習(xí)
for循環(huán)
- for需要獲取容器大小,如果計(jì)算大小比較耗時(shí)麸恍,那么for循環(huán)效率會(huì)很低。
- for循環(huán)是根據(jù)容器大小防止越界搀矫,因此每次循環(huán)需要進(jìn)行一次比較抹沪。
foreach
ForEach 編譯成字節(jié)碼之后,使用的是迭代器實(shí)現(xiàn)的瓤球,所以本質(zhì)上是通過迭代器遍歷的融欧。
將foreach代碼反編譯后得到的代碼如下:
public static void testForEach(List list) {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object t = iterator.next();
Object obj = t;
}
}
可以看到,只比迭代器遍歷多了生成中間變量這一步卦羡,因此性能也略微下降了一些噪馏。
- 無需獲取容器大小。
- 需要?jiǎng)?chuàng)建額外的迭代器變量绿饵。
- 遍歷期間得到的是對(duì)象欠肾,沒有索引位置信息,因此沒辦法將指定索引位置對(duì)象替換為新對(duì)象拟赊,也就是不能賦值刺桃。
效率對(duì)比
由于for循環(huán)的特性,每次循環(huán)都會(huì)進(jìn)行比較吸祟,所以效率上不如foreach瑟慈。
但這個(gè)結(jié)論并不是絕對(duì)的,選擇for或者foreach欢搜,還要考慮幾點(diǎn):
- 如果只是讀數(shù)據(jù)封豪,優(yōu)先選擇foreach谴轮,因?yàn)樾矢叱次粒掖a簡(jiǎn)單,方便第步;
- 如果要寫數(shù)據(jù)疮装,即替換指定索引位置處的對(duì)象,就只能選擇for了粘都。