目录
三.Kotlin 中注解 @JvmOverloads 的作用?
四.Kotlin中的MutableList与List有什么区别?
六. kotlin中关键字data的理解?相对于普通的类有哪些特点?
八.kotlin中with、run、apply、let函数的区别?一般用于什么场景?
九.kotlin中Unit的应用以及和Java中void的区别?
十一. Kotlin中的可见性修饰符有哪些?相比于 Java 有什么区别?
十二.你觉得Kotlin与Java混合开发时需要注意哪些问题?
十六.谈谈Kotlin中的Sequence,为什么它处理集合操作更加高效?
十七.请谈谈Kotlin中的Coroutines,它与线程有什么区别?有哪些优点?
十九.Kotlin中的?.然后后面调用方法如果为空的情况下是什么?如果是调用变量是什么情况?
二十.说说 Kotlin中 的 Any 与Java中的 Object 有何异同?
一.请简述下什么是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中的ArrayList,List是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
}
后续内容关注微信公众号查阅: