基础篇
基本类型
1.数字
数字与java中基本相同,主要是下面几点不同:
- kotlin对于数字没有隐式扩展转换(如从int转为long)
- 在kotlin中字符不是数字
2.表示方式
kotlin会把数字存储为jvm的原生类型,但是只有在需要可空引用或泛型时数字会被装箱。
但是这里存在着一个坑:当取值在[-128, 127]之间时不会被装箱,而在这之外的int数字才会被装箱,如下
1 | val b:Int = 5 // 被编译为 short b = 5; |
这是因为JVM把[-128,127]的所有int数字的装箱全部缓存了,任何指向这个范围的对象,都不可能被另外”创建”,应该是为了缓存最常用的数字以节省性能吧。
3.在kotlin中万物皆对象,=== 是比较对象之间的地址是否相等, == 是比较对象的大小是否相等。
4.数据类型转换:需要使用toByte(),toInt之类的转换。
5.浮点数比较有些很棒的特性:
- 区间实例以及区间检测:a..b、 x in a..b、 x !in a..b。 这里可以使用两个点来表示,甚至比python更方便。
- NaN与其自身相等,而且比任何其他元素都大
6.字符Char不能直接当做数字,用单引号,与java一样。并且当需要可空引用时也会被装箱。
7.数组:数组直接用Array
1 | // 一.已知所有元素 |
kotlin中数组是invariant的,不能把Array
8.字符串模板
字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。模板表达式以美元符($)开头,由一个简单的名字构成。如果要直接输出$符,只要不加变量即可:
1 | val s = "abc" |
控制流
1.if语句表达三元运算符:val max = if (a > b) a else b。与python中的表达十分相似:max = a if a > b else b
2.When表达式
when是一个加强的switch语句,可以作为语句也可以作为表达式。可以替代if else if链
1 | fun hasPrefix(x: Any) = when(x) { |
3.for可以循环任何提供了迭代器的对象。
4.Kotlin中任何表达式都可以用标签(label)来标记。标签的格式为标识符后跟@符号
1 | loop@ for (i in 1..100) { |
例子中的break可以直接跳出两重循环。同样的return,continue都可以使用这种操作。