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

Android开发高频面试题之——kotlin篇

Android开发高频面试题之——kotlin篇

Android开发高频面试题之——Java基础篇
Android开发高频面试题之——Kotlin基础篇
Android开发高频面试题之——Android基础篇

1. Kotlin如何实现空安全的?

  • Kotlin 将变量划分为可空和不可空,通过查看字节码可知,声明不可空的变量会加 @NonNull注解,会告诉编译器检查变量是否可空。声明可空的变量会加 @Nullable注解
  • Kotlin 提供了空安全操作符 ?相当于实现了非空判断,当对象不为空时才执行操作,否则不执行。保证了空安全
//场景1,m1方法接收一个不可能为null的字符串
//在其方法体中我们获取了传入字符串的长度
fun m1(str: String) {str.length
}
//场景2,m2方法接收一个可能为null的字符串
//在其方法体中我们采用了安全调用操作符 ?. 来获取传入字符串的长度
fun m2(str: String?) {str?.length
}
//场景3,m3方法接收一个可能为null的字符串
//在其方法体中我们采用了 !!  来获取传入字符串的长度
fun m3(str: String?) {str!!.length
}public final static m1(Ljava/lang/String;)V@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0L0ALOAD 0LDC "str"INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)VL1LINENUMBER 6 L1ALOAD 0INVOKEVIRTUAL java/lang/String.length ()IPOPL2LINENUMBER 7 L2RETURNL3LOCALVARIABLE str Ljava/lang/String; L0 L3 0MAXSTACK = 2MAXLOCALS = 1// access flags 0x19public final static m2(Ljava/lang/String;)V@Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 0L0LINENUMBER 10 L0ALOAD 0DUPIFNULL L1INVOKEVIRTUAL java/lang/String.length ()IPOPGOTO L2L1POPL2L3LINENUMBER 11 L3RETURNL4LOCALVARIABLE str Ljava/lang/String; L0 L4 0MAXSTACK = 2MAXLOCALS = 1public final static m3(Ljava/lang/String;)V@Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 0L0LINENUMBER 15 L0ALOAD 0DUPIFNONNULL L1INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwNpe ()VL1INVOKEVIRTUAL java/lang/String.length ()IPOPL2LINENUMBER 16 L2RETURNL3LOCALVARIABLE str Ljava/lang/String; L0 L3 0MAXSTACK = 3MAXLOCALS = 1

2. 谈谈你对协程的理解

协程可以看做是官方封装的轻量级线程框架。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。

  • 协程与线程有什么区别:
    ·Kotlin协程,不是操作系统级别的概念,无需操作系统支持,线程是操作系统级别的概念,我们开发者通过编程语言(Thread,java)创建的线程,本质还是操作系统内核线程的映射。
  • Kotlin协程,是用户态的(userleve),内核对协程无感知;一般情况下,我们说的线程,都是内核线程,线程之间的切换,调
    度,都由操作系统负责。
  • Kotlin协程,是协作式的,由开发者管理,不需要操作系统进行调度和切换,也没有抢占式的消耗,因比它更加高效;线程,是
    抢占式的,它们之间能共享内存资源。
  • Kotlin协程,它底层基于状态机实现,多协程之间共用一个实例,资源开销极小,因比它更加轻量;线程会消耗操作系统资源。
  • Kotlin协程,本质还是运行于线程之上,它通过协程调度器,可以运行到不同的线程上
    优点:
  • 轻量和高效:协程可以在一个线程中开启1000个协程,也不会有什么影响。
  • 简单好用:其实轻量和高效并不是协程的核心竞争力,最主要的还是简化异步并发任务,代码中可以已同步的方式替换异步,去除java中回调地狱问题。

3. 了解密封类(Sealed Classes)吗

可以理解成是Enum枚举类的加强版

  • Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。
  • Sealed class(密封类)的所有子类都必须与密封类在同一文件中
  • Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中
  • Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类
sealed class SealedClass{class SealedClass1():SealedClass()class SealedClass2():SealedClass()fun hello(){println("Hello World ... ")}
}
fun main(args:Array<String>){var sc:SealedClass = SealedClass()//这里直接编译报错
}
fun main(args:Array<String>){var sc:SealedClass = SealedClass.SealedClass1()//只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了sc.hello()
}

使用场景:与when表达式搭配

// Result.kt
sealed class Result<out T : Any> {data class Success<out T : Any>(val data: T) : Result<T>()data class Error(val exception: Exception) : Result<Nothing>()
}when(result) {is Result.Success -> { }is Result.Error -> { 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络层协议 —— IP协议
  • MyBatis 源码解析:TypeHandler 设计与自定义实现
  • 《深度学习》卷积神经网络CNN 原理及其流程解析
  • Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux
  • 如何在Linux Centos7系统中挂载群晖共享文件夹
  • Kalman算法、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)的比较
  • RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案
  • 二叉树堆的建立与排序
  • linux之mysql安装
  • 整数二分算法和浮点数二分算法
  • SpringBootWeb增删改查入门案例
  • ROS 设置dhcp option 6 多个地址格式
  • Qt构建JSON及解析JSON
  • Cesium 绘制可编辑点
  • 新增用户 开发
  • 【EOS】Cleos基础
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • CentOS7 安装JDK
  • chrome扩展demo1-小时钟
  • css选择器
  • Hibernate最全面试题
  • HTTP中GET与POST的区别 99%的错误认识
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • leetcode386. Lexicographical Numbers
  • Objective-C 中关联引用的概念
  • Python学习之路13-记分
  • 给初学者:JavaScript 中数组操作注意点
  • 规范化安全开发 KOA 手脚架
  • 缓存与缓冲
  • 机器学习中为什么要做归一化normalization
  • 前端面试总结(at, md)
  • 前端性能优化——回流与重绘
  • 使用 5W1H 写出高可读的 Git Commit Message
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Panda3d 碰撞检测系统介绍
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (汇总)os模块以及shutil模块对文件的操作
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (七)Java对象在Hibernate持久化层的状态
  • (原)Matlab的svmtrain和svmclassify
  • (转)Mysql的优化设置
  • ****三次握手和四次挥手
  • .gitignore文件_Git:.gitignore
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET轻量级ORM组件Dapper葵花宝典
  • .php结尾的域名,【php】php正则截取url中域名后的内容