MST

星途 面试题库

面试题:Kotlin中如何实现数据的不可变性

在Kotlin中,描述一下如何定义不可变的数据结构,例如不可变的集合。并且说明val关键字在实现不可变性方面起到了什么作用,以及它和Java中final关键字的区别。
17.5万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

定义不可变数据结构(以集合为例)

在Kotlin中,可以使用 kotlin.collections.immutable 包下的函数来创建不可变集合。例如:

  • 不可变List
val immutableList = listOf(1, 2, 3)

listOf 函数创建的 List 是不可变的,不能添加、删除或修改元素。

  • 不可变Set
val immutableSet = setOf(1, 2, 3)

setOf 函数创建的 Set 同样是不可变的。

  • 不可变Map
val immutableMap = mapOf("key1" to 1, "key2" to 2)

mapOf 函数创建的 Map 也是不可变的。

val关键字在实现不可变性方面的作用

val 关键字用于声明只读变量。一旦使用 val 声明了一个变量,它就不能再被重新赋值。例如:

val number = 10
// number = 20 // 这行代码会报错,因为val声明的变量不可重新赋值

对于集合等数据结构,val 确保引用本身不可变。如果是不可变集合,就从引用和内容两方面保证了不可变性。如果是可变集合,虽然引用不可变,但集合内容依然可变。例如:

val mutableList = mutableListOf(1, 2, 3)
// mutableList = mutableListOf(4, 5, 6) // 报错,引用不可变
mutableList.add(4) // 可以修改集合内容

val关键字和Java中final关键字的区别

  • 声明对象引用
    • 在Kotlin中,val 声明的变量引用不可变,但对象内容不一定不可变(如 mutableList 的例子)。
    • 在Java中,final 修饰的变量引用同样不可变。对于对象引用,若对象是可变的,依然可以修改对象内容。例如:
final List<Integer> list = new ArrayList<>();
list.add(1); // 可以修改集合内容
  • 声明基本类型变量
    • Kotlin中 val 声明基本类型变量,一旦赋值不能改变。
    • Java中 final 修饰基本类型变量也是一旦赋值不能改变。例如:
val num = 10
// num = 20 // 报错
final int num = 10;
// num = 20; // 报错
  • 使用场景
    • Kotlin的 val 更简洁,符合Kotlin语言简洁的特性,广泛用于声明只读变量。
    • Java的 final 不仅用于变量,还大量用于修饰类(表示该类不能被继承)和方法(表示该方法不能被重写),而Kotlin中用 final 修饰类和方法有不同的关键字,如 final 类默认不可继承,open 关键字使类可继承;final 方法默认不可重写,open 关键字使方法可重写。