任意一種開發語言都有其數據類型,而且數據類型對於一門開發語言來講是最基本的構成,同時也是最基礎的語法。固然,Kotlin
也不例外。Kotlin
的數據類型和Java
是大體相同的,可是他們的寫法不一樣,而且類型之間的轉換也存在着差別。下面爲你們詳細說明並舉例。git
一、Kotlin
中的數字的內置類型(接近與Java
),其關鍵字爲:github
Byte
=> 字節 => 8位Short
=> 短整型 => 16位Int
=> 整型 => 32位Long
=> 長整型 => 64位Float
=> 浮點型 => 32位Double
=> 雙精度浮點型 => 64位
例:編程
var a: Byte = 2
var b: Short = 2
var c: Int = 2
var d: Long = 2L //長整型由大寫字母L標記
var e: Float = 2f //單精度浮點型由小寫字母f或大寫字符F標記
var f: Double = 2.0
println(" a => $a \n b => $b \n c => $c \n d => $d \n e => $e \n f => $f);
複製代碼
輸出結果爲:數組
a => 2
b => 2
c => 2
d => 2
e => 2.0
f => 2.0
複製代碼
二、進制數緩存
- 二進制數
- 八進制數(Kotlin不支持)
- 十進制數
- 十六進制數
例:bash
var g = 0x0F //十六進制數
var h = 0b00001011 //二進制數
var k = 123 //十進制數
// ps:Kotlin不支持八進制數
println(" g => $g \n h => $h \n k => $k);
複製代碼
輸出結果爲:編程語言
g => 15
h => 11
k => 123
複製代碼
三、數字類型字面常量的下劃線函數
做用:分割數字進行分組,使數字常量更易讀學習
例:this
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")
複製代碼
輸出結果爲:
oneMillion => 1000000
creditCardNumber => 1234567890123456
socialSecurityNumber => 999999999
hexBytes => 4293713502
bytes => 3530134674
複製代碼
四、裝箱與拆箱
- 在
Kotlin
中,存在數字的裝箱,可是不存在拆箱。由於Kotlin
是沒有基本數據類型的,Kotlin
是萬般皆對象的原則。故不存在和Java
中的相似int
是數據類型,Integer
是整型的引用類型。
在Kotlin
中要實現裝箱操做。首先要了解可空引用。即相似Int?
(只限數值類型)這樣的。
例:
val numValue: Int = 123
//裝箱的過程,其實裝箱以後其值是沒有變化的
val numValueBox: Int? = numValue
println("裝箱後: numValueBox => $numValueBox")
複製代碼
輸出結果爲:
裝箱後: numValueBox => 123
複製代碼
判斷兩個數值是否相等(
==
),判斷兩個數值在內存中的地址是否相等(===
),其實上面的裝箱操做以後其內存中的地址根據其數據類型的數值範圍而定。
例:
val numValue: Int = 128
val numValueBox: Int? = numValue
/*
比較兩個數字
*/
var result: Boolean
result = numValue == numValueBox
println("numValue == numValueBox => $result") // => true,其值是相等的
result = numValue === numValueBox
/*
上面定義的變量是Int類型,大於127其內存地址不一樣,反之則相同。
這是`kotlin`的緩存策略致使的,而緩存的範圍是` -128 ~ 127 `。
故,下面的打印爲false
*/
println("numValue === numValueBox => $result")
複製代碼
輸出結果爲:
numValue == numValueBox => true
numValue === numValueBox => false
複製代碼
Ps:各位能夠試試將變量
numValue
的值改成在-128 ~ 127
這個區間的數字試試
五、轉換
- 較小的類型不會被隱式轉換爲更大的類型,故而系統提供了顯式轉換。提供的顯式轉換方法以下:
toByte()
=> 轉換爲字節型toShort()
=> 轉換爲短整型toInt()
=> 轉換爲整型toLong()
=> 轉換爲長整型toFloat()
=> 轉換爲浮點型toDouble()
=> 轉換爲雙精度浮點型toChar()
=> 轉換爲字符型toString()
=> 轉換爲字符串型
例:
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())
複製代碼
輸出結果爲:
97
97
97
97.0
97.0
97
a
97
複製代碼
類型是從上下文推斷出來的,即算術運算則被重載爲適當的轉換
例:
// 30L + 12 -> Long + Int => Long
val num = 30L + 12
print(num)
複製代碼
輸出結果爲:
42
複製代碼
六、位運算符
Kotlin
中對於按位操做,和Java
是有很大的差異的。Kotlin
中沒有特殊的字符,可是隻能命名爲能夠以中綴形式調用的函數,下列是按位操做的完整列表(僅適用於整形(
Int)和長整形(
Long)
):
shl(bits)
=> 有符號向左移 (相似Java
的<<
)shr(bits)
=> 有符號向右移 (相似Java
的>>
)ushr(bits)
=> 無符號向右移 (相似Java
的>>>
)and(bits)
=> 位運算符and
(同Java
中的按位與)or(bits)
=> 位運算符or
(同Java
中的按位或)xor(bits)
=> 位運算符xor
(同Java
中的按位異或)inv()
=> 位運算符 按位取反 (同Java
中的按位取反)
下面附上Kotlin
中關於位操做符的源碼:
/** Shifts this value left by [bits]. */
public infix fun shl(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with copies of the sign bit. */
public infix fun shr(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with zeros. */
public infix fun ushr(bitCount: Int): Int
/** Performs a bitwise AND operation between the two values. */
public infix fun and(other: Int): Int
/** Performs a bitwise OR operation between the two values. */
public infix fun or(other: Int): Int
/** Performs a bitwise XOR operation between the two values. */
public infix fun xor(other: Int): Int
/** Inverts the bits in this value. */
public fun inv(): Int
複製代碼
例:
/*
位運算符
支持序列以下:shl、shr、ushr、and、or、xor、inv
*/
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")
複製代碼
輸出結果爲:
shlOperaNum => 16
shrOperaNum => 1
ushrOperaNum => 1
andOperaNum => 0
orOperaNum => 6
xorOperaNum => 6
invOperaNum => -5
複製代碼
一、關鍵字
Boolean
關鍵字表示布爾類型,而且其值有true
和false
例:
var isNum: Boolean
isNum = false
println("isNum => $isNum")
複製代碼
輸出結果爲:
isNum => false
複製代碼
二、邏輯操做符(與Java相同)
- ' || ' => 邏輯或(或者)
- ' && ' => 邏輯與(而且)
- ' ! ' => 邏輯非(取反)
例:
/*
操做運算符
' || ' => 邏輯或(或者)
' && ' => 邏輯與(而且)
' ! ' => 邏輯非(取反)
*/
var a: Boolean = false
var b: Boolean = true
var result: Boolean
/* 邏輯或操做 */
if (a || b){
result = a || b
println("a || b => $result")
}
/* 邏輯與操做 */
if (a && b){
result = a && b
println("a && b => $result")
}
/* 邏輯非操做 */
result = !a
println("!a => $result")
result = !b
println("!b => $result")
複製代碼
輸出結果爲:
isNum => false
a || b => true
!a => true
!b => false
複製代碼
一、關鍵字
Char
爲表示字符型,字符變量用單引號(‘ ’)表示。而且不能直接視爲數字,不過能夠顯式轉換爲數字。
例:
var char1: Char
char = 'a'
//char1 = 1 => 這句代碼會直接出錯
println("char1 => $char1")
複製代碼
輸出結果爲:
char1 => a
複製代碼
二、顯示轉換爲其餘類型
字符型的變量不只能夠轉換爲數字,同時也可轉換爲其餘類型
例:
var var1 = char1.toByte()
var var2 = char1.toInt()
var var3 = char1.toString()
var var4 = char1.toFloat()
var var5 = char1.toShort()
println("var1 => $var1 \n var2 => $var2 \n var3 => $var3 \n var4 => $var4 \n var5 => $var5")
複製代碼
輸出結果爲:
var1 => 97
var2 => 97
var3 => a
var4 => 97.0
var5 => 97
複製代碼
PS:除了能夠轉換類型外,當變量爲英文字母時還支持大小寫轉換。
例:
/*
當字符變量爲英文字母時,大小寫的轉換
*/
var charA: Char = 'a'
var charB: Char = 'B'
var charNum: Char = '1'
var result: Char
// 轉換爲大寫
result = charA.toUpperCase()
println("result => $result")
// 轉換爲小寫
result = charB.toLowerCase()
println("result => $result")
//當字符變量不爲英文字母時,轉換無效
result = charNum.toLowerCase()
println("result => $result")
複製代碼
輸出結果爲:
result => A
result => b
result => 1
複製代碼
三、字符轉義 同Java
同樣,使用某些特殊的字符時,要使用轉義。下列是支持的轉義序列:
\t
=> 表示製表符\n
=> 表示換行符\b
=> 表示退格鍵(鍵盤上的Back建)\r
=> 表示鍵盤上的Enter
鍵\\
=> 表示反斜槓\'
=> 表示單引號\"
=> 表示雙引號\$
=> 表示美圓符號,若是不轉義在kotlin
中就表示變量的引用了- 其餘的任何字符請使用Unicode轉義序列語法。例:'\uFF00'
例:
println("\n 換行符")
println("\t 製表符")
println(" \b 退格鍵")
println("\r Enter鍵一樣換行")
println('\\')
println('\'')
println('\"')
println('\$')
println('\uFF01')
複製代碼
輸出結果爲:
換行符
製表符
退格鍵
Enter鍵一樣換行
\
' " $ ! 複製代碼
一、關鍵字
String
表示字符串類型。其是不可變的。因此字符串的元素能夠經過索引操做的字符:str[index]
來訪問。可使用for
循環迭代字符串: 其中str[index]
中的str
爲要目標字符串,index
爲索引
例:
val str: String = "kotlin"
println("str => $str")
//迭代
for (s in str){
print(s)
print("\t")
}
複製代碼
輸出結果爲:
str => kotlin
k o t l i n
複製代碼
二、 字符串字面量
在
Kotlin
中, 字符串字面量有兩種類型:
- 包含轉義字符的字符串 轉義包括(
\t
、\n
等),不包含轉義字符串的也同屬此類型- 包含任意字符的字符串 由三重引號(
""" .... """
)表示
例:
// 類型1:
var str1: String = "hello\t\tkotlin"
println(str1)
str1 = "hello kotlin"
println(str1)
// 類型2:
val str2 = """ fun main(args: Array<String>){
println("我是三重引號引用的字符串,我能夠包含任意字符")
} """
println(str2)
複製代碼
輸出結果爲:
hello kotlin
hello kotlin
fun main(args: Array<String>){
println("我是三重引號引用的字符串,我能夠包含任意字符")
}
複製代碼
PS: 可使用
trimMargin()
函數刪除前導空格 ,默認使用符號(|
)做爲距前綴,固然也可使用其餘字符。例:右尖括號(>
)、左尖括號(<
)等。
例:
val str3: String = """
> I`m like Kotlin .
> I`m like Java .
> I`m like Android .
> I`m like React-Native.
""".trimMargin(">")
println(str3)
複製代碼
輸出結果爲:
I`m like Kotlin .
I`m like Java .
I`m like Android .
I`m like React-Native.
複製代碼
三、字符串模板
使用字符串模板的符號爲(
$
)。在$
符號後面加上變量名或大括號中的表達式
例:
val text1: String = "我來了!"
var text2: String = "$text1 kotlin"
var text3: String = "$text2 ${text1.length} 哈哈!!!!"
println(text1)
println(text2)
println(text3)
複製代碼
輸出結果爲:
我來了!
我來了! kotlin
我來了! kotlin 4 哈哈!!!!
複製代碼
Kotlin
中數組由Array<T>
表示,能夠去看看源碼實現,裏面就幾個方法- 建立數組的3個函數
arrayOf()
arrayOfNulls()
- 工廠函數(
Array()
)
一、arrayOf()
建立一個數組,參數是一個可變參數的泛型對象
例:
var arr1 = arrayOf(1,2,3,4,5) //等價於[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")
}
複製代碼
輸出結果爲:
1 2 3 4 5
0 2 3 a 32.3
複製代碼
二、arrayOfNulls()
用於建立一個指定數據類型且能夠爲空元素的給定元素個數的數組
例:
var arr3 = arrayOfNulls<Int>(3)
//如若不予數組賦值則arr3[0]、arr3[1]、arr3[2]皆爲null
for(v in arr3){
print(v)
print("\t")
}
println()
//爲數組arr3賦值
arr3[0] = 10
arr3[1] = 20
arr3[2] = 30
for(v in arr3){
print(v)
print("\t")
}
複製代碼
輸出結果爲:
null null null
10 20 30
複製代碼
三、工廠函數
- 使用一個工廠函數
Array()
,它使用數組大小和返回給定其索引的每一個數組元素的初始值的函數。Array()
=> 第一個參數表示數組元素的個數,第二個參數則爲使用其元素下標組成的表達式
例:
var arr4 = Array(5,{index -> (index * 2).toString() })
for (v in arr4){
print(v)
print("\t")
}
複製代碼
輸出結果爲:
0 2 4 6 8
複製代碼
四、原始類型數組
Kotlin
還有專門的類來表示原始類型的數組,沒有裝箱開銷,它們分別是:
ByteArray
=> 表示字節型數組ShortArray
=> 表示短整型數組IntArray
=> 表示整型數組LongArray
=> 表示長整型數組BooleanArray
=> 表示布爾型數組CharArray
=> 表示字符型數組FloatArray
=> 表示浮點型數組DoubleArray
=> 表示雙精度浮點型數組PS:
Kotlin
中不支持字符串類型這種原始類型數組,能夠看源碼Arrays.kt
這個類中並無字符串數組的聲明。而源碼中StringArray.kt
這個類並非聲明字符串型數組的。
下面的例子只演示了幾種,其餘的相似。 例:
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")
}
複製代碼
輸出結果爲:
1 2 3 4 5
a 1 b c 3 d
12 1254 123 111
複製代碼
無論對於任何一門編程語言,都有其數據類型,而數據類型是學習一門編程語言的基礎。因此請各位大佬認真而且跟着代碼敲一遍。特別是數組和字符串類型這兩個點。
若是各位大佬看了以後感受還闊以,就請各位大佬隨便star
一下,您的關注是我最大的動力。
個人我的博客:Jetictors
Github:Jteictors