引言: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)換方法如下:
- toByte() => 轉(zhuǎn)換為字節(jié)型
- toShort() => 轉(zhuǎn)換為短整型
- toInt() => 轉(zhuǎn)換為整型
- toLong() => 轉(zhuǎn)換為長(zhǎng)整型
- toFloat() => 轉(zhuǎn)換為浮點(diǎn)型
- toDouble() => 轉(zhuǎn)換為雙精度浮點(diǎn)型
- toChar() => 轉(zhuǎn)換為字符型
- 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)):
- shl(bits) => 有符號(hào)向左移 (類(lèi)似Java的<<)
- shr(bits) => 有符號(hào)向右移 (類(lèi)似Java的>>)
- ushr(bits) => 無(wú)符號(hào)向右移 (類(lèi)似Java的>>>)
- and(bits) => 位運(yùn)算符 and (同Java中的按位與)
- or(bits) => 位運(yùn)算符 or (同Java中的按位或)
- xor(bits) => 位運(yùn)算符 xor (同Java中的按位異或)
- 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