Kotlin (基本類型)

基本類型

在 Kotlin 中查吊,所有的東西都是對象谐区,這就意味著我們可以調用任何變量的成員函數和屬性。一些類型是內建的逻卖,它們的實現是優(yōu)化過的宋列,但對用戶來說它們就像普通的類一樣。在這節(jié)中评也,我們將會講到大多數的類型:數值炼杖,字符灭返,布爾,以及數組坤邪。

數值

Kotlin 處理數值的方法和 java 很相似熙含,但不是完全一樣。比如艇纺,不存在隱式轉換數值的精度怎静,并且在字面上有一些小小的不同。

Kotlin 提供了如下內建數值類型(和 java 很相似):

類型 位寬
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意字符在 Kotlin 中不是數值類型

字面值常量

主要是以下幾種字面值常量:

--十進制數值: 123
--長整型要加大寫 L : 123L
--16進制:0x0f
--二進制:0b00001011

注意不支持8進制

Kotlin 也支持傳統(tǒng)的浮點數表示:

-- 默認雙精度浮點數(Double) : 123.5 , 123.5e10
-- 單精度浮點數(Float)要添加 fF :123.5f

數值常量中可以添加下劃線分割(1.1版本新特性)

您可以使用下劃線增加數值常量的可讀性:

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

表示

在 java 平臺上黔衡,數值被 JVM 虛擬機以字節(jié)碼的方式物理存儲的蚓聘,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型。在后者中數值是裝箱過的盟劫。

注意裝箱過的數值是不保留特征的:

val a: Int = 10000
print (a === a ) // 打印 'true'
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'

== 比較的是值 ===比較的是地址值

顯式轉換

數據類型不同不能進行比較,如果比較需要變更數據類型

由于不同的表示,低精度類型不是高精度類型的子類型侣签。如果是的話我們就會碰到下面這樣的麻煩了

// 這是些偽代碼氯材,不能編譯的
val a: Int? =1 // 一個裝箱過的 Int (java.lang.Integer)
val b: Long? = a // 一個隱式裝箱的 Long (java.lang.Long)
print( a == b )// 很驚訝吧 這次打印出的是 'false' 這是由于 Long 類型的 equals() 只有和 Long 比較才會相同

因此不止是特征會丟失,有時候連值相等都會悄悄失效硝岗。

所以,低精度類型是不會隱式轉換為高精度類型的袋毙。這意味著我們必須顯式轉換才能把 Byte 賦值給 Int

val b: Byte = 1 // OK, 字面值常量會被靜態(tài)檢查
val i: Int = b // ERROR

我們可以通過顯式轉換把數值類型提升

val i: Int = b.toInt() // 顯式轉換

每個數值類型都支持下面的轉換:

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

隱式轉換一般情況下是不容易被發(fā)覺的型檀,因為我們使用了上下文推斷出類型,并且算術運算會為合適的轉換進行重載听盖,比如

val l = 1.toLong + 1 // Long  + Int => Long

運算符

Kotlin支持標準的算術運算表達式胀溺,這些運算符被聲明為相應類的成員(但是編譯器將調用優(yōu)化到相應的指令)。參看運算符重載皆看。

至于位運算仓坞,Kotlin 并沒有提供特殊的操作符,只是提供了命名函數腰吟,可以采用中綴形式調用无埃,比如:

val x = (1 shl 2) and 0x000FF000

下面是全部的位運算操作符(只可以用在 IntLong 類型):

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

字符

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

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

字符是由單引號包裹的:'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() //顯示轉換為數值類型
}

和數值類型一樣,需要一個可空引用時震捣,字符會被裝箱荔棉。特性不會被裝箱保留闹炉。

布爾值

布爾值只有 true 或者 false

如果需要一個可空引用,將會對布爾值裝箱

布爾值的內建操作包括

|| – 短路或

&& – 短路與

! - 取反

數組

數組在 Kotlin 中由 Array 類表示润樱,有 getset (通過運算符重載為[] )方法渣触,和 size 屬性,以及一些常用的函數:

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

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

給庫函數 arrayOf() 傳遞每一項的值來創(chuàng)建Array祥国,arrayOf(1, 2, 3) 創(chuàng)建了一個[1, 2, 3] 這樣的數組昵观。也可以使用庫函數 arrayOfNulls() 創(chuàng)建一個指定大小的空Array。

另一種方式就是使用工廠函數舌稀,接受一個數組大小參數以及一個可以根據給定索引創(chuàng)建初始值的函數:

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

像我們上面提到的啊犬,[] 操作符表示調用 get() set() 函數

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

Kotlin 有專門的類來表示原始類型從而避免過度裝箱: ByteArray, ShortArray, IntArray 等等觉至。這些類與 Array 沒有繼承關系,但它們有一樣的方法與屬性睡腿。每個都有對應的庫函數:

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

字符串

字符串是由 String 表示的语御。字符串是不變的。字符串的元素可以通過索引操作讀取: s[i] 席怪。字符串可以用 for 循環(huán)迭代:

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

字符串字面值

Kotlin 有兩種類型的字符串字面值:一種是可以帶轉義符的应闯,一種是可以包含新行以及任意文本的。帶轉義符的 string 很像 java 的 string:

val s = "Hello World!\n"

轉義是使用傳統(tǒng)的反斜線的方式挂捻。參見Characters碉纺,查看支持的轉義序列。

整行String 是由三個引號包裹的("""),不可以包含轉義符但可 以包含其它字符:

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

你可以通過 trim-margin() 函數移除空格:

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

默認采用|標注起始前綴刻撒,也可以傳遞其它的字符做起始前綴骨田,比如trimMargin(">")

字符串模板

字符串可以包含模板表達式,即可求值的代碼片段声怔,并將其結果連接到字符串中态贤。模板表達式由 $ 開始并包含另一個簡單的名稱:

val i = 10
val s = "i = $i" // 求值為 "i = 10"

或者是一個帶大括號的表達式:

val s = "abc"
val str = "$s.length is ${s.length}" // 結果為 "abc.length is 3"

模板既可以原始字符串中使用,也可以在轉義字符串中使用醋火。如果需要在原始字符串(不支持反斜杠轉義)中表示一個文字$字符悠汽,那么可以使用以下語法:

val price = """
${'$'}9.99
"""

筆者水平有限,若有錯漏芥驳,歡迎指正介粘,如果轉載以及CV操作,請務必注明出處晚树,謝謝姻采!
本文參考了以下博客:
https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/Basics/Basic-Types.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子慨亲,更是在濱河造成了極大的恐慌婚瓜,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刑棵,死亡現場離奇詭異巴刻,居然都是意外死亡,警方通過查閱死者的電腦和手機蛉签,發(fā)現死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門胡陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碍舍,你說我怎么就攤上這事柠座。” “怎么了片橡?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵妈经,是天一觀的道長。 經常有香客問我捧书,道長吹泡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任经瓷,我火速辦了婚禮爆哑,結果婚禮上,老公的妹妹穿的比我還像新娘舆吮。我一直安慰自己泪漂,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布歪泳。 她就那樣靜靜地躺著,像睡著了一般露筒。 火紅的嫁衣襯著肌膚如雪呐伞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天慎式,我揣著相機與錄音伶氢,去河邊找鬼。 笑死瘪吏,一個胖子當著我的面吹牛癣防,可吹牛的內容都是我干的。 我是一名探鬼主播掌眠,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼蕾盯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓝丙?” 一聲冷哼從身側響起级遭,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤望拖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挫鸽,有當地人在樹林里發(fā)現了一具尸體说敏,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年丢郊,在試婚紗的時候發(fā)現自己被綠了盔沫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫匾,死狀恐怖架诞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情婿牍,我是刑警寧澤侈贷,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站等脂,受9級特大地震影響俏蛮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜上遥,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一搏屑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粉楚,春花似錦辣恋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燃异,卻和暖如春携狭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回俐。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工逛腿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仅颇。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓单默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忘瓦。 傳聞我的和親對象是個殘疾皇子搁廓,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容