Kotlin學(xué)習(xí)筆記(2)——數(shù)據(jù)類(lèi)型詳解

kotlin2.png

引言:Kotlin的數(shù)據(jù)類(lèi)型和Java是大致相同的绪爸,但是他們的寫(xiě)法不同,并且類(lèi)型之間的轉(zhuǎn)換也存在著差異宙攻。

一奠货、數(shù)值類(lèi)型

1、Kotlin中的數(shù)字的內(nèi)置類(lèi)型(接近與Java)座掘,其關(guān)鍵字為:

  • Byte=> 字節(jié) => 8位
  • Short => 短整型 => 16位
  • Int => 整型 => 32位
  • Long => 長(zhǎng)整型 => 64位
  • Float => 浮點(diǎn)型 => 32位
  • Double => 雙精度浮點(diǎn)型 => 64位
var a: Byte = 2                                                                                                 a = 2
var b: Short = 2                                                                                               b = 2
var c: Int = 2                                                                                                    c = 2
var d: Long = 2L //長(zhǎng)整型由大寫(xiě)字母L標(biāo)記                                                       d = 2
var e: Float = 2f //單精度浮點(diǎn)型由小寫(xiě)字母f或大寫(xiě)字符F標(biāo)記                            e = 2.0
var f: Double = 2.0                                                                                           f = 2.0

2递惋、進(jìn)制數(shù)

  • 二進(jìn)制數(shù)
  • 八進(jìn)制數(shù)(Kotlin不支持)
  • 十進(jìn)制數(shù)
  • 十六進(jìn)制數(shù)
var g = 0x0F //十六進(jìn)制數(shù)                                        g = 15
var h = 0b00001011 //二進(jìn)制數(shù)                               h = 11
var k = 123 //十進(jìn)制數(shù)                                             k = 123

3、數(shù)字類(lèi)型字面常量的下劃線(xiàn)

作用:分割數(shù)字進(jìn)行分組溢陪,使數(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 

println("oneMillion => $oneMillion") 
println("creditCardNumber => $creditCardNumber") 
println("socialSecurityNumber => $socialSecurityNumber") 
println("hexBytes => $hexBytes") 
println("bytes => $bytes")

輸出結(jié)果為:

oneMillion => 1000000 
creditCardNumber => 1234567890123456 
socialSecurityNumber => 999999999 
hexBytes => 4293713502 
bytes => 3530134674

4萍虽、裝箱與拆箱

* 裝箱與拆箱

在Kotlin中,存在數(shù)字的裝箱形真,但是不存在拆箱杉编。因?yàn)镵otlin是沒(méi)有基本數(shù)據(jù)類(lèi)型的,Kotlin是萬(wàn)般皆對(duì)象的原則咆霜。故不存在和Java中的類(lèi)似int是數(shù)據(jù)類(lèi)型邓馒,Integer是整型的引用類(lèi)型。
在Kotlin中要實(shí)現(xiàn)裝箱操作蛾坯。首先要了解可空引用光酣。即類(lèi)似Int?(只限數(shù)值類(lèi)型)這樣的。
例:

val numValue: Int = 123 
//裝箱的過(guò)程脉课,其實(shí)裝箱之后其值是沒(méi)有變化的 
val numValueBox: Int? = numValue 
println("裝箱后: numValueBox => $numValueBox")

輸出結(jié)果為:

裝箱后: numValueBox => 123

* 兩個(gè)數(shù)值的比較

判斷兩個(gè)數(shù)值是否相等(==),判斷兩個(gè)數(shù)值在內(nèi)存中的地址是否相等(===),其實(shí)上面的裝箱操作之后其內(nèi)存中的地址根據(jù)其數(shù)據(jù)類(lèi)型的數(shù)值范圍而定救军。
例:

val numValue: Int = 128 
val numValueBox: Int? = numValue 

/* 比較兩個(gè)數(shù)字 */ 
var result: Boolean 
result = numValue == numValueBox 
println("numValue == numValueBox => $result") // => true,其值是相等的 

result = numValue === numValueBox 
/* 上面定義的變量是Int類(lèi)型改览,大于127其內(nèi)存地址不同,反之則相同缤言。 
這是`kotlin`的緩存策略導(dǎo)致的,而緩存的范圍是` -128 ~ 127 `视事。 
故胆萧,下面的打印為false */ 
println("numValue === numValueBox => $result")

輸出結(jié)果為:

numValue == numValueBox => true 
numValue === numValueBox => false

5、轉(zhuǎn)換

  • 顯式轉(zhuǎn)換
    較小的類(lèi)型不會(huì)被隱式轉(zhuǎn)換為更大的類(lèi)型俐东,故而系統(tǒng)提供了顯式轉(zhuǎn)換跌穗。提供的顯式轉(zhuǎn)換方法如下:
  1. toByte() => 轉(zhuǎn)換為字節(jié)型
  2. toShort() => 轉(zhuǎn)換為短整型
  3. toInt() => 轉(zhuǎn)換為整型
  4. toLong() => 轉(zhuǎn)換為長(zhǎng)整型
  5. toFloat() => 轉(zhuǎn)換為浮點(diǎn)型
  6. toDouble() => 轉(zhuǎn)換為雙精度浮點(diǎn)型
  7. toChar() => 轉(zhuǎn)換為字符型
  8. toString() => 轉(zhuǎn)換為字符串型

例:

var numA: Int = 97 
println(numA.toByte()) 
println(numA.toShort()) 
println(numA.toInt()) 
println(numA.toLong()) 
println(numA.toFloat()) 
println(numA.toDouble()) 
println(numA.toChar()) 
println(numA.toString())

輸出結(jié)果為:

97 
97 
97 
97
97.0 
97.0
a 
97
  • 隱式轉(zhuǎn)換
    類(lèi)型是從上下文推斷出來(lái)的,即算術(shù)運(yùn)算則被重載為適當(dāng)?shù)霓D(zhuǎn)換
// 30L + 12 -> Long + Int => Long 
val num = 30L + 12 
print(num)                //42

6虏辫、位運(yùn)算符

Kotlin中對(duì)于按位操作蚌吸,和Java是有很大的差別的。Kotlin中沒(méi)有特殊的字符砌庄,但是只能命名為可以以中綴形式調(diào)用的函數(shù)羹唠,下列是按位操作的完整列表(僅適用于整形(Int)和長(zhǎng)整形(Long)):

  1. shl(bits) => 有符號(hào)向左移 (類(lèi)似Java的<<)
  2. shr(bits) => 有符號(hào)向右移 (類(lèi)似Java的>>)
  3. ushr(bits) => 無(wú)符號(hào)向右移 (類(lèi)似Java的>>>)
  4. and(bits) => 位運(yùn)算符 and (同Java中的按位與)
  5. or(bits) => 位運(yùn)算符 or (同Java中的按位或)
  6. xor(bits) => 位運(yùn)算符 xor (同Java中的按位異或)
  7. inv() => 位運(yùn)算符 按位取反 (同Java中的按位取反)

例:

/* 位運(yùn)算符 支持序列如下:shl、shr娄昆、ushr佩微、and、or萌焰、xor */ 
var operaNum: Int = 4 

var shlOperaNum = operaNum shl(2) 
var shrOperaNum = operaNum shr(2) 
var ushrOperaNum = operaNum ushr(2) 
var andOperaNum = operaNum and(2) 
var orOperaNum = operaNum or(2) 
var xorOperaNum = operaNum xor(2) 
var invOperaNum = operaNum.inv() 

println("shlOperaNum => $shlOperaNum \n " + 
            "shrOperaNum => $shrOperaNum \n " + 
            "ushrOperaNum => $ushrOperaNum \n " + 
            "andOperaNum => $andOperaNum \n " + 
            "orOperaNum => $orOperaNum \n " + 
            "xorOperaNum => $xorOperaNum \n " + 
            "invOperaNum => $invOperaNum")

輸出結(jié)果為:

shlOperaNum => 16 
shrOperaNum => 1 
ushrOperaNum => 1 
andOperaNum => 0 
orOperaNum => 6 
xorOperaNum => 6 
invOperaNum => -5

二哺眯、布爾類(lèi)型(Boolean)

1、關(guān)鍵字

Boolean關(guān)鍵字表示布爾類(lèi)型扒俯,并且其值有true和false

2奶卓、邏輯操作符(與Java相同)

  • ' || ' => 邏輯或(或者)
  • ' && ' => 邏輯與(并且)
  • ' ! ' => 邏輯非(取反)

三、字符型(Char)

1撼玄、關(guān)鍵字

Char為表示字符型夺姑,字符變量用單引號(hào)(‘ ’)表示。并且不能直接視為數(shù)字互纯,不過(guò)可以顯式轉(zhuǎn)換為數(shù)字瑟幕。

2、顯示轉(zhuǎn)換為其他類(lèi)型

字符型的變量不僅可以轉(zhuǎn)換為數(shù)字留潦,同時(shí)也可轉(zhuǎn)換為其他類(lèi)型
PS:除了可以轉(zhuǎn)換類(lèi)型外只盹,當(dāng)變量為英文字母時(shí)還支持大小寫(xiě)轉(zhuǎn)換。

3兔院、字符轉(zhuǎn)義

同Java一樣殖卑,使用某些特殊的字符時(shí),要使用轉(zhuǎn)義坊萝。下列是支持的轉(zhuǎn)義序列:

  • \t => 表示制表符
  • \n => 表示換行符
  • \b => 表示退格鍵(鍵盤(pán)上的Back建)
  • \r => 表示鍵盤(pán)上的Enter鍵
  • \ => 表示反斜杠
  • ' => 表示單引號(hào)
  • " => 表示雙引號(hào)
  • $ => 表示美元符號(hào)孵稽,如果不轉(zhuǎn)義在kotlin中就表示變量的引用了
  • 其他的任何字符請(qǐng)使用Unicode轉(zhuǎn)義序列語(yǔ)法许起。例:'\uFF00'

四、字符串類(lèi)型(String)

1菩鲜、關(guān)鍵字

String表示字符串類(lèi)型园细。所以字符串的元素可以通過(guò)索引操作的字符:str[index]來(lái)訪(fǎng)問(wèn)〗有#可以使用for循環(huán)迭代字符串:
其中str[index]中的str為要目標(biāo)字符串猛频,index為索引
例:

val str: String = "kotlin" 
println("str => $str") 

//迭代 
for (s in str){ 
    print(s) 
    print("\t") 
}

輸出結(jié)果為:

str => kotlin 
k    o    t    l    i    n

2、 字符串字面量

在Kotlin中蛛勉, 字符串字面量有兩種類(lèi)型:

  • 包含轉(zhuǎn)義字符的字符串 轉(zhuǎn)義包括(\t鹿寻、\n等),不包含轉(zhuǎn)義字符串的也同屬此類(lèi)型
  • 包含任意字符的字符串 由三重引號(hào)(""" .... """)表示
    例:
// 類(lèi)型1: 
var str1: String = "hello\t\tkotlin" 
println(str1) 
str1 = "hello kotlin" 
println(str1) 

// 類(lèi)型2: 
val str2 = """ fun main(args: Array<String>){ 
        println("我是三重引號(hào)引用的字符串,我可以包含任意字符") 
        } """ 
println(str2)

輸出結(jié)果為:

hello        kotlin 
hello kotlin 
fun main(args: Array<String>){ 
        println("我是三重引號(hào)引用的字符串诽凌,我可以包含任意字符") 
        }

PS: 可以使用trimMargin()函數(shù)刪除前導(dǎo)空格 毡熏,默認(rèn)使用符號(hào)(|)作為距前綴,當(dāng)然也可以使用其他字符侣诵。例:右尖括號(hào)(>)痢法、左尖括號(hào)(<)等。

3窝趣、字符串模板

使用字符串模板的符號(hào)為()疯暑。在符號(hào)后面加上變量名或大括號(hào)中的表達(dá)式
例:

val text1: String = "我來(lái)了!" 
var text2: String = "$text1 kotlin" 
var text3: String = "$text2 ${text1.length} 哈哈Q剖妗8菊!洗鸵!" 
println(text1) 
println(text2) 
println(text3)

輸出結(jié)果為:

我來(lái)了越锈! 
我來(lái)了! kotlin 
我來(lái)了膘滨! kotlin 4 哈哈8势尽!;鸬恕丹弱!

五、數(shù)組型(Array)

  • Kotlin中數(shù)組由Array<T>表示铲咨,可以去看看源碼實(shí)現(xiàn)躲胳,里面就幾個(gè)方法
  • 創(chuàng)建數(shù)組的3個(gè)函數(shù)
    • arrayOf()
    • arrayOfNulls()
    • 工廠(chǎng)函數(shù)(Array())

1、arrayOf()

創(chuàng)建一個(gè)數(shù)組纤勒,參數(shù)是一個(gè)可變參數(shù)的泛型對(duì)象
例:

var arr1 = arrayOf(1,2,3,4,5) //等價(jià)于[1,2,3,4,5] 
for (v in arr1){ 
        print(v) 
        print("\t") 
} 

var arr2 = arrayOf("0","2","3",'a',32.3f) 
for (v in arr2){ 
        print(v) 
        print("\t") 
}

輸出結(jié)果為:

1    2    3    4    5 
0    2    3    a    32.3

2坯苹、arrayOfNulls()

用于創(chuàng)建一個(gè)指定數(shù)據(jù)類(lèi)型且可以為空元素的給定元素個(gè)數(shù)的數(shù)組
例:

var arr3 = arrayOfNulls<Int>(3) 

//如若不予數(shù)組賦值則arr3[0]、arr3[1]摇天、arr3[2]皆為null 
for(v in arr3){ 
        print(v) 
        print("\t") 
} 

println() 

//為數(shù)組arr3賦值 
arr3[0] = 10 
arr3[1] = 20 
arr3[2] = 30 
for(v in arr3){ 
        print(v) 
        print("\t") 
}

輸出結(jié)果為:

null    null    null 
10    20    30

3粹湃、工廠(chǎng)函數(shù)

  • 使用一個(gè)工廠(chǎng)函數(shù)Array()恐仑,它使用數(shù)組大小和返回給定其索引的每個(gè)數(shù)組元素的初始值的函數(shù)。
  • Array() => 第一個(gè)參數(shù)表示數(shù)組元素的個(gè)數(shù)为鳄,第二個(gè)參數(shù)則為使用其元素下標(biāo)組成的表達(dá)式
    例:
var arr4 = Array(5,{(index * 2).toString() }) 
for (v in arr4){ 
        print(v) 
        print("\t") 
}

輸出結(jié)果為:

0    2    4    6    8

4裳仆、原始類(lèi)型數(shù)組

  • Kotlin還有專(zhuān)門(mén)的類(lèi)來(lái)表示原始類(lèi)型的數(shù)組,沒(méi)有裝箱開(kāi)銷(xiāo)孤钦,它們分別是:
    • ByteArray => 表示字節(jié)型數(shù)組
    • ShortArray => 表示短整型數(shù)組
    • IntArray => 表示整型數(shù)組
    • LongArray => 表示長(zhǎng)整型數(shù)組
    • BooleanArray => 表示布爾型數(shù)組
    • CharArray => 表示字符型數(shù)組
    • FloatArray => 表示浮點(diǎn)型數(shù)組
    • DoubleArray => 表示雙精度浮點(diǎn)型數(shù)組
  • PS: Kotlin中不支持字符串類(lèi)型這種原始類(lèi)型數(shù)組鉴逞,可以看源碼Arrays.kt這個(gè)類(lèi)中并沒(méi)有字符串?dāng)?shù)組的聲明。而源碼中StringArray.kt這個(gè)類(lèi)并不是聲明字符串型數(shù)組的司训。
    例:
var intArr: IntArray = intArrayOf(1,2,3,4,5) 
for (number in intArr){ 
        print(number) 
        print("\t") 
} 

println() 

var charArr: CharArray = charArrayOf('a','1','b','c','3','d') 
for (char in charArr){ 
    print(char) 
    print("\t") 
} 

println() 

var longArr: LongArray = longArrayOf(12L,1254L,123L,111L) 
for (long in longArr){ 
    print(long) 
    print("\t") 
}

輸出結(jié)果為:

1    2    3    4    5 
a    1    b    c    3    d 
12    1254    123    111
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市液南,隨后出現(xiàn)的幾起案子壳猜,更是在濱河造成了極大的恐慌,老刑警劉巖滑凉,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件统扳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畅姊,警方通過(guò)查閱死者的電腦和手機(jī)咒钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)若未,“玉大人朱嘴,你說(shuō)我怎么就攤上這事〈趾希” “怎么了萍嬉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)隙疚。 經(jīng)常有香客問(wèn)我壤追,道長(zhǎng),這世上最難降的妖魔是什么供屉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任行冰,我火速辦了婚禮,結(jié)果婚禮上伶丐,老公的妹妹穿的比我還像新娘悼做。我一直安慰自己,他們只是感情好撵割,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布贿堰。 她就那樣靜靜地躺著,像睡著了一般啡彬。 火紅的嫁衣襯著肌膚如雪羹与。 梳的紋絲不亂的頭發(fā)上故硅,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音纵搁,去河邊找鬼吃衅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腾誉,可吹牛的內(nèi)容都是我干的徘层。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼利职,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趣效!你這毒婦竟也來(lái)了涵紊?” 一聲冷哼從身側(cè)響起威根,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狸膏,失蹤者是張志新(化名)和其女友劉穎沸停,沒(méi)想到半個(gè)月后宇挫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阵苇,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡动猬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捎稚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桶癣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拥褂。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牙寞,靈堂內(nèi)的尸體忽然破棺而出饺鹃,到底是詐尸還是另有隱情,我是刑警寧澤间雀,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布尤慰,位于F島的核電站,受9級(jí)特大地震影響雷蹂,放射性物質(zhì)發(fā)生泄漏伟端。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一匪煌、第九天 我趴在偏房一處隱蔽的房頂上張望责蝠。 院中可真熱鬧,春花似錦萎庭、人聲如沸霜医。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肴敛。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間医男,已是汗流浹背砸狞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镀梭,地道東北人刀森。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像报账,于是被迫代替她去往敵國(guó)和親研底。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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