Kotlin 细节三:集合与泛型

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 ")
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值