kotlin⾯试题
在本⽂中,将分享⼀些在 Android ⾯试中被问到的⽐较多的Kotlin 相关问题。所以,如果你正在准备 Android ⾯试,那么这篇⽂章对你来说是很有必要看的,或者收藏起来,转载起来...
对每个问题都提供了简短明了的答案,此外,您也可以通过该链接。
1. Kotlin 如何在 Android 上运⾏?
就像 Java ⼀样,Kotlin 代码也被编译成 Java 字节码,并在运⾏时由 Java 虚拟机即 JVM 执⾏。当⼀个名为 Kotlin 的⽂件Main.kt被编译后,它最终会变成⼀个类,然后⽣成该类的字节码。字节码⽂件的名称将是MainKt.class,并且该⽂件将由 JVM 执⾏。
2. 为什么要使⽤ Kotlin?
Kotlin 简洁
Kotlin 是空值安全的
Kotlin 是可互操作的
3. ⽤var和val声明变量有什么区别?
如果你想声明⼀些可变(可变)变量,那么你可以使⽤var. 对于不可变变量,使⽤valieval变量⼀旦赋值就不能改变。
4. ⽤val和const声明变量有什么区别?
声明的变量本质val上const都是不可变的。但是const变量的值必须在编译时知道,⽽val变量的值也可以在运⾏时分配。
5. Kotlin 中如何保证 null 安全?
使⽤ Kotlin 的主要优势之⼀是 null 安全性。在 Java 中,如果您访问⼀些 null 变量,那么您将获得⼀个NullPointerException. 因
此,Kotlin 中的以下代码将产⽣编译时错误:
var name: String = "码农乐园"
name = null //error
因此,要将空值分配给变量,您需要将name变量声明为可空字符串,然后在访问此变量期间,您需要使⽤安全调⽤运算符,即?.
var name: String? = "码农乐园"
print(name?.length) // ok
name = null // ok
6.安全调⽤(?.)和空值检查(!!)有什么区别?
安全调⽤运算符 ie?.⽤于检查变量的值是否为空。如果为 null 则返回 null ,否则返回所需的值。
var name: String? = "码农乐园"
println(name?.length) // 8
name = null
println(name?.length) // null
如果要在变量值为 null 时抛出 NullPointerException,则可以使⽤ null 检查或!!运算符。
var name: String? = "码农乐园"
println(name?.length) // 8
name = null
kotlin 高阶函数println(name!!.length) // KotlinNullPointerException
7. Kotlin 中是否有像 java ⼀样的三元运算符?
不,我们在 Kotlin 中没有三元运算符,但您可以通过 if-else 或 Elvis 运算符来使⽤三元运算符的功能。
8. Kotlin 中的 Elvis 运算符是什么?
在 Kotlin 中,您可以使⽤ null 安全属性将 null 值分配给变量。要检查⼀个值是否具有空值,那么您可以使⽤ if-else 或可以使⽤ Elvis 运算符?:,例如:
var name:String? = "码农乐园"
val nameLength = name?.length ?: -1
println(nameLength)
上⾯使⽤的 Elvis 运算符(?:)将返回 name 的长度,如果 value 不为 null,否则如果 value 为 null,则返回-1。
9. 如何将 Kotlin 源⽂件转换为 Java 源⽂件?
将 Kotlin 源⽂件转换为 Java 源⽂件的步骤:
在 IntelliJ IDEA / Android Studio 中打开您的 Kotlin 项⽬。
然后导航到⼯具 > Kotlin > 显⽰ Kotlin 字节码。
现在单击反编译按钮以从字节码中获取您的 Java 代码。
10、@JvmStatic、@JvmOverloads、@JvmFiled 在 Kotlin 中有什么⽤?
@JvmStatic:这个注解⽤来告诉编译器该⽅法是静态⽅法,可以在Java代码中使⽤。
@JvmOverloads:要在 Java 代码中使⽤ Kotlin 代码中作为参数传递的默认值,我们需要使⽤@JvmOverloads注解。
@JvmField:要在不使⽤任何 getter 和 setter 的情况下从 Java 代码访问 Kotlin 类的字段,我们需要@JvmField在 Kotlin 代码中使⽤。
11. Kotlin 中的数据类是什么?
数据类是那些仅⽤于存储⼀些数据的类。在 Kotlin 中,它被标记为数据。以下是相同的⽰例:
data class Developer(val name: String, val age: Int)
当我们将⼀个类标记为数据类时,您不必像我们在 Java 中那样实现或创建以下函数:hashCode()、equals()、toString()、copy()。编译器会在内部⾃动创建这些,因此也可以⽣成⼲净的代码。虽然,数据类需要满⾜的其他要求很少。
12、Kotlin中可以使⽤int、double、float等原始类型吗?
在 Kotlin 中,我们不能直接使⽤原始类型。我们可以使⽤ Int、Double 等类作为基元的对象包装器。但是编译后的字节码具有这些原始类型。
13. Kotlin 中的字符串插值是什么?
如果您想在字符串中使⽤某个变量或执⾏某些操作,则可以使⽤字符串插值。您可以使⽤$符号来使⽤字符串中的某些变量,也可以在{}符号之间执⾏⼀些操作。
var name = "码农乐园"
print("Hello! I am learning from $name")
14. Kotlin 中的解构是什么意思?
解构是⼀种从存储在(可能是嵌套的)对象和数组中的数据中提取多个值的便捷⽅式。它可⽤于接收数据的位置(例如分配的左侧)。有时将⼀个对象分解为多个变量是很⽅便的,例如:
val (name, age) = developer
现在,我们可以独⽴使⽤姓名和年龄,如下所⽰:
println(name)
println(age)
从 MindOrks 博客了解有关 Kotlin 解构的更多信息。
15. Kotlin 中什么时候使⽤ lateinit 关键字?
lateinit是后期初始化。
通常,声明为⾮空类型的属性必须在构造函数中初始化。然⽽,这通常并不⽅便。
例如,可以通过依赖注⼊来初始化属性,或者在单元测试的 setup ⽅法中初始化属性。在这种情况下,您不能在构造函数中提供⾮ null 初始化程序,但您仍然希望在引⽤类主体内的属性时避免 null 检查。要处理这种情况,您可以使⽤ lateinit 修饰符标记该属性。
16. 如何检查⼀个lateinit变量是否已经初始化?
您可以在⽅法的帮助下使⽤它之前检查 lateinit 变量是否已初始化isInitialized。如果 lateinit 属性已初始化,则此⽅法将返回 true,否则将返回 false。例如:
class Person {
lateinit var name: String
fun initializeName() {
println(this::name.isInitialized)
name = "MindOrks" // initializing name
println(this::name.isInitialized)
}
}
fun main(args: Array<String>) {
Person().initializeName()
}
17. Kotlin 中的 lateinit 和 lazy 有什么区别?
lazy 只能⽤于 val 属性,⽽ lateinit 只能⽤于 var,因为它不能编译为 final 字段,因此不能保证不变性。
如果您希望您的属性以⼀种事先可能未知的⽅式从外部初始化,请使⽤ lateinit。
18、==操作符和===操作符有什么区别?
是的。==运算符⽤于⽐较变量中存储的值,运算===符⽤于检查变量的引⽤是否相等。但是在原始类型的情况下,===操作符也会检查值⽽不是引⽤。
// primitive example
val int1 = 10
val int2 = 10
println(int1 == int2) // true
println(int1 === int2) // true
// wrapper example
val num1 = Integer(10)
val num2 = Integer(10)
println(num1 == num2) // true
println(num1 === num2) //false
19. Kotlin 中的 forEach 是什么?
在 Kotlin 中,要像在 Java 中⼀样使⽤ for-each 循环的功能,我们使⽤forEach函数。以下是相同的⽰例:
var listOfMindOrks = listOf("码农乐园", "阿福", "dom")
listOfMindOrks.forEach {
Log.d(TAG,it)
}
20. Kotlin 中的伴⽣对象是什么?
在 Kotlin 中,如果您想编写⼀个函数或任何可以在没有类实例的情况下调⽤的类成员,那么您可以将其编写为类中伴随对象的成员。要创建伴⽣对象,您需要companion在对象声明前添加关键字。
以下是 Kotlin 中伴随对象的⽰例:
class ToBeCalled {
companion object Test {
fun callMe() = println("You are calling me :)")
}
}
fun main(args: Array<String>) {
ToBeCalled.callMe()
}
21. Kotlin 中的 Java 静态⽅法等价物是什么?
要在 Kotlin 中实现类似于 Java 静态⽅法的功能,我们可以使⽤:
伴⽣对象
包级函数
⽬的
22. Kotlin 中的 FlatMap 和 Map 有什么区别?
FlatMap ⽤于将列表的所有项⽬组合成⼀个列表。
Map ⽤于根据特定条件转换列表。
23. Kotlin 中的 List 和 Array 类型有什么区别?
如果您有⼀个具有固定⼤⼩的数据列表,那么您可以使⽤数组。但是如果列表的⼤⼩可以变化,那么我们必须使⽤可变列表。
24. Kotlin中可以使⽤new关键字实例化⼀个类对象吗?
不,在 Kotlin 中,我们不必使⽤new关键字来实例化类对象。要实例化⼀个类对象,我们只需使⽤:
var varName = ClassName()
25. Kotlin 中的可见性修饰符是什么?
可见性修饰符或访问说明符或访问修饰符是⼀个概念,⽤于定义编程语⾔中某事物的范围。在 Kotlin 中,我们有四个可见性修饰符:private:在包含声明的特定类或⽂件中可见。
protected:在特定类或⽂件中可见,并且在声明它的特定类的⼦类中可见。
internal:在该特定模块中的任何地⽅都可见。
公开:对所有⼈可见。
注意:默认情况下,Kotlin 中的可见性修饰符是public。
26. 如何在 Kotlin 中创建 Singleton 类?
单例类是这样定义的类,即只能创建该类的⼀个实例,并在我们只需要该类的⼀个实例的情况下使⽤,例如⽇志记录、数据库连接等。
要在 Kotlin 中创建 Singleton 类,您需要使⽤ object 关键字。
object AnySingletonClassName
注意:不能在对象中使⽤构造函数,但可以使⽤ init。
27. Kotlin 中的初始化块是什么?
init块是在主构造函数执⾏后⽴即执⾏的初始化块。⼀个类⽂件可以有⼀个或多个将串⾏执⾏的初始化块。如果你想在主构造函数中执⾏⼀些操作,那么在 Kotlin 中是不可能的,为此你需要使⽤init块。
28. Kotlin 中的构造函数有哪些类型?
主构造函数:这些构造函数是在类头中定义的,你不能在其中执⾏⼀些操作,这与 Java 的构造函数不同。
辅助构造函数:这些构造函数是在类体内使⽤构造函数关键字声明的。您必须从辅助构造函数显式调⽤主构造函数。此外,不能在辅助构造函数中声明类的属性。Kotlin 中可以有多个⼆级构造函数。
29、主构造函数和次构造函数之间有什么关系吗?
是的,当使⽤辅助构造函数时,您需要显式调⽤主构造函数。
30. 构造函数中使⽤的默认参数类型是什么?
默认情况下,val 中构造函数的参数类型。但是您可以将其显式更改为 var 。
31. Kotlin 中的协程是什么?
⼀个以更⾼效和更简单的⽅式管理并发的框架,其轻量级线程编写在实际线程框架之上,通过利⽤函数的协作特性来充分利⽤它。
同步的⽅式做异步事件
这是⼀个重要的⾯试问题。
32. Kotlin Coroutines 中的挂起函数是什么?
挂起函数是 Kotlin 中协程的构建块。挂起函数是⼀个可以启动、暂停和恢复的函数。要使⽤挂起函数,我们需要在普通函数定义中使⽤挂起关键字。
33. Kotlin Coroutines 中 Launch 和 Async 有什么区别?
不同之处在于launch{}不返回任何内容,⽽是async{}返回 的实例Deferred<T>,该实例具有await()返回协程结果的函数,就像我们在Java 中的 future 中()获取结果⼀样。
换⼀种说法:
发射:⼀劳永逸
async:执⾏任务并返回结果
34. Kotlin Coroutines 中的作⽤域是什么?
35. Kotlin Coroutines 中的异常处理是如何完成的?
36. 在 Kotlin 中如何在 switch 和 when 之间进⾏选择?
每当我们想要处理许多 if-else 条件时,我们通常会使⽤ switch-case 语句。但是 Kotlin 提供了⼀个更简洁的选项,即在 Kotlin 中,我们可以使⽤ when 来代替 switch。并且,何时可以⽤作:
表达
任意条件表达式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论