Kotlin 的Collections 与Java 的关系
Kotlin 通过typealias 关键字将 Kotlin 的集合映射为 java的集合。
目的是:为了以后在更多的平台上运行。只提供接口,具体实现依赖于平台。
@SinceKotlin("1.1") public actual typealias RandomAccess = java.util.RandomAccess
@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>
Kotlin 集合的创建方式,与默认映射关系
Kotlin 中的数组和集合都有两种创建方式
一种是工厂类的 带泛型参数的顶层方法 XXXof。
一种是直接实例化java类
val list = listOf<String>()
val list2 = mutableListOf<String>()
var list3 = ArrayList<String>()
Kotlin 中 默认的映射关系。
List 的默认实现是 ArrayList。
Set的默认实现 - LinkedHashSet – 保留元素插入的顺序。
Map 的默认实现 – LinkedHashMap – 迭代 Map 时保留元素插入的顺序。
Kotlin 的可变集合和 不可变集合,及泛型的型变
Kotlin 集合接口之间的关系。
其中 List 、Set 、Map 接口是没有 add 和 remove 之类方法的 。 这种类型的集合也就是 不可变集合
MutableXXX 则提供了 增删方法。
Kotlin 为什么要设计出 不可变集合,需要涉及到泛型的特性: 型变 、协变、逆变
java 的泛型是不支持型变的 :
List<String> strs = new ArrayList<String>();
List<Object> objs = strs; // 编译报错
Kotlin只读集合是支持型变的
val list = listOf<String>()
// 型变测试 。 只读集合 ,String 是 CharSequence 的子类。 List< String > 类型可以赋值给 List< CharSequence> 类型
// 这种操作在java 中是不允许的。 因为写操作是不安全的 。但是对于只读集合来说就没这个问题。
var parentList = listOf<CharSequence>();
parentList = list
Pair 和解构
在创建Map 的时候,我们可以使用 中缀表达式 to 创建 Pair 类对象,也就是Map 类似Entry 的键值对
val p = "张三" to 25
val p2 = "王2" to 10
var (x,y)= p;
print(" 解构与Pair + $x + $y")
val map:Map<String,Int> = mapOf(p,p2)
集合的 访问与遍历
List 的 遍历:
集合框架的遍历 和数组一样,kotlin 优化掉了 声明关键字 var
val list = listOf<String>("one","two","three")
for( i in list.indices){
print(" 通过传统的数组下标 访问"+list.get(i))
println(" 可以通过类似数组下标的方式访问 ${list[i]}")
}
for(str in list){
print("通过 和java forEach 类似的方式遍历 ")
}
Set 的遍历
Kotlin 也没有提供 按下标访问的功能 。。
// Set 的 访问与遍历
var set = setOf(1,2,3,4)
var b = set.contains(2)
for(i in set){
print(" 又遍历 了 $i")
}
Map :
// Map 的访问
val p = "张三" to 25
val p2 = "王2" to 10
val map:Map<String,Int> = mapOf(p,p2)
val zhangsanAge = map["张三"]
val zhangsanAge2 = map.get("张三")
// Map 的遍历 ,和java 的EntrySet 类似,只不过通过解构来 减少代码
for((x,y) in map){
println(" $x + $y ")
}