# 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