当前位置: 首页 > news >正文

安卓 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

&#x1f525; 31、简述Kotlin 中的内联类&#xff0c;我们什么时候需要&#xff1f;&#x1f525; 有时&#xff0c;业务逻辑需要围绕某种类型创建包装器。 但是&#xff0c;由于额外的堆分配&#xff0c;它会引入运行时开销。 此外&#xff0c;如果包装的类型是原始类型&…...

【洛谷千题详解】P1613 跑路

目录 题目总览 题目描述 输入格式 输出格式 思路分析 AC代码 题目总览 题目描述 小 A 的工作不仅繁琐&#xff0c;更有苛刻的规定&#xff0c;要求小 A 每天早上在 6:00 之前到达公司&#xff0c;否则这个月工资清零。可是小 A 偏偏又有赖床的坏毛病。于是为了保住自己的…...

如何定义resultType和resultMap,它们之间的区别是什么?解释一下<parameterType>的作用和用法。

在MyBatis中&#xff0c;resultType和resultMap都用于将数据库查询结果映射到Java对象&#xff0c;但它们在使用方式和灵活性上有一些区别。 resultType resultType是一个简单的类型别名&#xff0c;它用于指定查询结果应该映射到的Java类型。当数据库表中的列名和Java对象的属…...

Docker:部署微服务集群

1. 部署微服务集群 实现思路&#xff1a; ① 查看课前资料提供的cloud-demo文件夹&#xff0c;里面已经编写好了docker-compose文件 ② 修改自己的cloud-demo项目&#xff0c;将数据库、nacos地址都命名为docker-compose中的服务名 ③ 使用maven打包工具&#xff0c;将项目…...

傅里叶变换pytorch使用

参考视频&#xff1a;1 傅里叶变换原理_哔哩哔哩_bilibili 傅里叶变换是干嘛的&#xff1a; 傅里叶得到低频、高频信息&#xff0c;针对低频、高频处理能够实现不同的目的。 傅里叶过程是可逆的&#xff0c;图像经过傅里叶变换、逆傅里叶变换后&#xff0c;能够恢复到原始图像…...

LeetCode104 二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;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引入的类的概念和语法糖 类的概念&#xff1a; ES6引入了类&#xff08;class&#xff09;的概念&#xff0c;类是一种抽象的数据类型&…...

_note_05

1.说一说什么是函数重载&#xff1f; 函数签名相同除了 形参不同数据类型 函数签名相同除了 形参不同个数 2.void关键字的作用&#xff1f;返回值是void &#xff0c;可以写return 吗&#xff1f; 函数无返回&#xff0c;使用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版本&#xff1a; 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(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…...

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时&#xff0c;通常使用 Redis 的字符串&#xff08;String&#xff09;。Redis 的字符串是最基本的数据类型&#xff0c;一个键对应一个值&#xff0c;它能够存储任何形式的字符串&#xff0c;包括二进制数据。字符串类型的值最多可以是 512MB。 Re…...

【学习心得】websocket协议简介并与http协议对比

一、轮询和长轮询 在websocket协议出现之前&#xff0c;要想实现服务器和客户端的双向持久通信采取的是Ajax轮询。它的原理是每隔一段时间客户端就给服务器发送请求找服务器要数据。 让我们通过一个生活化的比喻来解释轮询和长轮询假设你正在与一位不怎么主动说话的老大爷&…...

基于Token的身份验证:安全与效率的结合

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist&#xff0c;在electron-builder签名打包时&#xff0c;给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证&#xff0c;若出现这个&#xff0c;则说明成…...

uniapp让输入框保持聚焦状态,不会失去焦点

使用场景&#xff1a;当输入框还有发送按钮的时候&#xff0c;点击发送希望软键盘不消失&#xff0c;还可以继续输入&#xff0c;或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法&#xff0c;适用input输入框和editor输入框 解决办法&#xff1a;把cli…...

面试中如何介绍mysql的B+树

B树是B树的变体&#xff0c;也是一颗多路搜索树。在MySQL中&#xff0c;B树是为磁盘或者其他直接辅助存储设备所设计的一种平衡的查找树结构。其具有以下特点&#xff1a; 每个节点最多有m个子女&#xff0c;m阶的B树深度最多为m。非根节点关键值个数范围是⌈m/2⌉-1<k<m…...

【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&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. 前言 注意力机制能够用于构建先进的文本…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...