基本数据类型
1 Kotlin versus Java
长度 | Kotlin | 长度 | Java |
---|---|---|---|
1字节 | Boolean | 1字节 | boolean |
默认2字节,取决于编码方式 | Char | 取决于编码方式 | char/Character |
1字节 | Byte | 1字节 | byte/Byet |
2字节 | Short | 2字节 | short/Short |
4字节 | Int | 4字节 | int/Integer |
8字节 | Long | 8字节 | long/Long |
4字节 | Float | 4字节 | float/Float |
8字节 | Double | 8字节 | double/Double |
/ | String | / | String |
2 声明变量

Kotlin将类型名写在变量名之后有利于编译器进行类型推导
//Java
int a = 2;
final String b = "Hello Java";
等价于
//Kotlin
var a: Int = 2
val b: String = "Hello Kotlin"
因为类型推导的原因,数据类型可以省略不写,除非为了避免歧义
//Kotlin
var a = 2
val b = "Hello Kotlin"
对于变量a,Kotlin会默认理解成Int类型;如果希望声明成Short类型,则不要省略类型。
- 整型默认是Int类型
- 浮点型默认是Double类型
Ctrl+Shift+P : IntelliJ IDEA中选中一个变量,执行该快捷键,IDE将显示该变量的推导类型。


一个有意思的点:val和var都是三个字符,仅一个字符的差别便区分了变量的可读写性质,可以让程序员更好的养成写只读变量的习惯,而在Java中声明一个只读变量则需要写final。所以Kotlin写出来的代码往往更安全。
3 Long类型标记

在Java中,声明一个long类型的变量,在字面量末尾添加小写“l”或者“L”都可以,但是在Kotlin中,声明Long类型时,字面量后的标识都必须是大写的“L”。
注意!不要想当然认为Float类型的标识也必须是“F”,实际上Float类型的表示可以是”f“。Long类型之所以只能用”L“,完全是因为小写的”l“与数字”1“容易混淆,仅此而已。字面量后的标识符推荐统一大写。
//Kotlin
val b = 456F
fun main() {
println(b)//打印456.0
}
4 不允许隐式类型转换

在Kotlin中,无论是从长数据类型向短数据类型转换,还是从短数据类型向场数据类型转换,都必须调用toXxx()方法显式转换:
//Kotlin
val e: Int = 10
val f: Long = e.toLong()

来试一下长数据类型转成短数据类型,再转成长数据类型,看看是否有数据截断?
//Kotlin
//300 : 0000 0001 0010 1100 (Shrot)
// 44 : 0010 1100 (Byte)
fun main() {
var g: Short = 300
val h: Byte = g.toByte()
println("g:$g h:$h")//g:300 h:44
g = h.toShort()
println("g:$g h:$h")//g:44 h:44
}
这个例子说明:
- 长类型转短类型,发生了数据截断;
- 调用转型方法的变量本身,并没有发生变化。
5 无符号类型
有符号类型 | 无符号类型 | |
---|---|---|
字节 | Byte | UByte |
短整型 | Short | UShort |
整型 | Int | UInt |
长整型 | Long | ULong |
字符串 | String | String |
声明一个无符号整型:
//Kotlin
val c = 100U
val d = 100UL
@ExperimentalUnsignedTypes
val e:UByte = 100U
@ExperimentalUnsignedTypes
val f:UShort = 100U
直接在整数字面量后面加一个”U“/"u",默认为UInt类型;加一个”UL“/"uL",为ULong;对于UByte和UShort类型,不能从字面量自动推导。无符号类型目前是@ExperimentalUnsignedTypes阶段,暂时不深入讨论。
6 字符串
6.1 字符串模板
//Kotlin
fun main() {
val intVal = 1234
val stringVal = "Hello"
println("intVal is $intVal and stringVal's length is ${stringVal.length}")
}
上述代码将打印:
intVal is 1234 and stringVal's length is 5.
注意大括号的使用,避免编译器产生歧义。
6.2 RawString和trimIndent()方法
//Kotlin
fun main() {
println("""
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
""".trimIndent())
}
- 三对双引号,用于包含多行字符串;
- 多行字符串将按照原样被打印;
- trimIndent()方法可以忽略掉多行字符串公共的缩进。
以上代码将打印
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
6.3 声明字符串变量
//Kotlin
//栈上
val a = "Hello String"
//堆上
val b = String("Hello String".toCharArray())
6.4 字符串比较
//Kotlin
val a = "12345"
val b = String("12345".toCharArray())
fun main() {
println(a == b)//比较内容 true
println(a.equals(b))//比较内容,为了兼容Java写法,编译器会建议替换成“==” true
println(a === b)//比较引用 false
}
注意!这与Java是不同的。
7 基本数据类型小结
