Kotlin中 for in 是有序的嗎?forEach呢玷禽?

我們要遍歷一個數組、一個列表呀打,經常會用到kotlin的 for in 語法矢赁,但是 for in 是不是有序的呢?forEach是不是有序的呢贬丛?這就需要看一下它們的本質了撩银。

數組的 for in

// 調用:
val arr = arrayOf(1, 2, 3)
for (ele in arr) {
    println(ele)
}

反編譯成Java是個什么東西呢?

Integer[] arr = new Integer[]{1, 2, 3};
Integer[] var4 = arr;
int var5 = arr.length;

for(int var3 = 0; var3 < var5; ++var3) {
    int ele = var4[var3];
    System.out.println(ele);
}

總結:從Java代碼可以看出豺憔,實際就是一個普通的for循環(huán)额获,是從下標0開始遍歷到結束的,所以是有序的恭应。

列表的 for in

// 調用:
val list = listOf(1, 2, 3)
for (ele in list) {
    println(ele)
}

反編譯成Java:

List list = CollectionsKt.listOf(new Integer[]{1, 2, 3});
Iterator var3 = list.iterator();

while(var3.hasNext()) {
    int ele = ((Number)var3.next()).intValue();
    System.out.println(ele);
}

可以看出列表的for in是通過iterator實現的抄邀,和數組不一樣,那這個iterator遍歷是否是有序的呢昼榛?首先我們要知道這個iterator怎么來的:

// iterator 是通過調用 list.iterator() 得到的境肾,那么這個list又是什么呢?
Iterator var3 = list.iterator();

// list
List list = CollectionsKt.listOf(new Integer[]{1, 2, 3});

// list是通過數組elements.asList()得到的
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

// 這里有個expect胆屿,找到對應的actual
public expect fun <T> Array<out T>.asList(): List<T>

// 對應的actual
public actual fun <T> Array<out T>.asList(): List<T> {
    return ArraysUtilJVM.asList(this)
}

// 最終調用了Arrays.asList(array)
class ArraysUtilJVM {
    static <T> List<T> asList(T[] array) {
        return Arrays.asList(array);
    }
}

public class Arrays {
    
    // 從這里看到最終拿到的list是 Arrays 類中的 ArrayList
    // 然后我們找到里面的 iterator() 方法
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private final E[] a;

        @Override
        public Iterator<E> iterator() {
            // 最終得到的iterator是ArrayItr
            // 這里的a是一個數組奥喻,也就是我們一開始傳進來的1,2,3
            return new ArrayItr<>(a);
        }
    }

    private static class ArrayItr<E> implements Iterator<E> {
        private int cursor;
        private final E[] a;

        ArrayItr(E[] a) {
            this.a = a;
        }

        @Override
        public boolean hasNext() {
            return cursor < a.length;
        }

        @Override
        public E next() {
            int i = cursor;
            if (i >= a.length) {
                throw new NoSuchElementException();
            }
            cursor = i + 1;
            return a[i];
        }
    }
}

總結:列表的for in是通過iterator實現的,這個iterator是ArrayItr非迹,從里面的next()方法可以看出环鲤,這也是有序的,從cursor開始憎兽,cursor默認是0冷离,也就是從下標0開始遍歷吵冒。
注:這里只是分析了Arrays.ArrayList的iterator,具體的集合類需要具體分析酒朵,比如ArrayList桦锄、LinkedList等,不過從正常思維來看蔫耽,iterator是一個迭代器结耀,就應該有序的把數據一個一個丟出來。

數組的 forEach

// 調用:
val arr = arrayOf(1, 2, 3)
arr.forEach {
    println(it)
}

// 點進去forEach看:
// 其實也是調用了for in匙铡,所以也是有序的图甜。
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {
    for (element in this) action(element)
}

列表的 forEach

// 調用:
val list = listOf(1, 2, 3)
list.forEach {
    println(it)
}

// 點進去forEach看:
// 其實也是調用了for in,所以也是有序的鳖眼。
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
    for (element in this) action(element)
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末黑毅,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子钦讳,更是在濱河造成了極大的恐慌矿瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愿卒,死亡現場離奇詭異缚去,居然都是意外死亡,警方通過查閱死者的電腦和手機琼开,發(fā)現死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門易结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柜候,你說我怎么就攤上這事搞动。” “怎么了渣刷?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵鹦肿,是天一觀的道長。 經常有香客問我飞主,道長狮惜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任碌识,我火速辦了婚禮碾篡,結果婚禮上,老公的妹妹穿的比我還像新娘筏餐。我一直安慰自己开泽,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布魁瞪。 她就那樣靜靜地躺著穆律,像睡著了一般惠呼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峦耘,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天剔蹋,我揣著相機與錄音,去河邊找鬼辅髓。 笑死泣崩,一個胖子當著我的面吹牛,可吹牛的內容都是我干的洛口。 我是一名探鬼主播矫付,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼第焰!你這毒婦竟也來了买优?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挺举,失蹤者是張志新(化名)和其女友劉穎杀赢,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體湘纵,經...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡葵陵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了瞻佛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡娇钱,死狀恐怖伤柄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情文搂,我是刑警寧澤适刀,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站煤蹭,受9級特大地震影響笔喉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜硝皂,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一常挚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稽物,春花似錦奄毡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐秦。三九已至,卻和暖如春盗忱,著一層夾襖步出監(jiān)牢的瞬間酱床,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工趟佃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扇谣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓揖闸,卻偏偏與公主長得像揍堕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汤纸,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容