安卓 Kotlin 面试

🔥  1、请简述什么是 Kotlin?它有哪些特性?🔥

kotlin和java一样也是一门jvm语言最后的编译结果都是.class文件,并且可以通过kotlin的.class文件反编译回去java代码,并且封装了许多语法糖,其中我在项目中常用的特性:扩展、 lamdba表达式、函数式编程、空安全等。

扩展 (使用非集成的方式 扩张一个类的方法和变量):比方说 px和dp之间的转换 之前可能需要写个Util现在,通过扩展Float的变量 最后调用的时候仅仅是 123.dp 这样px转成dp了 

 lamdba表达式:lamdba表达式并不是kotlin的专利,java中也有,但是有限制, 像 setOnClickListener 一样,接口方法只有一个的情况才能调用, 而在kotlin中对接口的lambda也是如此,有这样的限制,但是他更推荐你使用闭包的方式而不是实现匿名接口的方式去实现这样的功能,闭包对lambda没有接口这么多的限制。

另外就是函数式编程 在java8中提供了streamApi 对集合进行map sort reduce等等操作,但是对android api有限制,为了兼容低版本,几乎不可能使用streamApi

判空语法 省略了许多if xxx==null 的写法 也避免了空指针异常 aaa?.toString ?: "空空如也" 当aaa为空的时候 它的值被"空空如也"替代
aaa?.let{
it.bbb
}
当aaa不为空时 执行括号内的方法

 省略了findViewById ,使用kotlin 就可以直接用xml中定义的id 作为变量获取到这个控件,有了这个 butterknife就可以淘汰了,使用databinding也能做到,但是,非常遗憾,databinding的支持非常不好,每次修改视图,都不能及时生成,经常要rebulid才能生成.

 默认参数 减少方法重载 fun funName(a :Int ,b:Int = 123)通过如上写法 实际在java中要定义两个写法 funName(a)和funName(a,b)

 外说明,kotlin会是apk大小在混淆后增加几百k 。

🔥 2、Kotlin 中的扩展函数是什么? 🔥

kotlin中的扩展函数,实际上就是通过给类添加 public static final 函数的做法来实现,这样做可以减少utils类的使用。

扩展函数是静态解析的,是采用静态分派的过程来处理。这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。这意思其实就是在使用该扩展函数的时候,如果类本身和其子类都进行了同一个函数的扩展,这函数是不会有重写关系的,在使用的时候,只会根据需要使用该方法的对象的实际类型来决定是调用了哪个,就是相当于调用静态方法。而不是动态分派。

🔥3、 如何在 Kotlin 中用值初始化一个数组?🔥 

 在 Java 中,可以初始化数组,例如:
int numbers[] = new int[] {10, 20, 30, 40, 50}
Kotlin 的数组初始化是什么样子的?
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50) 

🔥4、Kotlin 中 fold 和 reduce 的基本区别是什么 ?🔥

fold接受一个初始值,传递给它的 lambda 的第一次调用将接收该初始值和集合的第一个元素作为参数。
listOf(1, 2, 3).fold(0) { sum, element -> sum + element }
对 lambda 的第一次调用将使用参数0和1。
如果您必须为您的操作提供某种默认值或参数,那么能够传入初始值是很有用的。
reduce不采用初始值,而是从集合的第一个元素作为累加器开始(sum在以下示例中调用)
listOf(1, 2, 3).reduce { sum, element -> sum + element }
此处对 lambda 的第一次调用将使用参数1和2。

 🔥 5、 Kotlin 中的 var 和 val 有什么区别?🔥

Kotlin 中 val 和 var 的区别
val 和 var 属性之间最显着的区别是前者是不可变的。我们可以改变 var 变量的值,但我们不能改变 val 变量的值。
它们类似于 Java 中的 final 关键字。val 和 var 变量之间的其他一些区别是:
现在我们知道了 val 和 var 之间的区别,让我们看一些我们尝试更改它们的值的示例。

在 Kotlin 中使用 var 关键字
在这个例子中,我们将使用 var 关键字来声明一个变量并尝试改变它的值。var v = "Hello!"
fun main() {
println("This is a var variable: "+v);// Changing the value of var variable
v = "Welcome!";
println("New value of the var variable is: " +v);
}
输出:var 变量示例:
在 Kotlin 中使用 val 关键字
在这里,我们将使用 val 关键字创建一个不可变变量并尝试更改其值。
val v = "Hello!"
fun main() {
println("This is a val variable: "+v);// Changing the value of val variable
v = "Welcome!";
println("New value of the val variable is: " +v);
}
val 变量示例:
正如我们在输出中看到的,更改 val 变量会引发错误:Val cannot be reassigned。
在 Kotlin 中更改 val 变量的属性
虽然我们不能更改使用 val 关键字声明的变量的值,但我们仍然可以更改它们的属性。让我们看一个使用 val 声明变量并更改其属性的示例。fun main(args: Array) {
val student = Student("David Shaw",1)
print(student)
student.name = "Joe Smith"
print("\n"+student)
}data class Student(var name: String = "", var id: Int = 0)

🔥 6、阐述Kotlin 在哪里使用 var 和 where val? 🔥 

在值经常变化的地方使用var。例如,在获取 android 设备的位置时:
var integerVariable : Int? = null
在整个班级的价值没有变化的情况下使用val 。例如,您想以编程方式设置 textview 或按钮的文本。
val stringVariables : String = "Button's Constant or final Text"

 🔥 7、 简述Kotlin 中的数据类 ? 🔥

Kotlin 数据类,在 Kotlin 中,您可以创建一个data类来保存数据。您希望将类标记为data的原因是让编译器知道您正在创建此类来保存数据,然后编译器会自动为您的数据类创建多个函数,这将有助于管理数据。在本指南中,我们将学习数据类和编译器自动生成的函数

我们经常创建主要目的是保存数据的类。在 Kotlin 中,这称为数据类并标记为data:
data class User(val name: String, val age: Int)
为了确保生成代码的一致性和有意义的行为,数据类必须满足以下要求:
主构造函数至少需要一个参数;
所有主要的构造函数参数都需要标记为 val 或 var;
数据类不能是抽象的、开放的、密封的或内部的

 🔥  8、 如何在 Kotlin 中创建单例?🔥

只需使用object.object SomeSingleton
上面的 Kotlin 对象将被编译为以下等效的 Java 代码:public final class SomeSingleton {public static final SomeSingleton INSTANCE;private SomeSingleton() {INSTANCE = (SomeSingleton)this;System.out.println("init complete");
}static {new SomeSingleton();
}
}

这是在 JVM 上实现单例的首选方法,因为它可以实现线程安全的延迟初始化,而不必依赖像复杂的双重检查锁定这样的锁定算法。

🔥 9、 以下代码执行的结果是什么? 🔥 

val aVar by lazy {println("I am computing this value")"Hola"
}
fun main(args: Array) {println(aVar)println(aVar)
}

 第lazy一次访问 Lazy 属性时,会进行初始化(lazy()函数调用)。第二次,这个值被记住并返回:

I am computing this value
Hola
Hola

🔥  10、 解释 Kotlin 中的 Null 安全性 ?🔥 

Kotlin 的类型系统旨在消除代码中空引用的危险。

 许多编程语言(包括 Java)中最常见的缺陷之一是访问空引用的成员将导致空引用异常。在 Java 中,这相当于 aNullPointerException或简称 NPE

 在 Kotlin 中,类型系统区分可以保存的null引用(可空引用)和不能保存的引用(non-null引用)。例如,String 类型的常规变量不能保存 null:

var a: String = "abc"
a = null // compilation error
为了允许空值,我们可以将变量声明为可空字符串,写成String?:var b: String? = "abc"
b = null // ok
print(b)

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

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

相关文章

基于springboot+vue实现校企合作项目管理系统项目【项目源码+论文说明】

基于springboot实现校企合作项目管理系统演示 摘要 这是一个计算机的时代,在计算机应用非常广泛的时代中,用计算机来完成对信息的处理有着非常好的使用效果。特别是针对学校而言亦是如此,通过在学校中的信息化建设,能够很好的提升…

1.1计算机系统构成及硬件系统知识(下)

1、定点数与浮点数 定点整数的小数点在最低有效数位之后,也就是00000000.; 因为定点整数只表示整数,不涉及小数; 定点小数的小数点在符号位之后,也就是最高有效数位之前,也就是0.0000000; 浮点…

【力扣二刷思路】DAY1

3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为…

在线安装QT Creator 版本(自带编译套件)

在线版下载Qt6最新版本 第一步:进入archive目录 第二步:进入online_installers目录 第三步:进入目前在线安装包最新版本4.7 第四步:选择下载windows版本的在线安装包 如果出现以下错误,访问不了,则启动…

spring-boot https证书双向认证配置

文章目录 1. 创建CA证书2. 签发服务端证书3. 签发客户端证书4. 生成PKCS12服务端证书5. 配置spring-boot工程6. 验证请求源代码地址github源代码地址gitee 本文主要介绍在spring-boot工程中配置https证书双向认证。包含生成自签名证书命令,配置yml等。 注意&#xf…

华润对象存储(OBS)工具类

目录 一、备注二、工具类三、对象存储放在内网,如何实现外网访问 一、备注 1、ObjectBasicInfo、ObjectDetailInfo、ResultBody这三个类可自行替换或者去掉 二、工具类 package com.xxx.util;import com.amazonaws.HttpMethod; import com.amazonaws.auth.AWSStat…

【趣味学算法】05_谁在说谎

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正 现有 张三、李四和 王…

2024年GitHub标星2-9K的Android基础——高级面试题合集

3、横竖屏切换时候 Activity 的生命周期 4、AsyncTask 的缺陷和问题,说说他的原理。 5、onSaveInstanceState() 与 onRestoreIntanceState() Android高级面试题 1、你们做了哪些稳定性方面的优化? 2、性能稳定性是怎么做的? 3、业务稳定性如…

python 修改3d旋转顺序

目录 python实现修改3d旋转顺序 矩阵批量计算 因为矩阵相乘不能交换,所以3d旋转顺序不能交换。 python实现修改3d旋转顺序 import numpy as np from scipy.spatial.transform import Rotation as Rdef convert_rotation(y, x, z, from_order, to_order):# 创建一个旋转对象…

使用Docker管理linux容器

文章目录 一、使用docker管理镜像 二、使用docker管理容器 一、使用docker管理镜像 1、安装操作系统,我安装的是centOS 7 ,因为centos7有着非常丰富的软件仓库,方便后续安装与docker相关的软件。 2、初始化设置, 关闭防火墙 关闭…

独家原创!微电网OR综合能源系统用户用电行为分析程序代码!

适用平台:MatlabYalmipCplex 程序以含分布式新能源、储能、微型燃气轮机作为主要电力来源,以照明设备、电视、洗衣机和空调等主要家庭用电设备作为电负荷,仿真了3种典型家庭用户的用电行为。程序算例丰富、注释清晰、干货满满,可…

TCP收发——计算机网络——day02

今天主要讲了TCP的收发 TCP发端步骤 ①socket ②connect ③send ④closeTCP收端步骤 ①socket ②bind ③listen ④accept ⑤recv ⑥clise其函数主要有 connect int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:发送链接请求参数:sockfd:套接…

BCI-自我QA 记录

学习中的 Q&A 记录 Q: 事件驱动的语音感知的两种机制 A: 第一种机制是基于对声学能量的快速增加进行感知(时域分析)。它关注的是声音在时间上的动态变化,特别是声学能量的迅速增加。这种机制可能用来检测语音中的重要事件,如音…

Ribbon简单使用

Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后…

React入门 学习全记录(适合和我一样有Vue经验想学习react的同学~)

前端目前的三大框架:Vue、React、Angular比较 都采用了组件化开发的方式,都是基于MVVM的框架有着虚拟DOM,Vue 和 Angular 都采用了响应式设计的方式,当数据发生变化时会自动更新视图。React 和 Angular 的复杂性也使得它们更加适…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程:1.前端用户提交用户名,密码 2. 序列化器校验用户名,密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

Map接口

Map接口 Map接口,双列集合(每个元素,包含一个键(key),一个值对象(Value),键与值之间的对应关系叫做映射),Map中每个元素的键不允许重复&#xff…

解决使用torch.cuda.empty_cache()仍然GPU显存无法释放的问题

在开发的过程中,程序已经关闭,但是GPU显存无法释放,在使用pytorch写程序的时候, 有时候会在控制台终止掉正在运行的程序,但是有时候程序已经结束了,nvidia-smi也看到没有程序了,但是GPU的内存并没有释放&a…

记录一次大厂面试题

回流和重绘 浏览器渲染页面步骤: 处理HTML标记并构建DOM树处理css标记并构建CSSOM树将DOM和CSSOM合并成一个渲染树根据渲染树来布局以计算每个节点的几何信息将各个节点绘制到屏幕上 回流:当Render树中部分或全部元素的尺寸、布局、隐藏等改变&#xf…

C++知识点总结(24):栈的真题

概览 P1044 ★★★☆☆ [NOIP2003 普及组] 栈1. 审题题目背景题目描述输入格式输出格式样例1 2. 思路3. 参考答案3.1 卡特兰公式3.2 前缀和 P1044 ★★★☆☆ [NOIP2003 普及组] 栈 1. 审题 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制…