Kotlin相关面试题

185 阅读11分钟

目录

一.请简述下什么是kotlin?它有什么特性?

二.密封类与枚举的区别?

三.Kotlin 中注解 @JvmOverloads 的作用?

四.Kotlin中的MutableList与List有什么区别?

五.kotlin实现单例的几种方式?

六. kotlin中关键字data的理解?相对于普通的类有哪些特点?

七.什么是委托属性?简单说一下应用场景?

八.kotlin中with、run、apply、let函数的区别?一般用于什么场景?

九.kotlin中Unit的应用以及和Java中void的区别?

十.Kotlin 中 infix 关键字的原理和使用场景?

十一. Kotlin中的可见性修饰符有哪些?相比于 Java 有什么区别?

十二.你觉得Kotlin与Java混合开发时需要注意哪些问题?

十三.在Kotlin中,何为解构?该如何使用?

十四.在Kotlin中,什么是内联函数?有什么作用?

十五.谈谈kotlin中的构造方法?有哪些注意事项?

十六.谈谈Kotlin中的Sequence,为什么它处理集合操作更加高效?

十七.请谈谈Kotlin中的Coroutines,它与线程有什么区别?有哪些优点?

十八.Kotlin中该如何安全地处理可空类型?

十九.Kotlin中的?.然后后面调用方法如果为空的情况下是什么?如果是调用变量是什么情况?

二十.说说 Kotlin中 的 Any 与Java中的 Object 有何异同?

二十一.Kotlin中的数据类型有隐式转换吗?为什么?

二十二.Kotlin 中集合遍历有哪几种方式?

二十三.为什么协程比线程要轻量?

二十四.协程Flow是什么,有哪些应用场景?

二十五.协程Flow的冷流和热流是什么?

二十六.协程中可能遇到哪些问题?

 一.请简述下什么是kotlin?它有什么特性?

kotlin是一门编程语言,和java一样都是编译成class文件,然后被虚拟机加载。 kotlin是先在android官方优先采用的语言,相比Java,它有以下优势:

  • 富有表现力且简洁:您可以使用更少的代码实现更多的功能。表达自己的想法,少编写样板代码。在使用 Kotlin 的专业开发者中,有 67% 的人反映其工作效率有所提高。比如:MVVM中model层data数据类相对java实现数据类自动重写了get,set,equals,hashCode,toString、componentN、copy等方法,单例类可以直接使用object实现java饿汉单例模式,还有其他扩展函数、高阶函数、类型转换等等
  • 更安全的代码:Kotlin 有许多语言功能,可帮助您避免 null 指针异常等常见编程错误。包含 Kotlin 代码的 Android 应用发生崩溃的可能性降低了 20%。例如:可以通过 ? 进行判空,不为空的才能继续往下走;还有密封类防止出现其他分支的错误;还有对于类默认不可继承,方法默认不可重写(相当于java中final) ,如果需要继承或者重写都需要加open关键字,字段建议使用val,不可变。
  • 可互操作:您可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotlin 代码。 Kotlin 可完全与 Java 编程语言互操作,因此您可以根据需要在项目中添加任意数量的 Kotlin 代码。
  • 结构化并发:Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。

kotlin密封类与枚举的区别:区别

二.密封类与枚举的区别?

密封类总结:

  • 密封类用于表示受限制的类层次结构
  • 从某种意义上说,密封类是枚举类的扩展
  • 枚举的不同之处在于,每个枚举常量仅作为单个实例存在,而Sealed Classes的子类可以表示不同状态的实例

密封类用于表示受限制的类层次结构

  • 用于表示层级关系:密封类的子类可以是任意的类,数据类、kotlin对象、普通的类、甚至也可以是一个Sealed Classes
  • 受限制:必须在同一文件中或者在Sealed Classes类的内部使用

Sealed Classes是枚举类的扩展

是否只有一个实例是否是同一类型是否反序列化是否是线程安全是否懒加载
枚举类
密封类

Sealed是一个abstract类,它本身不能被实例化,只能用它的子类实例化对象。Sealed的构造方法私有化,禁止在Sealed所定义的文件外使用。

在什么情况下使用枚举或者Sealed?

  • 如果涉及到反序列化创建对象的时候建议使用枚举
  • 如果你不需要多次实例化,也不需要提供特殊行为,或者也不需要添加额外信息,仅作为一个单例表示状态,这个时候使用枚举更加合适,其他情况下使用Sealed Classes

三.Kotlin 中注解 @JvmOverloads 的作用?

Kotlin@JvmOverloads注解的作用就是:在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。如果没有加注解@JvmOverloads则只有一个方法,kotlin调用的话如果没有传入的参数用的是默认值。

@JvmOverloads fun f(a: String, b: Int=0, c:String="abc"){
}
// 相当于Java三个方法 不加这个注解就只能当作第三个方法这唯一一种方法
void f(String a)
void f(String a, int b)
// 加不加注解,都会生成这个方法
void f(String a, int b, String c)

四.Kotlin中的MutableList与List有什么区别?

List:有序接口,只能读取,不能更改元素;
MutableList:有序接口,可以读写与更改、删除、增加元素。

源码分析MutableList就相当于Java中的ArrayListList是kotlin自己重写的EmptyList,EmptyList中没有提供add方法remove方法等修改元素操作的方法。

internal object EmptyList : List, Serializable, RandomAccess {
    private const val serialVersionUID: Long = -7390468764508069838L
    
    override fun equals(other: Any?): Boolean = other is List<*> && other.isEmpty()
    override fun hashCode(): Int = 1
    override fun toString(): String = "[]"
    
    override val size: Int get() = 0
    override fun isEmpty(): Boolean = true
    override fun contains(element: Nothing): Boolean = false
    override fun containsAll(elements: Collection<Nothing>): Boolean = elements.isEmpty()

    override fun get(index: Int): Nothing = throw IndexOutOfBoundsException("Empty list             doesn't contain element at index $index.")
    override fun indexOf(element: Nothing): Int = -1
    override fun lastIndexOf(element: Nothing): Int = -1

    override fun iterator(): Iterator<Nothing> = EmptyIterator
    override fun listIterator(): ListIterator<Nothing> = EmptyIterator
    override fun listIterator(index: Int): ListIterator<Nothing> {
        if (index != 0) throw IndexOutOfBoundsException("Index: $index")
        return EmptyIterator
    }

    override fun subList(fromIndex: Int, toIndex: Int): List<Nothing> {
        if (fromIndex == 0 && toIndex == 0) return this
        throw IndexOutOfBoundsException("fromIndex: $fromIndex, toIndex: $toIndex")
    }

    private fun readResolve(): Any = EmptyList
}

后续内容关注微信公众号查阅:

31ba1bee6c9f9dd372abd6ea309144d.png