一、基本类型
1.1 与Java中基本类型匹配的类型
在Java中,有8中基本类型,还有8种基本类型对应的包装,而在Kotlin中只有包装类型,没有原始类型。
| 类型 | 数据的字节数 | Java中的基本类型 | Java中的包装类型 | Kotlin中的包装类型 |
|---|---|---|---|---|
| 字节 | 1 | byte | Byte | Byte |
| 短整型 | 2 | short | Short | Short |
| 整型 | 4 | int | lnteger | Int |
| 长整型 | 8 | long | Long | Long |
| 单精度浮点型 | 4 | float | Float | Float |
| 双精度浮点型 | 8 | double | Double | Double |
| 字符型 | 2 | char | Character | Char |
| 布尔型 | 1 | boolean | Boolean | Boolean |
1.2 无符号类型
在Java语言中没有无符号类型,而在Kotlin1.3中则添加了UByte、UShort、UInt、ULong等无符号类型,这是Kotlin兼容Native语言(C/C++)的一个产物,在JVM中也可以用,只是在不同范围的表示上有差异,比如val us: UShort变量,当us在0-32768之间时,class文件中仍然使用和short一样的表示方式,而us在32769-65536时,class文件中使用[-32768, 0)之间来表示。
二、声明变量
2.1 val和var


val:修饰只读变量,变量只能被赋值一次,类似于Java中final的变量。
var:修饰可读写变量。
注意:在Java Effictive中,推荐有限使用final修饰变量,用来避免没有意义的修改,引发程序错误,在Kotlin中也一样,优先使用val修饰变量。
2.2 自动类型推导
Kotlin变量声明时类型放在变量名后面,是为了方便类型推导,如果能够成功推导类型,可以直接将类型去掉。
2.3 类型标记
在Java中,数字字面量默认是int类型,long类型的字面量需要在数字末尾加上大写或者小写的“L”,通常情况下,小写的“L”与数字“1”十分相似,不易区分。
在Kotlin的设计理念中,特别排斥一些存在二义性或者含糊不清的东西,所以Kotlin禁止定义长整型时使用小写的“L”,否则将会编译错误。 
2.4 显示的数值类型转换
在C/C++/Java等语言中,都允许数值的隐式类型转换,由于不同类型所占的空间不同,大空间的类型转为小空间类型时会发生数据截断,所以可能会存在安全问题。而Kotlin中,无论类型转换是否是安全的,都不允许隐式类型转换,都必须显示的用toType这类类型转换函数来进行转换。
2.5 字符串
- 在Java中,“==”比较的是引用,equels才是比较的值,而在Kotlin中,“==”比较的是值,“===”比较的是引用。
- 在Kotlin中,使用””来包裹字符串,可以使用字符串模板来简化字符串的apend操作。
- 在Kotlin中,使用”””来包裹RawString,使用rimIndent()方法可以去除RawString中公有的前置符号。

值得注意的一个细节:由于javac的源码中,对字符串字面量长度在编译时进行了限制,length大于65534直接抛出异常,所以Java字符串字面量长度最长为65534。可能是兼容性的原因,各个版本的Java都没有对其进行修复。在kotlinc源码中修复了这个问题,所以Kotlin中字符串字面量长度最长为65536。

网上有部分博客对65534这个数字的解释是,javac采用unsigned short来存储字符串字面量长度,最后2位为了对不同字符串进行分隔,设计为空(类似于C/C++字符串的设计),这种说法是错误的。
