赣州新闻视频,江北seo综合优化外包,做设计用哪个素材网站,网站开发答辩知识点我们要遍历一个数组、一个列表#xff0c;经常会用到kotlin的 for in 语法#xff0c;但是 for in 是不是有序的呢#xff1f;forEach是不是有序的呢#xff1f;这就需要看一下它们的本质了。
数组的 for in
// 调用#xff1a;
val arr arrayOf(1, 2, 3)
for (ele in …我们要遍历一个数组、一个列表经常会用到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循环是从下标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): ListT if (elements.size 0) elements.asList() else emptyList()// 这里有个expect找到对应的actual
public expect fun T Arrayout T.asList(): ListT// 对应的actual
public actual fun T Arrayout T.asList(): ListT {return ArraysUtilJVM.asList(this)
}// 最终调用了Arrays.asList(array)
class ArraysUtilJVM {static T ListT asList(T[] array) {return Arrays.asList(array);}
}public class Arrays {// 从这里看到最终拿到的list是 Arrays 类中的 ArrayList// 然后我们找到里面的 iterator() 方法public static T ListT asList(T... a) {return new ArrayList(a);}private static class ArrayListE extends AbstractListEimplements RandomAccess, java.io.Serializable{private final E[] a;Overridepublic IteratorE iterator() {// 最终得到的iterator是ArrayItr// 这里的a是一个数组也就是我们一开始传进来的1,2,3return new ArrayItr(a);}}private static class ArrayItrE implements IteratorE {private int cursor;private final E[] a;ArrayItr(E[] a) {this.a a;}Overridepublic boolean hasNext() {return cursor a.length;}Overridepublic 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 Arrayout 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 IterableT.forEach(action: (T) - Unit): Unit {for (element in this) action(element)
}