Kotlin for vs Java for
First of all, the conclusion, 先说结论
- kotlin, if NOT the enhanced for for(i in integers), the others will NOT verify the condition every time.
kotlin 中除了加强型 for 循环,其他的一旦范围确定,不会每次去验证条件。 - java, for, verify the confition every time.
每次都去验证条件。
Java - Talk is cheap, show me your code
- We have a list of integers [1,2,3], we want to add its length times 7 in it. The result is [1,2,3,7,7,7]
final List<Integer> integers = new ArrayList<>(List.of(1, 2, 3));
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
for(int index =0;index < integers.size();index++){
integers.add(7);
}
integers.size()
change after each add, so the for loop will never end.
链表的大小在每次 add 之后都会变大,所以当前的 index 永远不会小于链表的大小
final List<Integer> integers = new ArrayList<>(List.of(1, 2, 3));
// Exception in thread "main" java.util.ConcurrentModificationException
for (int integer:integers){
integers.add(7);
}
- enhanced for NOT used for add/remove, if remove use iterator
加强型 for 循环不能用来添加或删除
final List<Integer> integers = new ArrayList<>(List.of(1, 2, 3));
final Iterator<Integer> iterator = integers.iterator();
// replace with enhanced for
while (iterator.hasNext()){
iterator.next();
// Exception in thread "main" java.util.ConcurrentModificationException
integers.add(7);
}
- can NOT add element in orginal list within a iterator loop. But can remove element through iterator
在迭代器中不能像原来的链表中加东西,但可以通过迭代器删除元素。
final List<Integer> integers = new ArrayList<>(List.of(1, 2, 3));
final int currentSize = integers.size();
for (int index = 0; index < currentSize; index++) {
integers.add(7);
}
- the right way to do it.
When use Java for
, think about the end condition!
Kotlin - Talk is cheap, show me your code
val mutableList = mutableListOf(1, 2, 3)
// Exception in thread "main" java.util.ConcurrentModificationException
for (i in mutableList) {
mutableList.add(7)
}
- same as Java enhanced for
val mutableList = mutableListOf(1, 2, 3)
// 1 2 3 7 7 7
for (i in 0 until mutableList.size) {
mutableList.add(7)
}
mutableList.size
is checked once. For each time, the mutableList size change won't impact the for loop.
for 循环只取了链表的初始大小,然后链表改变不影响 for 循环
val mutableList = mutableListOf(1, 2, 3)
// 1 2 3 7 7 7
for (i in mutableList.indices) {
mutableList.add(7)
}
mutableList.indices
is checked once. For each time, the mutableList size change won't impact the for loop.
for 循环只取了链表的所有初始下标,然后链表改变不影响 for 循环
Kotlin for loop example
val immutableList = listOf(1, 2, 3, 4, 5)
// same as java enhanced for, can not modify original collection
println("for (element in immutableList) 12345")
for (element in immutableList) {
print(element)
}
println(" for (i in immutableList.indices) 01234")
for (i in immutableList.indices) {
print(i)
}
// ==================include=======================
println(" for (i in 0..3) ==> 0123")
for (i in 0..3) {
print(i)
}
println("for (i in IntRange(0,3)) ==> 0123")
for (i in IntRange(0, 3)) {
print(i)
}
println("for (i in IntRange(0,10) step 2) ==> 0246810")
for (i in IntRange(0, 10) step 2) {
print(i)
}
println("for(i in 3 downTo 0) ==> 3210")
for (i in 3 downTo 0) {
print(i)
}
// ==================exclude=======================
println("for (i in 0 until 3) ==> 012")
for (i in 0 until 3) {
print(i)
}