一、Kotlin类型
1.整数
2.浮点
显示转换:
所有数字类型都支持转换为其他类型,但是转换前会检测长度。
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
不同进制的数字表示方法(为了提高代码的可读性可维护性,Kotlin不支持八进制):
十进制: 123
十六进制: 0x0F 0x8C
二进制: 0b 0000 1011
Kotlin支持数字运算的标准集:+、 -、 *、 /、 %等。它们已定义为相应的函数:
Kotlin
fun main() {
println(1 + 2)
println(2_500_000_000L - 1L)
println(3.14 * 2.71)
println(10.0 / 3)
}
整数间的除法永远返回整数,除非其中一个整数显式地转换为浮点数
3.布尔
4.字符
5.字符串
6.字符串模板与格式化输出
(1)使用美元符号
val name = "Alice"
val age = 30
val message = "Hello, my name is ${name} and I am ${age} years old."
print(message)
(2)使用百分号格式化字符串输出
val number = 123.456
println("Formatted number:%.2f".format(number))
(3)使用String.format()函数
val name = "Bob"
val age = 25
val formattedString = String.format("Name: %s, Age: %d", name, age)
7.数组Array
Kotlin 中的数组是一种用于存储相同类型元素的集合。它允许按顺序存储元素,并通过索引来访问这些元素。Kotlin 提供了两种类型的数组:原生数组和 Kotlin 数组。
(1)Kotlin数组,使用arrayOf创建
val array = arrayOf(1,2,3,4,5) // 创建一个包含整数的Kotlin数组
(2)原生数组,不同类型使用不同的创建方法
val intArray = IntArray(5) // 创建一个包含5个整数的原生数组,默认初始值为0
8.集合
由于数组存在上述限制,因此一般仅在需要自定义数据结构时,或对访问性能有要求时才会使用数组。其余情况下,Kotlin中推荐使用"集合":List Set Map
List(列表):List 是一种有序集合,允许包含重复元素。Kotlin 中的 List 接口有多个实现类,如 ArrayList、LinkedList 等。
Set(集):Set 是一种不包含重复元素的集合,元素之间没有明确的顺序。Kotlin 中的 Set 接口有多个实现类,如 HashSet、LinkedHashSet、SortedSet 等。
Map(映射):Map 是一种键值对的集合,每个键都唯一对应一个值。Kotlin 中的 Map 接口有多个实现类,如 HashMap、LinkedHashMap、TreeMap 等。
集合的创建方式:
(1)有初始值
val list = listOf(1,2,3,4,5) // 创建一个不可变的List
val mutableList = mutableListOf(1,2,3,4,5) // 创建一个可变的List
val set = setOf(1,1,1,2,3) // 创建一个不可变的Set
val mutableSet = mutableSetOf(1,2,3,4,5) // 创建一个可变的Set
val map = mapOf(1 to "one",2 to "two",3 to "three") // 创建一个不可变的Map
val mutableMap = mutableMapOf(1 to "one",2 to "two",3 to "three") // 创建一个可变的Map
(2)使用构造函数
val list = ArrayList<Int>() // 创建一个空的ArrayList
val set = HashSet<String>() // 创建一个空的HashSet
val map = HashMap<Int,String>() // 创建一个空的HashMap
添加元素:
list.add(1)
set.add("hello")
map[1] = "one"
9.检测与转换
(1)is操作符
(2)as操作符
二、Kotlin控制流程
- if 表达式
2.When表达式
3.For循环
4.While循环
5.异常
三、Kotlin类与对象
1.类
2.构造函数
Kotlin中的构造函数用法与Java类似,但是在结构上有较大的不同。
(1)主构造函数与初始化块
(2)次构造函数
3.继承
在 Kotlin 中所有类都有一个共同的超类 Any,对于没有超类型声明的类它是默认超类:
class Example // 从 Any 隐式继承
Any 有三个方法:equals()、 hashCode() 与 toString()
因此,为所有 Kotlin 类都定义了这些方法。默认情况下,Kotlin 类是最终(final)的------它们不能被继承。 要使一个类可继承,需用 open 关键字标记它:
open class Base // 该类开放继承
如需声明一个显式的超类型,需把超类型放到冒号之后:
open class Base(p: Int)
class Derived(p: Int) : Base(p)
继承与构造函数
方法与属性的覆盖
四、Kotlin协程
1.Kotlin 中的协程(Coroutines)是一种轻量级的线程模型,用于简化异步编程。它们提供了一种在代码中以顺序、可读的方式表达并发性的方法,而无需使用传统的回调函数或显式的线程管理。
**主线程安全:**在安卓开发中,需要确保 UI 操作只在主线程(UI 线程)中执行。协程提供了与主线程进行交互的便捷方式,使得可以异步执行耗时操作(文件处理、网络通信),并在必要时切换到主线程更新 UI。
简化异步编程: 使用协程可以使异步编程变得更简洁、易读和易维护。相比于传统的回调函数或者使用异步任务(AsyncTask)等方式,协程提供了更加顺序、自然的编码方式,避免了回调地狱(callback hell)的问题。同时协程相较于线程更加轻量和灵活。
进程、线程和协程三者之间的关系如图所示
2.基本概念
(1)协程作用域(Coroutine Scope):协程的生命周期。
协程作用域定义了协程的生命周期和执行范围。常见的协程作用域如下:
a.全局作用域(Global Scope):该协程的生命周期与整个应用程序的生命周期相同。对应类:GlobalScope。例如,我们在全局作用域的协程内编写了一个无限循环代码,则该代码只有在应用程序退出后才会结束。或者手动调用了该协程的取消函数。
b.局部作用域(Local Scope):该协程的应用周期和应用程序中的某个模块或对象的生命周期相同。对应类:lifecycleScope,viewModelScope。例如,如果在某个activity中开辟了一个协程,则该协程的生命周期与该activity相同,那么当我们在这个协程中进行网络请求,如果activity被销毁,则该网络请求会被立即终止。
(2)协程上下文(Coroutine Context):协程的执行环境,例如调度器。
协程上下文确定了协程的运行环境。几个关键元素如下:
a.调度器(Dispatcher):决定了协程运行在哪个线程上。例如 Dispatchers.Main 会将协程调度到主线程用于UI更新;Dispatchers.IO 会将协程调度到 IO 线程池,用于磁盘和网络IO操作。
b.作业(Job):用于管理协程的生命周期,可以取消或等待协程执行完毕。
c.异常处理器(Exception Handler):用于捕获协程中抛出的未捕获的异常,并进行处理。
d.协程名称(Coroutine Name):用于标识协程的名称,便于调试和日志记录。
(3)协程构建器(Coroutine Builder):用于启动协程。
协程构建器确定了协程的启动方式。最常见的两种启动方式如下:
a. launch:在 CoroutineScope 中启动一个新的协程,但不会阻塞当前线程。launch 返回一个 Job 实例,可以用于管理协程的生命周期(如取消协程)。适用于不需要从协程中返回结果的并发任务。
b. async:async 旨在执行需要返回结果的并发操作。它返回一个 Deferred 对象,该对象是 Job 的子类,可以用来获取协程的结果。适用于需要从协程中返回结果的并发任务。