Kotlin學習(四): 基本類型(Basic Types)

Versatile

本文是學習Kotlin的基本類型,Kotlin的基本類型與Java有一些不同,例如整數類型,Java是int表示,而Kotlin是Int表示;例如布爾類型,Java是boolean表示,而Kotlin是用Boolean表示。

在 Kotlin 中,所有變量的成員方法和屬性都是一個對象,我們可以在任何變量上調用成員函數和屬性。
在本文中,將會講解經常被使用的類型:NumbersCharactersBooleansArraysStrings

Numbers(數值)

Kotlin處理數值的方式與Java類似,單又不完全相同,例如,數值沒有隱式擴展轉換,在默寫情況下文字也略有不同。
Kotlin 提供了如下內建數值類型(與Java類似)

Type Bit width(字寬)
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意:字符不是kotlin中的數值類型

字面常量(Literal Constants)

對于整數值,有以下幾種常量

  • 整型: 123
    • 長整型要加 L: 123L
  • 16進制: 0x0F
  • 二進制: 0b00001011

對于浮點數值

  • Doubles類型: 123.5, 123.5e10
  • Floats類型要加 f or F: 123.5f

注意:不支持8進制

數值中的下劃線(1.1版開始)

Java8支持數值使用下劃線類分割數字分組,可以使用下劃線使數字常量更易讀:

val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

等同于

1000000
ffecde5e
11010010011010011001010010010010

表示法(Representation)

在Java平臺上,數值被 JVM 虛擬機以字節碼的方式物理存儲的,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型。

val a: Int = 10000
print(a === a) // 打印'true' ,與Java的‘===’一樣
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // 打印`false`

另一方面,值是相等的

val a: Int = 10000
print(a == a) // 打印 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // 打印 'true'

顯式轉換(Explicit Conversions)

由于不同的表示,短類型不是長類型的子類型

//這是些偽代碼,不能編譯的
val a: Int? =1 // Int (java.lang.Integer)
val b: Long? = a // Long (java.lang.Long)
print( a == b ) // 打印 'false' ,由于 Long 類型的 equals() 只有和 Long 比較才會相同

短類型是不會隱式(自動)轉換為長類型的,需要顯示(手動)轉換才行

val b: Byte = 1 // 
val i: Int = b // 錯誤,不能自動轉換

改為顯示(手動)轉換

val i: Int = b.toInt() // 成功

數值類型支持的轉換有下面幾種

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

Kotlin會自動轉換類型的,比如

val l = 1.toLong + 1 // Long  + Int => Long,自動轉換成Long類型

運算符(Operations)

Kotlin支持標準的算術運算表達式,這些運算符被聲明為相應類的成員。
對于位操作,沒有特殊的字符,只是命名的函數可以以中綴形式調用,例如

val x = (1 shl 2) and 0x000FF000

支持的位運算操作符有(僅適用于IntLong類型)

  • shl(bits) – 帶符號左移 (相當于 Java的 <<)
  • shr(bits) – 帶符號右移 (相當于 Java的 >>)
  • ushr(bits) – 無符號右移 (相當于 Java的 >>>)
  • and(bits) – 按位與
  • or(bits) – 按位或
  • xor(bits) – 按位異或
  • inv() – 按位翻轉

Characters(字符)

字符類型用 Char 表示,不能直接當做數值來使用

fun check(c: Char) {
    if (c == 1) { // 錯誤:類型不匹配
        // ...
    }
}

字符文字用單引號括起來:'1',可以使用反斜杠轉義特殊字符,支持以下轉義序列:\ t,\ b,\ n,\ r,',\“,\和\ $。
要編碼任何其他字符,使用Unicode轉義序列語法:'\ uFF00'。

下面是將字符類型顯示(手動)轉換成Int類型

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9') 
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 顯示轉換為數值類型
}

Boleans(布爾值)

Kotlin的Boolean同Java的boolean類型一樣,只有truefalse

Boolean的操作同Java一樣

  • || – 或者
  • && – 并且
  • ! - 非

Arrays(數組)

Kotlin中的數組由Array表示,通過[]調用getset方法,支持size屬性,以及其他,下面是Array代碼

class Array<T> private constructor() {
    val size: Int
    fun get(index: Int): T
    fun set(index: Int, value: T): Unit

    fun iterator(): Iterator<T>
    // ...
}

可以使用 arrayOf() 創建Array,arrayOf(1, 2, 3) 創建了一個[1, 2, 3] 的數組。
可以使用 arrayOfNulls() 創建一個指定大小的空Array。

另外也可以使用工廠函數,該函數采用數組大小??和函數,該函數可以返回每個數組元素的索引的初始值

// 創建 Array<String> 內容為 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

注意:和 java 不一樣,arrays 在 kotlin 中是不可變的。這意味這 kotlin 不允許我們把 Array<String>轉為 Array<Any>,這樣就阻止了可能的運行時錯誤(但可以用 Array<outAny>)

Kotlin 有專門的類來表示原始類型: ByteArray, ShortArray, IntArray 等等。這些類與Array類沒有繼承關系,但它們具有相同的方法和屬性集。也有相應的工廠功能

val x: IntArray = intArrayOf(1, 2, 3) // 創建一個Int類型的Array
x[0] = x[1] + x[2]

Strings(字符串)

字符串由類型String表示,字符串是不可變的。字符串的元素是可以通過索引操作訪問的字符:s [i]。一個字符串可以用一個for循環迭代

for (c in str) {
    println(c)
}

字符串字面量(String Literals)

Kotlin 有兩種類型的 String :一種是可以帶分割符的,一種是可以包含新行以及任意文本的。
帶分割符的 String 與Java 的 String類似

val s = "Hello World!\n"

如果String 是由三個引號包裹的("""),不可以包含分割符但可以包含其它字符:

val text = """
    for (c in "foo")
        print(c)
"""

可以使用trimMargin()來刪除空格

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

默認為|用作邊距前綴,可以選擇另一個字符并將其作為參數傳遞,如trimMargin(“>”)

字符串模版(String Templates)

字符串可以包含模板表達式,前面介紹了可以使用'${}'模版表達式

val s = "abc"
val str = "$s.length is ${s.length}" //識別為 "abc.length is 3"

還有一種是可以使用$模版表達式

val i = 10
val s = "i = $i" // 識別為 "i = 10"

模版表達式同樣可以用于由三個引號包裹的String,如下面的,${"$"}表示$符號

val price = """
${'$'}9.99
"""
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容