安卓 Kotlin 面试题 31-40

🔥  31、简述Kotlin 中的内联类,我们什么时候需要?🔥

有时,业务逻辑需要围绕某种类型创建包装器。

但是,由于额外的堆分配,它会引入运行时开销。

此外,如果包装的类型是原始类型,那么性能损失会很严重,因为原始类型通常由运行时进行大量优化。

内联类为我们提供了一种包装类型的方法,从而添加功能并自行创建新类型。

与常规(非内联)包装器相反,它们将受益于改进的性能。发生这种情况是因为数据被内联到其用法中,并且在生成的编译代码中跳过了对象实例化。 

inline class Name(val s: String) {val length: Intget() = s.lengthfun greet() {println("Hello, $s")}
}fun main() {val name = Name("Kotlin")name.greet() // method `greet` is called as a static methodprintln(name.length) // property getter is called as a static method
}

关于内联类的一些注意事项:

在主构造函数中初始化的单个属性是内联类的基本要求
内联类允许我们像普通类一样定义属性和函数
不允许初始化块、内部类和支持字段
内联类只能从接口继承
内联类也是有效的最终类

🔥  32、 解释什么是 Coroutine Scope,它与 Coroutine Context 有什么不同?🔥

协程总是在由Kotlin 标准库中定义的CoroutineContext类型的值表示的某些上下文中执行。

协程上下文是一组不同的元素。主要元素是协程的Job。

CoroutineScope本身没有数据,它只包含一个CoroutineContext。

它的关键作用是作为你传递给的块的隐式接收者launch,async等等。

runBlocking {val scope0 = this// scope0 is the top-level coroutine scope.scope0.launch {val scope1 = this// scope1 inherits its context from scope0. It replaces the Job field// with its own job, which is a child of the job in scope0.// It retains the Dispatcher field so the launched coroutine uses// the dispatcher created by runBlocking.scope1.launch {val scope2 = this// scope2 inherits from scope1}}
}

你可能会说CoroutineScope形式化了CoroutineContext的继承方式。

您可以看到CoroutineScope如何调解协程上下文的继承。如果您取消 中的作业scope1,这将传播到scope2并取消已启动的作业。

🔥  33、 如何覆盖 Kotlin 数据类的默认 getter?🔥 

给定以下 Kotlin 类:

data class Test(val value: Int)
0如果值为负,我将如何覆盖 Int getter 以便它返回?

在使用错误值调用构造函数之前,让创建数据类的业务逻辑将值更改为 0 或更大。对于大多数情况,这可能是最好的方法。

不要使用data cla***常规的class.

class Test(value: Int) {val value: Int = valueget() = if (field < 0) 0 else fieldoverride fun equals(other: Any?): Boolean {if (this === other) return trueif (other !is Test) return falsereturn true}override fun hashCode(): Int {return javaClass.hashCode()}
}
在执行您想要的操作的对象上创建一个额外的安全属性,而不是拥有一个被有效覆盖的私有值。data class Test(val value: Int) {val safeValue: Intget() = if (value < 0) 0 else value
}

🔥  34、如何在 Kotlin 中为数据类创建空的构造函数?🔥

如果您为所有字段提供默认值- Kotlin 会自动生成空构造函数。data class User(var id: Long = -1,
var uniqueIdentifier: String? = null)
你可以简单地调用:val user = User()
另一种选择是声明一个没有参数的辅助构造函数:data class User(var id: Long,var uniqueIdentifier: String?){constructor() : this(-1, null)
}

🔥 35、简述什么是 Kotlin 中的对象表达式以及何时使用它们?🔥 

有时我们需要创建一个稍加修改的类的对象,而不是显式地为它声明一个新的子类。Java 使用匿名内部类来处理这种情况。Kotlin 使用对象表达式来实现相同的功能。我们甚至可以通过实现它们的抽象方法来为接口或抽象类创建对象表达式。


它通常用作 Java 匿名类的替代品:

window.addMouseListener(object : MouseAdapter() {override fun mouseClicked(e: MouseEvent) {// ...
}override fun mouseEntered(e: MouseEvent) {// ...}
})

 🔥  36、 以下Koltin 代码有什么问题?🔥

假设我想重写 Int getter,以便在数据类的值为负时返回 0。这种方法有什么不好?data class Test(private val _value: Int) {val value: Intget() = if (_value < 0) 0 else _value
}

这种方法的问题在于,数据类并不真正意味着像这样改变数据。

它们实际上只是用于保存数据。

像这样覆盖数据类的 getter 意味着Test(0)andTest(-1)不会彼此相等并且会有不同hashCodes的 ,但是当你调用 时.value,它们会得到相同的结果。

这是不一致的,虽然它可能对您有用,但您团队中的其他人看到这是一个数据类,可能会不小心误用它。

 🔥  37、Kotlin 泛型中的“*”和“Any”有什么区别?🔥

List<*>可以包含任何类型的对象,但只能包含该类型,因此它可以包含Strings(但只能Strings)
whileList可以包含Strings和Integers诸如此类,都在同一个列表中

 

* 相当于java泛型的?,就是未知任意类型。Any 相当于Object类型

 🔥 38、假设您将代码从 Java 迁移到 Kotlin。你会如何在 Kotlin 中重写这段代码?🔥

public class Foo {private static final Logger LOG = LoggerFactory.getLogger(Foo.class);
}
使用类静态方法:class MyClass {companion object {val LOG = Logger.getLogger(MyClass::class.java.name)}fun foo() {LOG.warning("Hello from MyClass")}
}

 🔥  39、 Kotlin 协程在哪些方面优于 RxKotlin/RxJava?🔥

Kotlin 协程与 Rx 不同。两者都旨在解决异步编程的问题,但是它们的解决方法非常不同:

 Rx 带有一种特殊的函数式编程风格,几乎可以在任何编程语言中实现,而无需语言本身的支持。当手头的问题很容易分解为一系列标准运算符时,它运行良好,否则效果不佳。

 Kotlin 协程提供了一种语言特性,可以让库编写者实现各种异步编程风格,包括但不限于函数式反应风格 (Rx)。使用 Kotlin 协程,您还可以以命令式风格、基于 promise/futures 的风格、actor 风格等编写异步代码。

 Kotlin 协程如何优于 RxKotlin?您只需编写顺序代码,一切都像编写同步代码一样简单,除了它是异步执行的。它更容易掌握。

 协程更好地处理资源

在 RxJava 中,您可以将计算分配给调度程序,但subscribeOn()会ObserveOn()令人困惑。

每个协程都被赋予一个线程上下文并返回父上下文。

对于一个通道,双方(生产者、消费者)都在自己的上下文中执行。协程在线程或线程池做作上更直观。

协程可以更好地控制这些计算何时发生。

例如,对于给定的计算,您可以传递手 ( yield)、优先级 ( select)、并行化 (multiple producer/ actoron channel) 或锁定资源 ( )。

Mutex在服务器上(RxJava 首先出现)可能无关紧要,但在资源有限的环境中,可能需要这种级别的控制。 

由于它的反应性质,背压在 RxJava 中不太适合。

在通道的另一端send()是一个挂起函数,当达到通道容量时会挂起。

这是大自然赋予的开箱即用的背压。

您还offer()可以使用通道,在这种情况下,调用永远不会暂停,而是false在通道已满时返回,从而有效地onBackpressureDrop()从 RxJava 复制。

或者您可以编写自己的自定义背压逻辑,这对于协程来说并不困难,尤其是与使用 RxJava 做同样的事情相比。

🔥  40、 Kotlin 协程中的 launch/join 和 async/await 有什么区别?🔥 

launch用于触发并忘记协程。

这就像开始一个新线程。

如果内部的代码因launch异常而终止,则将其视为线程中未捕获的异常——通常在后端 JVM 应用程序中打印到 stderr 并使 Android 应用程序崩溃。

join用于等待启动的协程完成,并且不会传播其异常。

但是,崩溃的子协程也会取消其父协程,并出现相应的异常。

 async用于启动计算某些结果的协程。

结果由 的实例表示Deferred,您必须在其上使用await。

异步代码中未捕获的异常存储在结果Deferred中,不会传递到其他任何地方,除非处理,否则它将被静默丢弃。

你一定不要忘记你用异步启动的协程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

植物病害识别:YOLO茶叶病害识别数据集

茶叶病害识别数据集&#xff0c;3200多张茶叶病害图像数据&#xff0c;yolo标注完整&#xff0c;适用于茶叶病害识别&#xff0c;包含藻斑病、褐斑病、鸟眼斑病&#xff0c;炭疽病&#xff0c;红斑病5个类别。 增强方式&#xff1a;&#xff08;3倍增强&#xff09; 剪切&…

基于apicloud+vue的汽车服务系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 课题背景 3 1.1 课题的研究背景与意义 3 1.2研究现状 3 1.3本章小结 4 2 系统开发相关技术 5 2.1 ApiCloud开发工具 5 2.2 MVC架构模型 5 2.3 MySQL数据库 5 2.4 Hibernate、Spring框架 6 2.5 本章小结 6 3 系统分析 7 3.1 系统需求分析 …

Transformer中Self-Attention的详细解读

Transformer最早是在论文《Attention is All You Need》中提出的&#xff0c;目前已广泛应用于NLP领域&#xff0c;如语言翻译、文本分类、问答系统等。由于在产品规划中需要使用这样的模型结构&#xff0c;因此花了一些时间对其进行了一些学习理解。 除了阅读论文及配套的代码…

2024.1.31 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | NVIDIA 英伟达 2024 实习生招聘正在火热招聘中&#xff08;内推&#xff09; 实习 | NVIDIA 英伟达 2024 实习生招聘正在火热招聘中&#xff08;内推&#xff09; 2、校招&…

less 使用记录

官网less 1.把less转为css 在线转换网页&#xff1a; LESSTESTER - Less Sandbox 2.定义列表&#xff0c;循环生成颜色变量 // 定义列表 colors: blue, red, green;// 使用 each 函数循环遍历 colors 列表 .eachColor(index) when (index > 0) {// 获取当前颜色color: e…

JS-05-字符串

一、字符串的表示 JavaScript的字符串就是用...或"..."括起来的字符表示。 如果本身也是一个字符&#xff0c;那就可以用"..."括起来&#xff0c;比如&#xff1a; var a "Im ok"; 如果字符串内部既包含又包含"怎么办&#xff1f;可以…

Java开发从入门到精通(一):Java的Spring框架

目录&#xff1a; Spring 是什么? Spring 的优点&#xff1f; Spring 懒加载机制 BeanFactory和ApplicationContext有什么区别&#xff1f; Spring Bean 的5种作用域 Spring Bean 的生命周期 Spring 如何处理线程并发问题&#xff1f; Spring 框架中都用到了哪些设计模式&…

每日一题-环形链表的约瑟夫问题

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param n int整型 * param m int整型 * return int整型*/ typedef struct…

【MATLAB 】 EMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 EMD信号分解算法 EMD 分解又叫经验模态分解&#xff0c;英文全称为 Empirical Mode Decomposition。 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c…

地平线零之曙光图文攻略,地平线零之曙光在MAC电脑能玩吗

《地平线零之曙光》是一款由Guerrilla Games开发的动作角色扮演游戏&#xff0c;。 如果你非常想在MAC电脑体验这款游戏&#xff0c;可以考虑通过crossover来实现在MAC电脑上进行游玩。 本文讲描述如何在MAC电脑玩地平线&#xff1a;黎明时分 首先下载安装好crossover&#…

ES6数组方法比较

console.log("**************数组方法比较***************"); {var arr [1, 2, 3, 4, 5, 6];console.log(arr.some(item > {return item > 3;}));// 输出结果&#xff1a;true//some判断数组中的每一项是否满足条件&#xff0c;遇到第一个满足条件的项&#x…

Alias许可配置

在数字化时代&#xff0c;软件已成为企业竞争的核心要素。然而&#xff0c;随着软件市场的日益复杂&#xff0c;如何合理配置和使用软件许可&#xff0c;已成为企业亟待解决的问题。Alias许可配置服务&#xff0c;凭借其卓越的功能和性能&#xff0c;帮助企业优化软件使用&…

SQL 中避免使用 != 或 <>

1. 索引效率 ! 或 <> 操作符通常无法有效利用索引&#xff0c;因为它们选择除了某个特定值之外的所有值&#xff0c;这可能涉及到表中的大多数行。相比之下&#xff0c;使用 或其他范围查询&#xff08;如 <, <, >, >&#xff09;通常可以更好地利用索引&a…

想交易盈利?Anzo Capital昂首资本发现了一本畅销书

要想在复杂多变的外汇市场中迅速加深了解并想通过交易每天都可以盈利&#xff0c;是通过每天阅读大量的书籍吗&#xff1f;是每天成为行业培训网络资源和论坛的常客吗&#xff1f;是通过花钱请有经验的交易者进行个人培训吗&#xff1f;还是进行EA交易呢&#xff1f; 都不是&a…

【VTKExamples::Points】第二期 DensifyPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例DensifyPoints,并解析接口vtkDensifyPointCloudFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力…

Spring Cloud Gateway介绍及入门配置

Spring Cloud Gateway介绍及入门配置 概述&#xff1a; Gateway是在Spring生态系统之上构建的API网关服务&#xff0c;基于Spring6&#xff0c;Spring Boot 3和Project Reactor等技术。它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式&#xff0c;并为它们提供…

第十五课 PCB保姆级规则设置(四)

1.常用的规则设置 2.设置完规则后&#xff0c;重新设置规则检查 将不设置的规则&#xff0c;不勾选 3.布线规则 &#xff08;1&#xff09;先走短线&#xff08;模块之内的线&#xff09; 模块之内的线需要连接&#xff0c;长线的话提前打孔&#xff08;占位置&#xff09;…

盘点热门的5个AI视频工具(上):附保姆级教程,居然还有免费的?(建议收藏)

一条完全使用 AI 做出的短视频&#xff0c;点赞上万&#xff0c;转发上万&#xff01; 你敢信&#xff0c;这是我在前几天刷视频的时候&#xff0c;看到的一个 AI 视频案例。 这种 AI 视频为什么会火&#xff1f; AI 虽然不是什么新的领域&#xff0c;但 2023 年&#xff0c…

如何批量更改图片的创建时间和修改时间 ? 图片属性更改

在数字时代&#xff0c;图像已经成为我们日常生活中不可或缺的一部分。无论是在社交媒体上分享生活点滴&#xff0c;还是在工作报告中展示数据成果&#xff0c;图像都扮演着至关重要的角色。然而&#xff0c;有时我们可能需要对图像进行一些调整&#xff0c;以更好地满足我们的…

【MyBatis面试题】

目录 前言 1.MyBatis执行流程。 2.Mybatis是否支持延迟加载&#xff1f; 3.延迟加载的底层原理知道吗&#xff1f; 4.Mybatis的一级、二级缓存用过吗&#xff1f; 5.Mybatis的二级缓存什么时候会清理缓存中的数据&#xff1f; 总结 前言 本文主要介绍了MyBatis面试题相…