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