一.请简述下什么是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 = -1override 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 thisthrow IndexOutOfBoundsException("fromIndex: $fromIndex, toIndex: $toIndex")
}private fun readResolve(): Any = EmptyList

}

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/gongjdde/article/details/124001671