每天10道:Android面试题整理四(kotlin)
前几年到处都在说这个要取代java来开发安卓应用,目前看很少有用这个语言的,关于安卓开发的书依旧讲的用java。Android开发面试依旧是会有些公司会询问的关于kotlin的问题
由于怕文章太长我就不做太多说明了,看题目就知道这是啥了,ok,废话不多说,看下面整理出来的题,希望可以对想从事Android开发的兄弟姐妹们有所帮助,下面的题整理出来的,并不全面,欢迎各位提问和补充!Android面试题和答案已按照规范已整理完成,大家可看文末或评论/私信,一起交流技术、进阶提升~
1. Kotlin 中的数据类是什么?
我们经常创建主要目的是保存数据的类。在 Kotlin 中,这称为数据类并标记为data:
data class User(val name: String, val age: Int)
为了确保生成代码的一致性和有意义的行为,数据类必须满足以下要求:
- 主构造函数至少需要一个参数;
- 所有主要的构造函数参数都需要标记为 val 或 var;
- 数据类不能是抽象的、开放的、密封的或内部的;
2. Kotlin 中伴随对象的用途是什么?
与 Java 或 C# 不同,Kotlin 没有static成员或成员函数。如果您需要编写一个可以在没有类实例的情况下调用但需要访问类内部的函数,您可以将其编写为该类中伴随对象声明的成员。
class EventManager { companion object FirebaseManager { } } val firebaseManager = EventManager.FirebaseManager
伴随对象是单例。伴生对象本身就是一个合适的对象,并且可以有自己的超类型 - 您可以将它分配给一个变量并传递它。如果您正在与 Java 代码集成并需要一个真正的静态成员,您可以使用@JvmStatic.
3. Kotlin 中的协程是什么?
与许多其他具有类似功能的语言不同,async 和 await 不是 Kotlin 中的关键字,甚至不是其标准库的一部分。
kotlinx.coroutines是由 JetBrains 开发的丰富的协程库。它包含许多支持协程的高级原语,包括launch等async。Kotlin Coroutines 为您提供了一个 API 来按顺序编写异步代码。
文档说 Kotlin 协程就像轻量级线程。它们是轻量级的,因为创建协程不会分配新线程。相反,它们使用预定义的线程池和智能调度。调度是确定您接下来将执行哪一项工作的过程。
此外,协程可以在执行过程中暂停和恢复。这意味着您可以有一个长时间运行的任务,您可以一点一点地执行它。您可以暂停它任意次数,并在您再次准备好时恢复它。
4. Kotlin 中的“open”和“public”有什么区别?
- open关键字的意思是“为扩展而开放” 。类上的 open 注释与 Java 的相反final:它允许其他人从该类继承。
- 如果您不指定任何可见性修饰符,则默认使用public,这意味着您的声明将在任何地方可见。如果没有明确指定其他内容,则public是默认值。
5. 你什么时候会在 Kotlin 中使用 Elvis 运算符?
Elvis 运算符是许多编程语言的一部分,例如 Kotlin 以及 Groovy 或 C#。Elvis 运算符是省略了第二个操作数的三元运算符。
x ?: y // yields `x` if `x` is not null, `y` otherwise.
如果x不为空,则返回。如果为 null,则将y返回
6. Kotlin 泛型中的“*”和“Any”有什么区别?
- List<*>可以包含任何类型的对象,但只能包含该类型,因此它可以包含Strings(但只能Strings)
- whileList<any>可以包含Strings和Integers诸如此类,都在同一个列表中</any>
7. Kotlin中集合遍历有哪几种方式?
for,foreach,while,do while,递归,还有集合的高阶方法
8. Kotlin 中 infix 关键字的原理和使用场景?
使用场景是用来修饰函数,使用了 infix 关键字的函数称为 中缀函数,使用时可以省略 点表达式和括号。让代码看起来更加优雅,更加语义化。
原理不过是编译器在语法层面给与了支持,编译为 Java 代码后可以看到就是普通的函数调用。
9. Kotlin 协程中的 launch/join 和 async/await 有什么区别?
launch用于触发并忘记协程。这就像开始一个新线程。如果内部的代码因launch异常而终止,则将其视为线程中未捕获的异常——通常在后端 JVM 应用程序中打印到 stderr 并使 Android 应用程序崩溃。join用于等待启动的协程完成,并且不会传播其异常。但是,崩溃的子协程也会取消其父协程,并出现相应的异常。
async用于启动计算某些结果的协程。结果由 的实例表示Deferred,您必须在其上使用await。异步代码中未捕获的异常存储在结果Deferred中,不会传递到其他任何地方,除非处理,否则它将被静默丢弃。你一定不要忘记你用异步启动的协程。
10. 如何建议在 Kotlin 中创建常量?
在 Kotlin 中,如果你想创建应该在类中使用的局部常量,那么你可以像下面这样创建它:
val MY_CONSTANT_1 = "Constants1" // or const val MY_CONSTANT_2 = "Constants2"
用关键字val定义的变量是不可变的。const这里的区别在于const 用于在编译时已知的变量。
还要避免使用伴随对象。在后台,为可访问的字段创建了 getter 和 setter 实例方法。调用实例方法在技术上比调用静态方法更昂贵。而是在 中定义常量object:
object DbConstants { const val TABLE_USER_ATTRIBUTE_EMPID = "_id" const val TABLE_USER_ATTRIBUTE_DATA = "data" }
公众号:Android Jasper 专注分享面试题|面试技巧|Android学习资料。(dd:16)