# 1. 變量
`Kotlin`中的變量分為兩種類型:
- 可變變量:用關鍵字`var`來修飾,可以進行多次修改。
- 不可變變量:用關鍵字`val`來修飾,只能進行一次初始化。
語法格式:
```
var/val 變量名: 數據類型
// 比如
var number: Int
```
聲明變量的同時給變量賦值:
```
var number: Int = 123
```
值得注意的是,`Kotlin`會根據變量的值自動識別變量的數據類型,所以上面的代碼可以簡寫為:
```
var number = 123
```
而這種寫法也就是我們在`Java`中常寫的方式。
# 2. 常見數據類型
注意到上面我們所使用的是`Int`來定義一個數值類型,在`Kotlin`中自有的數據類型為:
- 數值型,`Byte`(`1`字節)、`Short`(`2`字節)、`Int`(`4`字節)、`Long`(`5`字節)、`Float`(`4`字節)、`Double`(`8`字節);
- 字符型,`Char`;
- 布爾型,`Boolean`;
- 數組型,`IntArray`、`BooleanArray`、`CharArray`以及非基本類型的`Array<String>`
- 字符串型,`String`;
## 2.1 數組類型
對于數組的兩種定義方式這里給出一個案例:
```
var arrays_1: IntArray = intArrayOf(1, 2, 3)
var arrays_2: Array<Int> = arrayOf(1, 2, 3)
```
## 2.2 字符串類型
字符串的常見操作在各類編程語言中都提供了較多的操作`API`,且也是日常編碼過程中使用較多的一些基礎操作。所以在這里對一些常見的字符串操作進行介紹:
### 2.2.1 查找字符串中元素
查找字符串中的第`1`個元素、最后`1`個元素以及角標為`index`的元素。
~~~
fun main() {
val name = "張天下"
print(name.first()) // 張
print(name.get(1)) // 天
print(name.last()) // 下
}
~~~
### 2.2.2 字符串截取
~~~
fun main() {
val name = "張天下"
print(name.substring(1)) // 天下 [1, length - 1]
print(name.substring(0, 1)) // 張 [0, 1)
}
~~~
還提供了`subSequence`方法,用法類似。
### 2.2.3 字符串替換
使用`replace`函數完成,比如下面的案例:
~~~
fun main() {
var name = "張天下張"
var newName = name.replace("張", "李")
print(name) // 張天下張
print(newName) // 李天下李
}
~~~
從上面的案例中我們可以知道兩點:
- 字符串和`Java`中類似,還是常量,也就是對于字符串的修改并不會在原本內容上修改,而是建立一個新的字符串。所以這里建議定義字符串的時候使用`val`關鍵字。
- `replace`操作的替換過程類似正則匹配,會多個匹配,多個替換。
同時也提供了多個替換方法,比如下面的案例:
~~~
fun main() {
val name = "張天下張"
val newName_0 = name.replaceFirst("張", "李")
val newName_1 = name.replaceBefore("張", "李")
val newName_2 = name.replaceAfter("張", "李")
val newName_3 = name.replaceRange(0, 2, "李")
println(newName_0) // 李天下張
println(newName_1) // 李張天下張
println(newName_2) // 張李
println(newName_3) // 李下張
}
~~~
從上面案例可以知道:
- `replaceFirst`只替換第一個匹配;
- `replaceBefore`將第一個匹配位置的之前元素替換,即使之前沒有元素;
- `replaceAfter`將第一個匹配的之后的元素替換,即使之后沒有元素;
- `replaceRange`按照范圍進行替換,范圍為`[index, last)`;
### 2.2.4 字符串分割
~~~
fun main() {
val name = "天下張"
println(name.split("下")) // [天, 張]
}
~~~
### 2.2.5 模板表達式
字符串模板表達式由`${變量名/函數/表達式}`組成,也可以省略`{}`,例如“`$變量名`”。
~~~
fun main() {
var firstName: String = "張"
val name = "天下$firstName" // 使用變量
println(name) // 天下張
}
~~~
這種寫法優點類似于在`Java`中的字符串的標準化輸出`%s`,但是這種方式感覺更加方便。
上面的案例僅僅使用了`${變量名}`,下面將實踐后面兩種方式:
~~~
fun firstName(): String {
return "張"
}
fun main() {
val name = "天下${firstName()}" // 使用函數
println(name) // 天下張
}
~~~
接著上面的案例:
~~~
fun main() {
val name = "天下${firstName()}" // 使用表達式
println(name.replaceAfter("張", "李")) // 天下張李
}
~~~
## 2.3 類型之間轉換
在`IDEA`中可以輸入`toChar`等類似的`to`前綴即可,比如下面的案例:
~~~
fun main() {
var number = 23
println(number.toString())
println(number.toByte())
println(number.toFloat())
println(number.toDouble())
...
}
~~~
## 2.4 其余類型
至于其余數據類型的用法和`Java`中類似,這里就不再給出案例。
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room