Kotlin-04.基本類型/數(shù)據(jù)類型(Basic Types)

官方文檔: http://kotlinlang.org/docs/reference/basic-types.html

1.介紹

與java不同,Kotlin所有數(shù)據(jù)類型都是對象翩迈,因此可在任何變量上調(diào)用成員函數(shù)和屬性(字段)!

2.數(shù)字

Kotlin 處理數(shù)字在某種程度上接近 Java堤魁,但是并不完全相同返十。
例如,對于數(shù)字沒有隱式把范圍變寬轉(zhuǎn)換(如在 Java 中 int 可以隱式轉(zhuǎn)換為long)盲链,
另外有些情況的字面值略有不同。

Kotlin 內(nèi)置數(shù)字類型:
    類型    位數(shù)
    Double  64
    Float   32
    Long    64
    Int     32
    Short   16
    Byte    8
注意在 Kotlin 中字符Char不能轉(zhuǎn)化為數(shù)字

3.數(shù)值字面常量

數(shù)值常量字面值表示:
    十進制:   123        
    十六進制: 0x0F
    二進制:   0b00001011
    注意: 不支持八進制(而java以0開頭表示八進制 07)

    Long 用大寫 L 標(biāo)記:    123L  
    Float 用 f 或 F 標(biāo)記:  123.5f
    double:              123.5瓢剿、123.5e10

自 Kotlin 1.1 起悠轩,用下劃線使數(shù)字更易讀:   
    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

4.數(shù)字自動裝箱-表示方式

Kotlin數(shù)字在虛擬機中是物理存儲為JVM原生類型,但如果是可null引用(有問號?)或者泛型對象,
那么kotlin數(shù)字就會自動裝箱(類似java包裝類,如int自動裝箱轉(zhuǎn)為Integer)

kotlin數(shù)字自動裝箱的實例:
    val a: Int = 10000       
    val boxA: Int? = a //有問號? 會自動裝箱
    val boxB: Int? = a //有問號? 會自動裝箱

kotlin三個等號===比較的是對象地址(引用),自動裝箱會生成新對象,兩個對象不同,輸出false
但是數(shù)值在-128和127之間時,自動裝箱會重用同一個對象(java緩存機制),輸出true
    print(boxA === boxB) //輸出false,如果數(shù)值在-128和127之間,輸出true
    
kotlin兩個等號==比較的是對象數(shù)值,兩個對象數(shù)值相同,輸出true
    print(boxA == boxB) //輸出true

5.顯式轉(zhuǎn)換

范圍較小數(shù)字類型不能隱式轉(zhuǎn)換為范圍較大類型火架。
    val b: Byte = 1 // 正確, 字面值是靜態(tài)檢測的
    val i: Int = b // 錯誤: 隱式擴寬
    val i: Int = b.toInt() // 正確: 顯式擴寬

每個數(shù)字類型支持如下類型轉(zhuǎn)換:
    toByte(): Byte
    toShort(): Short
    toInt(): Int
    toLong(): Long
    toFloat(): Float
    toDouble(): Double
    toChar(): Char

缺少隱式擴寬轉(zhuǎn)換是很少引人注意的忙菠,因為類型是從上下文推斷出來的,而算術(shù)運算會有重載做適當(dāng)擴寬轉(zhuǎn)換骡男,例如:
    val l = 1L + 3 // Long + Int => Long

6.位運算

Kotlin支持?jǐn)?shù)字運算的標(biāo)準(zhǔn)集傍睹,運算被定義為相應(yīng)的類成員(但編譯器會將函數(shù)調(diào)用優(yōu)化為相應(yīng)的指令)
對于按位運算,沒有特殊字符來表示吮炕,而只可用中綴方式調(diào)用函數(shù)访得,例如:
    val x = (1 shl 2) and 0x000FF000
以下是完整位運算列表(只用于 Int 和 Long):
    shl(bits) – 有符號左移 (Java 的 <<)
    shr(bits) – 有符號右移 (Java 的 >>)
    ushr(bits) – 無符號右移 (Java 的 >>>)
    and(bits) – 位與
    or(bits) – 位或
    xor(bits) – 位異或
    inv() – 位非

7.字符

字符用 Char 類型表示,不能直接當(dāng)作數(shù)字
    fun check(c: Char) {
        if (c == 1) { // 錯誤:類型不兼容
            // ……
        }
    }
字符字面值用單引號括起來: '1' 
特殊字符可以用反斜杠轉(zhuǎn)義: \t鳄炉、 \b搜骡、\n、\r记靡、\'、\"榕订、\\ 和 \$蜕便。 
編碼其他字符用 Unicode 轉(zhuǎn)義序列語法:'\uFF00'。

我們可以顯式把字符轉(zhuǎn)換為 Int 數(shù)字
fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 顯式轉(zhuǎn)換為數(shù)字
}
當(dāng)需要可null引用時两嘴,像數(shù)字一樣,字符也會被裝箱趣些。
裝箱操作不會保留同一性(同一對象)贰您。

8.布爾

布爾用 Boolean 類型表示,它有兩個值:true 和 false锦亦。
若需要可空引用布爾會被裝箱杠园。

9.數(shù)組

數(shù)組在 Kotlin 中使用 Array 類來表示,它定義了 get 和 set 函數(shù)(按照運算符重載約定轉(zhuǎn)變?yōu)?[])和 size 屬性

使用庫函數(shù) arrayOf() 來創(chuàng)建一個數(shù)組并傳遞元素值
    arrayOf(1, 2, 3) 創(chuàng)建了 array [1, 2, 3]
或  arrayOfNulls() 創(chuàng)建一個指定大小的null數(shù)組

使用接受數(shù)組大小和一個函數(shù)參數(shù)的工廠函數(shù)抛蚁,用作參數(shù)的函數(shù)能夠返回每個元素初始值:
    // 創(chuàng)建一個 Array<String> 初始化為 ["0", "1", "4", "9", "16"]
    val asc = Array(5, { i -> (i * i).toString() })

注意: 與 Java 不同的是瞧甩,Kotlin 中數(shù)組是不型變的(invariant)。
這意味著 Kotlin 不讓 Array<String> 賦值給 Array<Any>尘应,以防止可能的運行時失敽鸹ⅰ(但是可用 Array<out Any>)

還有無裝箱開銷的類表示原生類型數(shù)組: ByteArray、 ShortArray思灰、IntArray 等等,這些類和 Array 并沒有繼承關(guān)系歹颓,但是有同樣方法屬性油湖,相應(yīng)的工廠方法
    val x: IntArray = intArrayOf(1, 2, 3)
    x[0] = x[1] + x[2]

10.字符串

字符串用 String 類型表示,字符串是不可變的撤奸;
字符串元素可通過索引操作 s[i]
可用 for 循環(huán)迭代字符串:
    for (c in str) {
        println(c)
    }

1.字符串字面值

Kotlin 有兩種類型的字符串字面值: 
一是轉(zhuǎn)義字符串 可以有轉(zhuǎn)義字符,二是原始字符串 可以包含換行和任意文本

轉(zhuǎn)義字符串 很像 Java 字符串:
    val s = "Hello, world!\n"
    轉(zhuǎn)義采用傳統(tǒng)的反斜杠方式

原始字符串 使用三個引號 """ 括起來矢棚,
內(nèi)部沒有轉(zhuǎn)義并且可以包含換行和任何其他字符:
    val text = """
        for (c in "foo")
            print(c)
    """

你可以通過 trimMargin() 函數(shù)去除前導(dǎo)空格:
val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()
默認(rèn) | 用作邊界前綴府喳,可用其他字符作為參數(shù)傳入 trimMargin(">")

2.字符串模板

字符串可以包含模板表達式 ,即一些小段代碼兜粘,會求值并把結(jié)果合并到字符串中舱沧。 
模板表達式以美元符 $ 開頭

由一個簡單變量構(gòu)成:
    val i = 10
    val s = "i = $i" // 求值結(jié)果為 "i = 10"

用花括號{任意表達式}:
    val s = "abc"
    val str = "$s.length is ${s.length}" // 求值結(jié)果為 "abc.length is 3"
    
原始字符串和轉(zhuǎn)義字符串內(nèi)都支持模板偶洋。 
如果你需要在原生字符串中表示字面值 $ 字符(不支持反斜杠轉(zhuǎn)義):
    val price = """
                ${'$'}9.99
                """

簡書: http://www.reibang.com/p/084dec2793dc
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/73196341
GitHub博客: http://lioil.win/2017/06/13/Kotlin-basic-types.html
Coding博客: http://c.lioil.win/2017/06/13/Kotlin-basic-types.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玄窝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帽氓,更是在濱河造成了極大的恐慌俩块,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势腮,死亡現(xiàn)場離奇詭異漫仆,居然都是意外死亡,警方通過查閱死者的電腦和手機署照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門吗浩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岁钓,你說我怎么就攤上這事∑废” “怎么了钧大?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眶诈。 經(jīng)常有香客問我瓜饥,道長,這世上最難降的妖魔是什么乓土? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任趣苏,我火速辦了婚禮,結(jié)果婚禮上尽棕,老公的妹妹穿的比我還像新娘彬伦。我一直安慰自己,他們只是感情好单绑,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布询张。 她就那樣靜靜地躺著,像睡著了一般份氧。 火紅的嫁衣襯著肌膚如雪蜗帜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天蔬顾,我揣著相機與錄音,去河邊找鬼诀豁。 笑死,一個胖子當(dāng)著我的面吹牛娩践,可吹牛的內(nèi)容都是我干的烹骨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吨岭,長吁一口氣:“原來是場噩夢啊……” “哼峦树!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起络它,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤歪赢,失蹤者是張志新(化名)和其女友劉穎单料,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白对,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡换怖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年沉颂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸屉。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡彻坛,死狀恐怖踏枣,靈堂內(nèi)的尸體忽然破棺而出钙蒙,到底是詐尸還是另有隱情,我是刑警寧澤瘾婿,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布烤咧,位于F島的核電站,受9級特大地震影響笛谦,放射性物質(zhì)發(fā)生泄漏昌阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一灶轰、第九天 我趴在偏房一處隱蔽的房頂上張望刷钢。 院中可真熱鬧,春花似錦内地、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至航背,卻和暖如春沃粗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背最盅。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工起惕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咏删,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像辰狡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娃磺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容