安卓 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中,不会传递到其他任何地方,除非处理,否则它将被静默丢弃。
你一定不要忘记你用异步启动的协程。
相关文章:
安卓 Kotlin 面试题 31-40
🔥 31、简述Kotlin 中的内联类,我们什么时候需要?🔥 有时,业务逻辑需要围绕某种类型创建包装器。 但是,由于额外的堆分配,它会引入运行时开销。 此外,如果包装的类型是原始类型&…...
【洛谷千题详解】P1613 跑路
目录 题目总览 题目描述 输入格式 输出格式 思路分析 AC代码 题目总览 题目描述 小 A 的工作不仅繁琐,更有苛刻的规定,要求小 A 每天早上在 6:00 之前到达公司,否则这个月工资清零。可是小 A 偏偏又有赖床的坏毛病。于是为了保住自己的…...
如何定义resultType和resultMap,它们之间的区别是什么?解释一下<parameterType>的作用和用法。
在MyBatis中,resultType和resultMap都用于将数据库查询结果映射到Java对象,但它们在使用方式和灵活性上有一些区别。 resultType resultType是一个简单的类型别名,它用于指定查询结果应该映射到的Java类型。当数据库表中的列名和Java对象的属…...
Docker:部署微服务集群
1. 部署微服务集群 实现思路: ① 查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件 ② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名 ③ 使用maven打包工具,将项目…...
傅里叶变换pytorch使用
参考视频:1 傅里叶变换原理_哔哩哔哩_bilibili 傅里叶变换是干嘛的: 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的。 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像…...
LeetCode104 二叉树的最大深度
题目 给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,…...
使用Spring的AOP
使用Spring的AOP 一、AOP 的常用注解1.切面类Aspect2.Pointcut3.前置通知Before4.后置通知AfterReturning5.环绕通知Around6.异常通知AfterThrowing7.最终通知After8.切面顺序Order9.启用自动代理EnableAspectJAutoProxy 二、AOP注解方式开发三、AOP 全注解开发四、基于XML配置…...
爬虫之矛---JavaScript基石篇3<JavaScript构造函数的内部机制和应用(2)>
前言: 继续上一篇https://blog.csdn.net/m0_56758840/article/details/136592611 正文: 1.ES6中的类和构造函数的对应关系 A. 介绍ES6引入的类的概念和语法糖 类的概念: ES6引入了类(class)的概念,类是一种抽象的数据类型&…...
_note_05
1.说一说什么是函数重载? 函数签名相同除了 形参不同数据类型 函数签名相同除了 形参不同个数 2.void关键字的作用?返回值是void ,可以写return 吗? 函数无返回,使用void修饰; 可以只使用return使函数结束; 3.按要…...
将格蠹GDK8的cmake3.10升级为cmake3.15
#升级过程# 1、wget https://cmake.org/files/v3.15/cmake-3.15.0-rc1.tar.gz 2、tar -zxvf cmake-3.15.0-rc1.tar.gz 3 、cd cmake-3.15.0-rc1 4、./configure 5、sudo make install 6、reboot 7、查看cmake版本: geduergdk8:~$ cmake --version cmake ve…...
b树(一篇文章带你 理解 )
目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…...
OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】
package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量(节点数)int m sc.nextInt(); // 基站对数量(边数&…...
面试题:分布式锁用了 Redis 的什么数据结构
在使用 Redis 实现分布式锁时,通常使用 Redis 的字符串(String)。Redis 的字符串是最基本的数据类型,一个键对应一个值,它能够存储任何形式的字符串,包括二进制数据。字符串类型的值最多可以是 512MB。 Re…...
【学习心得】websocket协议简介并与http协议对比
一、轮询和长轮询 在websocket协议出现之前,要想实现服务器和客户端的双向持久通信采取的是Ajax轮询。它的原理是每隔一段时间客户端就给服务器发送请求找服务器要数据。 让我们通过一个生活化的比喻来解释轮询和长轮询假设你正在与一位不怎么主动说话的老大爷&…...
基于Token的身份验证:安全与效率的结合
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Electron程序如何在MacOS下获取相册访问权限
1.通过entitiment.plist,在electron-builder签名打包时,给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证,若出现这个,则说明成…...
uniapp让输入框保持聚焦状态,不会失去焦点
使用场景:当输入框还有发送按钮的时候,点击发送希望软键盘不消失,还可以继续输入,或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法,适用input输入框和editor输入框 解决办法:把cli…...
面试中如何介绍mysql的B+树
B树是B树的变体,也是一颗多路搜索树。在MySQL中,B树是为磁盘或者其他直接辅助存储设备所设计的一种平衡的查找树结构。其具有以下特点: 每个节点最多有m个子女,m阶的B树深度最多为m。非根节点关键值个数范围是⌈m/2⌉-1<k<m…...
【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
AIGC实战——GPT(Generative Pre-trained Transformer)
AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
