Kotlin面试题(持续更新)

1.Kotlin初始化一个数组
val number:IntArray = intArrayOf(10,20,30)

2.fold 和reduce 区别

在 Kotlin 中,fold和reduce都是用于对集合进行聚合操作的函数,它们的基本区别如下:

一、语法和参数

fold函数的语法为:fold(initial: R, operation: (acc: R, T) -> R): R。它接收一个初始值initial和一个函数operation,函数接收一个累加器(初始值类型为R)和集合中的元素(类型为集合元素类型T),并返回一个新的累加器值。最终返回的结果类型也是R。
reduce函数的语法为:reduce(operation: (T, T) -> T)。它接收一个函数operation,函数接收两个集合中的元素(类型为集合元素类型T),并返回一个新的元素值。最终返回的结果类型是集合元素类型T。
二、是否需要初始值

fold必须提供一个初始值,这个初始值在整个聚合过程的开始就被使用,并且决定了最终结果的类型。
reduce在处理一些集合时可能不需要初始值,但如果集合为空,会抛出异常。对于不可变集合,如果没有初始值,它会使用集合的第一个元素作为初始值进行聚合操作。
三、使用场景举例

1.使用fold:

假设我们有一个整数列表,想要计算列表中所有元素的总和,可以使用fold如下:

   val list = listOf(1, 2, 3, 4, 5)
   val sum = list.fold(0) { acc, element -> acc + element }
   println(sum) // 15
在这个例子中,初始值为 0,每次迭代将累加器和列表中的元素相加,最终得到列表元素的总和。

2.使用reduce:

同样对于计算整数列表中所有元素的总和,如果确定列表不为空,可以使用reduce:

   val list = listOf(1, 2, 3, 4, 5)
   val sum = list.reduce { a, b -> a + b }
   println(sum) // 15
这里直接对列表中的两个元素进行操作,逐步将结果累加到最终的总和。

综上所述,fold和reduce在 Kotlin 中都是强大的聚合操作函数,但在使用时需要根据具体情况选择合适的函数。如果需要一个初始值来确保结果的类型或者处理空集合的情况,fold是更好的选择。如果集合不为空且不需要初始值,reduce可以提供更简洁的语法。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/challenge51all/article/details/141933329

3.var与val的区别

1. val(value):

val 声明的变量是不可变的(immutable),一旦初始化后,其值不能被修改。
通常情况下,应优先使用 val,因为不可变性有助于代码的安全性和可维护性。
常用于声明常量、不会改变的配置、函数返回值等。
   val pi = 3.14
   val message = "Hello, Scala!"
   
2. var(variable):

var 声明的变量是可变的(mutable),可以重新赋值。
在需要变化的情况下使用 var,比如循环中的计数器、需要动态更新的状态等。
不可变性是函数式编程的重要概念,但在一些情况下,可变性是必要的,比如在某些算法中需要不断更新状态。
   var counter = 0
   counter = counter + 1
   
一般来说,尽量使用 val 来声明变量,因为它有利于代码的健壮性和可读性。只有在确实需要可变性的情况下才使用 var。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/2401_87076475/article/details/141815723

4.kotlin在哪里使用var和where val 

 作为类型约束(在泛型中)

在 Kotlin 的泛型编程中,where 子句可以用来指定类型约束。在这种情况下,你可以使用 var 或 val 来指定一个类型参数是否应该被视为可变引用(即,其引用可以被改变,但引用的对象本身不变)或不可变引用(即,引用的对象不能被替换)。

5.kotlin 的数据类

Kotlin 基本数据类型

Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。

不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。

整数类型

  • Byte: 8 位,范围从 -128 到 127。
  • Short: 16 位,范围从 -32,768 到 32,767。
  • Int: 32 位,范围从 -2^31 到 2^31 - 1。
  • Long: 64 位,范围从 -2^63 到 2^63 - 1。

浮点数类型

  • Float: 32 位,单精度,带有 6-7 位有效数字。
  • Double: 64 位,双精度,带有 15-16 位有效数字。

字符类型

  • Char: 16 位的 Unicode 字符。

布尔类型

  • Boolean: 有两个值:true 和 false

字符串类型

  • String: 一系列字符的序列。

数组类型

Kotlin 提供了数组类型来存储同种类型的元素,例如:

  • IntArray: 存储 Int 类型的数组。
  • DoubleArray: 存储 Double 类型的数组。
  • Array<T>: 泛型数组,可以存储任意类型。

6.kotlin 单例怎么创建

一、对象表达式

可以使用对象表达式来创建单例。这种方式非常简洁,直接在需要的地方定义一个对象即可。

object Singleton {
    fun doSomething() {
        println("Singleton is doing something.")
    }
}
使用时直接通过对象名调用方法:

Singleton.doSomething()

二、伴生对象实现单例

在一个类中,可以使用伴生对象来创建类似于单例的行为。伴生对象在类加载时被创建,并且在整个应用程序中只有一个实例。

class SingletonClass {
    companion object {
        val instance: SingletonClass by lazy { SingletonClass() }
    }
}
使用时可以通过类名和伴生对象的名称来访问单例实例:

SingletonClass.instance.doSomething()
三、使用委托实现单例

可以使用委托属性来实现单例模式。这种方式可以将单例的创建和管理委托给另一个对象。

class SingletonDelegate private constructor() {
    fun doSomething() {
        println("SingletonDelegate is doing something.")
    }
 
    companion object {
        val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { SingletonDelegate() }
    }
}
 
object SingletonByDelegate {
    val singleton by lazy { SingletonDelegate.instance }
}
使用时通过委托对象来调用方法:

SingletonByDelegate.singleton.doSomething()
四、单例的优势和注意事项

优势:

全局只有一个实例,节省内存资源,特别是在需要频繁创建和销毁对象的情况下。
方便管理全局状态,例如配置信息、数据库连接等。
注意事项:

单例可能会导致代码的可测试性降低,因为很难模拟单例对象的行为。在测试时,可以考虑使用依赖注入等技术来解决这个问题。
过度使用单例可能会导致代码的耦合度增加,不利于代码的维护和扩展。应该根据实际情况合理使用单例模式。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/challenge51all/article/details/141939406

5.kotlin 伴生对象的用途

Kotlin 伴生对象(Companion Object)是一种特殊的类成员,它允许你在不创建类实例的情况下访问类的静态方法和属性。伴生对象在 Kotlin 中非常有用,因为它们提供了一种简洁的方式来组织和使用静态方法和属性。以下是 Kotlin 伴生对象可以执行的一些操作:

  1. 定义静态方法和属性:伴生对象允许你在类中定义静态方法和属性,这样你就可以在不创建类实例的情况下访问它们。
class MyClass {
    companion object {
        const val MY_CONSTANT = "Hello, World!"
        fun myStaticFunction() {
            println("This is a static function.")
        }
    }
}

  1. 使用伴生对象进行工厂方法:你可以使用伴生对象来实现工厂方法,这样可以在不暴露构造函数的情况下创建类的实例。
class MyClass {
    companion object {
        fun createInstance(param: String): MyClass {
            return MyClass(param)
        }
    }

    constructor(param: String) {
        println("Creating instance with parameter: $param")
    }
}

  1. 实现单例模式:通过伴生对象,你可以轻松地实现单例模式,确保一个类只有一个实例。
class Singleton {
    companion object {
        private var instance: Singleton? = null

        fun getInstance(): Singleton {
            return instance ?: synchronized(this) {
                instance ?: Singleton().also { instance = it }
            }
        }
    }
}

复制代码

  1. 使用伴生对象进行扩展:你可以使用伴生对象为现有类添加新的功能,而无需继承该类或使用其他设计模式。
fun String.myExtensionFunction() {
    println("This is an extension function for String.")
}

class MyClass {
    companion object {
        fun printMyExtensionFunction() {
            "Hello, World!".myExtensionFunction()
        }
    }
}

总之,Kotlin 伴生对象提供了一种简洁、高效的方式来组织和使用静态方法和属性,使你的代码更加模块化和易于维护。

6.lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 )


在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ;

对于 lateinit 延迟初始化 的属性 , 在使用前可以执行

代码语言:javascript

复制

::属性名称.isInitialized

检查 , 查看该属性是否进行了初始化操作 ;

代码示例 :

代码语言:javascript

复制

class Hello{
    lateinit var name: String

    fun logName() {
        if(::name.isInitialized) {
            println("name 属性值为 $name")
        } else {
            println("name 属性没有进行初始化操作")
        }
    }
}

fun main() {
    var hello = Hello()
    hello.logName()

    hello.name = "Tom"
    hello.logName()
}

执行结果 :

代码语言:javascript

复制

name 属性没有进行初始化操作
name 属性值为 Tom
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值