适合有java基础的,获取kotlin基础知识/语法等,Kotlin精讲-黑马程序员(原创)的学习笔记。
1. 区间
在Kotlin里面,区间表示相关的类有IntRange、LongRange、CharRange,这三个类都实现了ClosedRange接口。
// 区间的4种表示方法
fun testRange() {
// [1, 10], IntRange包含start,end(参数名:endInclusive)
var r1 = IntRange(1, 10)
// [1, 10], 同IntRange()
var r2 = 1.rangeTo(10)
// [1, 10], 包括start,end
var r3 = 1..10
// [1, 10), 包括start,不包括end
var r4 = 1 until 10
}
区间遍历
fun testRange() {
// [1, 10]
var intRange = IntRange(1, 10)
// 1. 普通for循环
for (i in intRange) {
print("$i, ")
}
println()
// 2. step的for循环
for (i in intRange step 1) {
print("$i, ")
}
println()
// 3. forEach
intRange.forEach {
print("$it, ")
}
println()
// 4. forEach index
intRange.forEachIndexed {
index, i -> print("$index -> $i, ")
}
println()
// 5. withIndex_1
for (i in intRange.withIndex()) {
print("${i.index} -> ${i.value}, ")
}
println()
// 6. withIndex_2
for ((index, value) in intRange.withIndex()) {
print("$index -> $value, ")
}
println()
}
Kotlin为区间设有first、start和last等属性,也有contains等方法,以及其他大量的高阶函数可以使用。
2. 数组
在Kotlin中,数组的完整定义如下
public class Array<T> {}
// 数组定义
fun testArray() {
// 1. arrayOf
var array = arrayOf(1, 2, 3, 4)
println("array size is ${array.size}")
// 2. Array构造方法, 输出0,2,4,6
var array2 = Array(4) {
it * 2
}
}
// 数组遍历 (也可以使用高阶函数进行遍历)
fun testArray() {
var array = arrayOf(1, 2, 3, 4)
// 1. 普通for
for (i in array) {
print("$i, ")
}
println()
// 2. for循环 indices
for (index in array.indices) {
print("$index -> ${array[index]}, ")
}
println()
// 3. for循环 withIndex
for (i in array.withIndex()) {
print("${i.index} -> ${i.value}, ")
}
println()
// 4. for循环 解析析构
for ((index, value) in array.withIndex()) {
print("$index -> $value, ")
}
println()
}
// 数组长度调整(生成新的数组,原数组长度不可变)
fun testArray() {
var array: Array<Int> = arrayOf(1, 2, 3, 4)
// 新增
var plusArray: Array<Int> = array.plus(5)
// 删除
var dropArray1: List<Int> = array.drop(2)
var dropArray2: List<Int> = array.dropLast(2)
// 提取部分
var sliceArray: Array<Int> = array.sliceArray(0..2)
}
3. 集合
同Java,集合分为三种类型,分别是List、Set和Map集合。
Kotlin中List、Set、Map的集合在读方面都是可读的,在写方面则分为可写/不可写集合。
Java中List、Set集合都实现了Collection接口,Java中的Collection接口就已经包含了add方法,所以Java中所有List、Map集合都是可写的;
Kotlin中List、Set集合都实现了Collection接口,但是Collection接口没有add方法,Kotlin为Collection新增一个子接口MutableCollection,add方法定义到了MutableCollection中,只要实现了MutableCollection的List、Set集合都是可写的;
Kotlin为Map接口新增一个子接口MutableMap,put方法定义到了MutableMap接口中。
总结起来就是,使用MutableList、MutableSet、MutableMap创建的集合都是可写的, Mutable的意思本来也是“易变的,性情不定的”。
3.1 List
list的创建包括4种方法:
// 是否可写,看方法的返回值,List不可写
fun testList() {
// 返回List,不可写
var list1 : List<Int> = List<Int>(4) {
it
}
// 返回List,不可写
var list2 : List<Int> = listOf<Int>(1, 2, 3, 4)
// 返回ArrayList,可写
var list3 : ArrayList<Int> = arrayListOf<Int>(1, 2, 3, 4)
// 返回MutableList,可写
var list4 : MutableList<Int> = mutableListOf<Int>(1, 2, 3, 4)
}
// 不可写集合可以通过totoMutableList转换为可写集合,然后再进行写操作
fun testList() {
// 不可写
var list : List<Int> = listOf<Int>(1, 2, 3, 4)
// toMutableList之后,生成的新的List,原List没有变化!
var toMutableList = list.toMutableList()
toMutableList.add(5)
}
List的数据变换,可以通过slice、subList、drop、dropLast对集合进行变换,产生一个新的集合。
// slice()方法,对集合进行截取,产生一个新的集合,接收一个区间类型的参数。
fun testList() {
var list : List<Int> = listOf<Int>(1, 2, 3, 4)
// [0, 2] => 1,2,3
var list1 = list.slice(0..2)
// [0, 2) => 1,2
var list2 = list.slice(0 until 2)
}
3.2 Set
Set接口常用的实现类有哪些?HashSet、TreeSet和MutableSet。
3.3 Map
Map接口常用的实现类有哪些? HashMap、LinkedHashMap、TreeMap和MutableHashMap。
HashMap,基于Map接口哈希表实现,通过哈希表对其内部的映射关系快速查找,存取效率高,迭代无序。
LinkedHashMap,基于Map接口哈希表实现和链接列表实现,链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
TreeMap ,基于红黑树实现的,迭代根据其键的自然顺序进行排序,或者可以自行指定比较器。
// map的定义
fun testMap() {
var map1 = mapOf<String, Int>(
Pair("Jerry", 4),
Pair("Tom", 12)
)
var map2 = mapOf<String, Int>(
"Jerry" to 4,
"Tom" to 12
)
}
// Map变化
fun testMap() {
var map1 = mapOf<String, Int>(
"Jerry" to 4,
"Tom" to 12
)
// 产生新的map,对原map无影响
var plus = map1.plus("Jack" to 5)
// 产生新的map,对原map无影响
var minus = map1.minus("Tom")
}
4. 集合间的转化
Range, Array, List, Set, Map 互相之间,可以通过 arrayOf, toSet, toList等方法进行转换。