Java转Kotlin:基本数据类型

1,270 阅读4分钟

基本数据类型

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将显示该变量的推导类型。

Ctrl+Shift+P_1

Ctrl+Shift+P_2

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

3 Long类型标记

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
}

这个例子说明:

  1. 长类型转短类型,发生了数据截断;
  2. 调用转型方法的变量本身,并没有发生变化。

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 基本数据类型小结

基本数据类型小结