【Android面试】Kotlin语言专题

Kotlin 面试题汇总 在kotlin 中,int, double,float 这些类型是没有的,在kotlin 中需要使用 Int,这是引用类型,以及Double,Float 这些类型。您可以使用$符号来使用字符串中的某些变量,也可以在{}符号之间执行一些操作。就是定义一个变量,然后当用户获取时,如果变量值为空,那么就会包未初始化异常,如果用户后面进行了初始化,就直接返回了这个值。因此,要将空值分配给变量,您需要将name变量声明为可空字符串,然后在访问此变量期间,您需要使用安全调用运算符,即? 阅读详情

文章目录


协程的资料可参考该文章第五节

一. 基本语法

1. 泛型的Out和In关键字

【Kotlin进阶】泛型的高级特性

  • Out:协变——生产者
    协变:只能读取不能写入
    Out T等价于 ? extends T
    案例1:支持协变的List
  • In:逆变——消费者
    逆变:只能写入不能读取
    In T等价于 ? super T
    案例2:支持逆变的Comparator

2. UnsafeVariance

UnsafeVariance 是一个特殊的注解(annotation),用于处理泛型类型参数的协变(covariance)和逆变(contravariance)问题。它通常用于在编译器无法自动推断出类型安全的情况下,强制告诉编译器忽略某些类型检查,从而允许协变或逆变的使用。

public interface List<out E> : Collection<E> {
	override val size: Int
	override fun isEmpty(): Boolean
	override fun contains(element: @UnsafeVariance E): Boolean
	override fun iterator(): Iterator<E>
	public operator fun get(index: Int): E
}

3. lateinit和by lazy

  • 二者都用于延迟初始化,差异如下:

在这里插入图片描述

  • by lazy的具体使用场景
// VIEWMODEL 的懒加载初始化(推荐方式)
    private val viewModel: MyViewModel by lazy {
        ViewModelProvider(this).get(MyViewModel::class.java)
    }
    //单例数据库实例懒加载(ROOM 数据库)
    val database: AppDatabase by lazy {
        Room.databaseBuilder(App.instance, AppDatabase::class.java, "app_db").build()
    }

4. 扩展方法及其原理

扩展方法(Extension Function) 是一种允许我们为已有类添加新方法的机制,而无需继承该类或使用装饰器等设计模式。

  • 原理
    Kotlin 编译器在编译时会将扩展函数转换为带有接收者参数的静态函数。
    实际上并没有修改原有类的结构,只是在调用处将接收者作为第一个参数传入。
    扩展函数不能访问类的私有成员,因为它不是类的内部成员。
  • 使用场景
    简化 View 操作
    为 Context 或 Activity 添加常用功能
    为数据类型添加格式化方法

5. 如何理解委托

把一个对象的职责委托给另外一个对象

  • 属性委托:by lazy
  • 类的委托:通过by关键字
  • 使用场景:
    使用 lazy 委托延迟初始化 View 或资源
    使用委托简化 ViewModel 或 Repository 的获取

6. 内联

【Kotlin内联函数】

  • 定义
    编译时把调用代码插入到函数中去,避免方法调用的开销
  • inline: 内联,将函数体插入调用处,提升性能
  • noinline:避免参数被内联
  • crossline:限制非局部返回

7. 高阶函数

高阶函数是指可以接收其他函数作为参数或者返回一个函数的函数

  • 案例:
    let,run,also这些关键字

8. 伴随对象

Kotin中没有静态成员或函数,伴随对象Companion object用于“没有类实例的情况下但需要访问类内部的函数”。
单例模式
如果需要与java代码集成,加上注解@JvmStatic

9. 泛型实化

inline + Reified实现泛型实化,用于在运行时直接获取泛型类型参数的具体类型的

    private val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    fun <T> create(serviceClass: Class<T>):T = retrofit.create(serviceClass);
    inline fun<reified T> create() :T = create(T::class.java) // 不加refiled inline T::class.java这里会报错

10. Unit与void的区别

Unit 是 Kotlin 中的一个 对象(object),表示没有有意义的返回值

public object Unit {
    override fun toString() = "kotlin.Unit"
}

void 是 Java 的关键字,表示函数不返回任何值。它不是对象,也不是类型,不能作为参数或变量类型使用。

11. lambda

添加链接描述

12. run,let,also,with,apply高阶函数总结

在这里插入图片描述

13. 如何理解by关键字

by 是 Kotlin 属性委托语法,意思是:这个属性的 get/set 逻辑,交给右边那个对象来接管。

  • by lazy
    by 含义:data 的 get 逻辑交给 Lazy 对象
    行为:第一次访问 data 的时候,才执行 lambda 算出值;之后永远缓存这个结果,不再执行
val data by lazy { "hello" }
// 类似于
private val lazyObj = lazy { "hello" }
val data: String
    get() = lazyObj.getValue(this, ::data)
  • by viewModels ()
    by 含义:vm 这个属性的 get,交给这个 ViewModelLazy 对象托管
    当你第一次读取 vm → 委托对象去 ViewModelProvider 里面拿:
val vm: TestViewModel by viewModels()
// 脱糖理解
private val delegate = viewModels<TestViewModel>()
val vm: TestViewModel
    get() = delegate.getValue(this, ::vm)
  • var count by mutableStateOf(0)
    MutableState 本身就实现了 getValue、setValue 两个函数,所以支持 var 可变委托。
    行为:
    读 count → 读 stateObj.value
    写 count=xxx → 写 stateObj.value = xxx
    写的时候,MutableState 自带通知,触发 Compose 重组
val stateObj = remember { mutableStateOf(0) }
var count by stateObj
// 脱糖
var count: Int
    get() = stateObj.getValue(this, ::count)
    set(newVal) = stateObj.setValue(this, ::count, newVal)

演示代码

class CustomLazy <T> (val init: () -> T){

    private var cache: T? = null

    /**
     * Kotlin魔法约定:只要你的委托类里面,存在一个标记 operator、签名符合规则的 getValue,编译器就认为:这个类可以用来做 by 属性委托。
     * 属性委托,必须用 operator 修饰 getValue / setValue,编译器才识别它能配合 by
     * thisRef: Any?:这个属性属于哪个对象
     * property: KProperty<*>: 当前这个属性本身的反射信息
     */
    operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
        // 第一次访问,执行lambda,存起来;之后直接返回缓存
        if (cache == null) {
            cache = init()
            println("第一次初始化:${property.name}")
        }
        return cache!!
    }
}

fun <T> myLazy(init: () -> T) = CustomLazy(init)

// 使用
fun main() {
    val msg by myLazy {
        println("执行初始化逻辑")
        "hello delegate"
    }

    println("还没访问 msg,不会执行初始化")
    println(msg)
    println(msg) // 第二次访问,直接拿缓存,不再走lambda
}

二. 协程

1. 协程是什么

官方回答:协程视为一种轻量级线程,可用于提高并发代码的性能
关键词:轻量级,并发
轻量级:它不映射到本机线程,因此不需要在处理器上进行上下文切换,因此协程速度更快(线程由操作系统管理,协程由用户管理)
结构化并发:Kotlin 协程支持结构化并发模型,通过 CoroutineScope 来管理协程的生命周期,确保所有协程在完成或取消时不会泄漏。
并发与并行的区别
一手画圆,一手画方,两只手同时操作,左右互搏,这个是并行;但是呢,我先左手画一笔,右手画一笔,同一时候只有一只手在操作,来回交替,直到完成图案,这个就是并发
支持以同步的方式编写异步代码
协程是更高效和更简单的方式管理并发的框架,其轻量级线程编写在实际线程框架之上,通过利用函数的协作性质来充分利用它

2. 协程的启动

launch / async / runBlocking / coroutineScope / supervisorScope
在这里插入图片描述

3. 协程的挂起和阻塞概念

  • 挂起
    挂起是协程中的概念,指协程暂停自身的执行,但并不会阻塞底层线程。
    挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作
    协程在执行到有 suspend 标记的函数的时候,会被 suspend 也就是被挂起,而所谓的被挂起,就是切个线程;挂起函数在执行完成之后,协程会重新切回它原先的线程。

  • 阻塞
    阻塞是指线程在执行某个操作时被暂停,直到该操作完成,而不能执行其他任务。比如sleep方法

4. 理解Suspend关键字

原理

  • 定义
    用于标记可挂起函数,使其能在不阻塞线程的前提下暂停和恢复执行

  • 工作原理
    当你在 Kotlin 中使用 suspend 修饰一个函数时,Kotlin 编译器会在编译阶段将该函数转换为一个状态机(一个实现了 Continuation 接口的类),这个状态机用于管理函数的挂起与恢复。

  • 使用限制
    其他挂起函数内部
    协程作用域内(如 launch、async、runBlocking)
    若挂起函数内部无实际挂起逻辑(如未调用 delay 或 withContext),编译器会提示 redundant suspend modifier(多余的 suspend 修饰符)

  • suspend 仅标记函数可挂起,​线程切换需主动调用调度器​(如 withContext)

  • 挂起函数定义
    suspend 修饰的函数称为挂起函数,表示该函数内部可能存在耗时操作(如网络请求、文件读写)

  • 常见挂起函数
    在这里插入图片描述

5. Job和SupervisorJob

  • Job
    Job 是协程中最基本的接口,用于表示一个可取消的工作单元
    如果一个子协程异常失败,会取消其父 Job 及其他兄弟协程。
    适用场景:任务之间有强依赖关系
  • SupervisorJob
    SupervisorJob 是 Job 的子接口,但行为不同:子协程的失败不会影响其他子协程或父协程。
    使用场景:APP的首页,首页上展示的数据五花八门。如:广告,弹窗,未读状态

6. CoroutineDispatcher调度器

  • Dispatchers.Main
    用于 Android 的主线程(UI 线程),适合执行更新 UI 的操作。
  • Dispatchers.IO
    用于执行 I/O 密集型任务(如网络请求、文件读写等)
  • Dispatchers.Default
    用于 CPU 密集型任务(如数据计算、图像处理等)
  • Dispatchers.Unconfined
    不限制执行的线程,协程会在调用它的线程中运行,但恢复时可能在其他线程

7. CoroutineContext 上下文组合规则与元素合并原理

  • CoroutineContext是不可变集合式接口,采用键值对结构存储各类元素:Job、Dispatcher、异常处理器、协程名称等;
  • 支持+运算符做上下文叠加,同 Key 元素会后者覆盖前者,不同 Key 元素相互合并;
  • 子协程默认继承父协程全部上下文;
  • 主动指定Dispatcher/Job会覆盖父级对应元素,CoroutineExceptionHandler、协程名称等默认继承。

8. 协程的启动模式

  • DEFAULT 默认启动模式
    饿汉启动模式,协程创建后立即开始调度
  • LAZY 懒汉启动模式
    懒汉启动模式,启动后并不会有任何调度行为,直到我们需要它执行的时候才会产生调度(主动的调用Job的start、join或者await等函数)
  • ATOMIC
    在协程创建后立即开始调度。执行到第一个挂起点之前是不响应cancel 取消操作的,ATOMIC一定要涉及到协程挂起后cancel 取消操作的时候才有意义
  • UNDISPATCHED
    直接开始在当前线程下执行,直到运行到第一个挂起点。不经过任何调度器就开始执行的。当然遇到挂起点之后的执行,将取决于挂起点本身的逻辑和协程上下文中的调度器
    (没有遇到挂起点前,在当前线程下执行;遇到挂起点后,看挂起点具体的场景)

9. 协程的作用域

  • 顶级作用域
    没有父协程的协程所在的作用域称之为顶级作用域
  • 协同作用域
    在协程中启动一个协程,新协程为所在协程的子协程。子协程所在的作用域默认为协同作用域。此时子协程抛出未捕获的异常时,会将异常传递给父协程处理,如果父协程被取消,则所有子协程同时也会被取消。
  • 主从作用域(监督作用域)
    与协同作用域一致,区别在于该作用域下的协程取消操作的单向传播性,子协程的异常不会导致其它子协程取消。但是如果父协程被取消,则所有子协程同时也会被取消。

10. 讲讲 Continuation 接口与 suspend 挂起函数底层状态机实现

  • Continuation 是协程挂起与恢复的核心回调接口,封装了协程后续执行逻辑、上下文、异常回调,是挂起函数的载体。
  • 所有suspend挂起函数,编译期会被 Kotlin 编译器改写,自动新增Continuation类型入参,同时生成状态机代码,通过label标记代码执行位置。
  • 协程挂起时:保存当前执行现场、局部变量、label 状态,交出线程使用权;
  • 任务完成后:通过回调Continuation.resume/resumeWithException恢复状态机,从上次挂起点继续执行。
  • 非协程环境无法调用挂起函数,本质是没有自动生成与传递 Continuation,缺少恢复回调。

11. 协程非阻塞的底层本质,为什么线程做不到高并发

  • 线程由 OS 内核调度,上下文切换成本高、内存占用大,线程池数量有限;
  • 协程由用户态调度,运行在线程之上,多个协程复用同一个线程,挂起仅保存少量栈信息,无内核态切换开销;
  • 非阻塞核心:挂起不阻塞线程,线程可立刻复用执行其他协程任务;
  • 单一线程可承载成千上万个挂起协程,因此协程支持海量并发,资源开销远低于线程

12. coroutineScope 与 supervisorScope 核心区别 & 源码行为

  • coroutineScope:遵循标准结构化并发,子协程异常会向上传播,直接取消父作用域及所有兄弟协程,全部任务终止;
  • supervisorScope:基于SupervisorJob,子协程异常隔离,单个子任务崩溃不影响其他子协程与父作用域;
  • 两者都会阻塞当前协程,等待内部所有子协程执行完毕才结束;
  • Android 中页面独立埋点、多模块并行请求、互不依赖的 UI 附属任务,统一使用supervisorScope

13. GlobalScope 为什么不推荐使用?会引发什么问题

  • GlobalScope属于全局顶级作用域,无绑定生命周期,不受页面 / 组件生命周期管控
  • 无结构化并发约束,页面销毁后协程仍持续运行,引发内存泄漏、空指针崩溃、无效 UI 更新
  • 无法统一取消,批量任务管理困难,异常无法统一捕获
  • 安卓规范:Activity 用lifecycleScope、ViewModel 用viewModelScope、仓库层自定义业务
    Scope,彻底替代 GlobalScope

14. viewModelScope 底层 Job 类型 & 设计原因

  • viewModelScope内部默认绑定SupervisorJob + Dispatchers.Main;
  • 设计目的:页面部分接口失败不杀死整个 ViewModel 所有任务,避免单一请求崩溃导致整个页面功能瘫痪;
  • ViewModel 销毁时自动触发 Job 取消,自动终止所有协程,杜绝泄漏;
  • 适合 MVVM 架构下多接口并行请求、独立业务任务解耦。

15. Dispatchers.IO 与 Default 线程池机制 & 选型规范

  • Dispatchers.Default:固定核心线程池,适配CPU 密集型任务,如数据解析、图片压缩、复杂计算;
  • Dispatchers.IO:动态扩容线程池,按需创建回收线程,适配IO 密集型:网络请求、文件读写、数据库操作;
  • 错误选型危害:CPU 任务用 IO 会造成线程泛滥、频繁切换;IO 任务用 Default 会堵塞计算线程池;
  • 两者底层共享公共调度器核心,只是线程池扩容策略不同。

16. withContext 原理、和 async+await 对比 & 最佳实践

  • withContext是挂起函数,作用为切换上下文 / 线程,无额外任务容器,执行完自动切回原线程;
  • 无需手动管理 Job,自动跟随外层作用域取消,代码更简洁;
  • 对比async+await:单任务线程切换优先用 withContext;多任务并行、需要获取多个返回值时使用 async;
  • 项目规范:串行网络、数据库、文件操作统一使用 withContext (Dispatchers.IO)。

17. Job 完整生命周期 & cancel () 与 cancelChildren () 区别

  • Job 生命周期:New→Active→Completing→Completed/Cancelled;
  • cancel ():取消当前 Job+全部子 Job,整个协程树终止;
  • cancelChildren ():仅取消所有子协程,当前父协程继续运行;
  • 协程一旦进入 Cancelled 状态,不可重启,需重新创建协程实例。

18. launch 与 async 异常抛出差异 底层原因

  • launch:独立任务型设计,异常立即向上传播,若无捕获直接触发崩溃;
  • async:结果返回型设计,异常被封装在 Deferred 内部,只有调用 await () 才会抛出;
  • 设计初衷:launch 用于单向执行任务,async 用于需要返回结果的异步任务,异常延迟抛出;
  • 并行 async 任务建议统一 try-catch 包裹 await,避免隐性崩溃。

19. CoroutineExceptionHandler 使用限制与生效条件

  • 只能捕获作用域内未被 try-catch 捕获、未被消费的顶级协程异常;
  • 无法捕获子协程已捕获的异常、CancellationException 取消异常;
  • 异常处理器遵循就近原则,子上下文 Handler 优先于父级;
  • 仅对 launch 有效,async 异常不会经过该处理器,必须通过 await 捕获。

20. 深刻解释协程的实现原理

  • 协程一定跑在线程上:挂起不代表线程被挂起,只是这段协程逻辑暂停,把线程让出来去执行别的任务。
  • 挂起的本质:suspend 经编译器改写为“状态机 + Continuation”。遇到挂起点时保存现场并返回COROUTINE_SUSPENDED。
  • 恢复的本质:挂起条件满足后(delay 到期/IO 回调返回),并不是“立刻抢回原线程A”,而是 resume 后交给Dispatcher.dispatch(…),把 continuation 包装成任务投递/入队。
  • 线程A忙怎么办:不会抢占、不并发插入执行;恢复任务进入队列,等线程A空闲(当前任务执行完)再执行。
  • 是否必须回到同一条物理线程A:一般不保证。
  • Dispatchers.IO/Default:只保证回到同一线程池,可能换线程继续执行。
  • Dispatchers.Main:保证回到主线程(同一条主线程),通过Looper/MessageQueue 排队执行。
  • 若确实需要固定到同一条工作线程:用单线程 dispatcher(single-thread executor),恢复同样靠排队等待。
  • 内核/Linux 的角色:主要参与定时/IO 等“等待事件”的底层能力;协程的挂起/恢复语义本身在用户态由 continuation +调度队列完成,而非内核去“挂起/恢复线程”。

三. Flow

1. Flow工作原理

Flow 的核心设计基于 响应式流 (默认冷流 )的概念,原理上是 kotlinx.coroutines 库的一部分。它有三个主要角色:
生产者(Producer):负责发送数据流(通过 flow { emit() } 实现)
中间处理(Intermediate):对数据进行转换、过滤等操作(如 map、filter)
消费者(Collector):接收并处理数据(通过 collect 启动)

2. Cold Flow冷流和Hot Flow热流

  • 冷流
    定义:冷流只有在有消费者(collect)开始收集数据时才会开始执行。
    典型实现类:flow (Flow) // Observable (Rxjava)
    使用场景:适合一次性任务,如网络请求、数据库查询等。
  • 热流
    定义:热流无论是否有消费者收集数据,都会持续发射数据。
    典型实现类:SharedFlow、StateFlow // Subject, livedata
    使用场景:适合广播事件、UI 状态共享、传感器数据等需要实时共享的场景。

3. StateFlow和SharedFlow

添加链接描述
添加链接描述

  • StateFlow
    StateFlow 是一种始终有值的热流,它保存当前状态,并将最新值发送给所有活跃的收集者。它的行为类似于 LiveData,但基于协程。
    应用场景:持有并共享 UI 状态(ViewModel 状态管理)
  • SharedFlow
    SharedFlow 是一个 广播式事件流,可以发送多个值给多个收集者,是一种更通用的热流。
    应用场景:分发一次性事件(Toast、导航)

4. Flow 背压产生原因 & buffer/conflate/collectLatest 区别

  • 背压:上游数据发送速度 > 下游消费速度,数据堆积导致内存占用过高;
  • buffer:设置缓存池,缓存上游数据,异步消费,避免阻塞生产者;
  • conflate:保留最新数据,丢弃老旧积压数据,适合实时状态刷新;
  • collectLatest:新数据到来时,取消上一次未完成的消费逻辑,适合搜索、列表刷新等场景。

5. flowOn 操作符线程切换规则 为什么只影响上游

  • flowOn 仅改变上游生产者、中间操作符的执行线程;
  • 下游 collect 收集代码始终运行在当前协程上下文线程;
  • 原理:Flow 是冷流懒加载设计,上下游执行环境隔离,各自绑定独立调度器;
  • 多段 flowOn 叠加时,以最近的 flowOn为准覆盖上游线程。

6. StateFlow 数据倒灌原因 & 解决方案

  • 倒灌根源:StateFlow 默认保存当前最新值,新订阅者连接后会立刻回放历史值;
  • 劣势:一次性事件(弹窗、Toast、路由)重复触发;
  • 解决方案:一次性事件改用 SharedFlow、添加事件消费标记、使用distinctUntilChanged过滤重复状态;
  • 架构规范:UI 状态用 StateFlow,事件型通知强制用 SharedFlow。
Android开发高频面试题之——kotlin篇 Android高频面试题之——Kotlin基础篇 阅读详情

相关推荐

android kotlin面试题,Kotlin面试25题

大家好,这一期呢,我们谈一下kotlin的面试题。第1题,什么是kotlin?kotlin是静态类型的编程语言,运行于jvm之上。第2题, 是谁开发了kotlin?kotlin是由jetbrains开发的。第3题, 为什么我们应该从Java转到kotlin?首先,kotlin比Java要简单。它去除了很多Java里面的冗余代码。kotlin提供了很多Java不具有的特性。第4题, 说一下使用kot...

weixin_39927378的博客 5028

android 最新面试题 kotlin50道面试题

备 Kotlin 面试时,掌握一些常见的面试问题和解答可以帮助你更好地展示自己的技能。以下是 Kotlin 面试中可能遇到的50个问题及解答。

qxf865618770的博客 3161

Kotlin相关面试题

目录 一.请简述下什么是kotlin?它有什么特性? 二.Kotlin 中注解 @JvmOverloads 的作用? 三.Kotlin中的MutableList与List有什么区别? 四.kotlin实现单例的几种方式? 五. kotlin中关键字data的理解?相对于普通的类有哪些特点? 六.什么是委托属性?简单说一下应用场景? 七.kotlin中with、run、apply、let函数的区别?一般用于什么场景? 八.kotlin中Unit的应用以及和Java中void的区别? 九.Ko

龚礼鹏的博客 2万+

Android面试题——kotlin相关面试题

Jetpack 是一个丰富的组件库,它的组件库按类别分为 4 类1-架构(Architecture)LifecyclesLiveDataNavigationPagingRoomViewModel2- 界面(UI)EmojiFragmentLayoutPalette3-行为(behavior)SharingSlices4-基础(foundation)AppCompatMultidexTest。

我的博客 6055

Android高级开发工程师核心能力解析与面试指南

本文系统阐述了Android高级开发工程师的技术要求与能力体系,从基础开发到系统优化形成完整闭环。重点解析了四大核心能力:1)Java/Kotlin双栈开发及NDK应用;2)Binder机制等系统原理;3)启动/内存/渲染优化方案;4)组件化架构设计。文章提供了面试题库精粹、实战优化案例和技术成长路线图,涵盖APM监控、混合开发等前沿领域,为开发者建立系统化的能力提升框架。最后指出Kotlin多平台、Compose等未来技术方向,强调持续学习对职业发展的重要性。

郑伟强dev的专栏 163

安卓Kotlin面试题 41-50

注解的作用就是:在有默认参数值的方法加上 @JvmOverloads 注解,则Kotlin就会暴露多个重载方法。:任何类型的子类,编译器对其有优化,有一定的推导能力,另外其常常和抛出异常一起使用;: Kotlin 中Any的子类, 方法的返回类型为Unit时,可以省略;private、protected、public是和java中的一样的。类委托的时,编译器会优先使用自身重写的函数,而不是委托对象的函数。kotlin 的很多特性都是在语法和编译器上的优化。:Java中的方法无法回类型时使用,但是不能省略;

我很好 456

android kotlin面试题,Android面试系列文章2018之Kotlin语言面试篇

Android面试系列文章2018之Kotlin语言面试篇1.Kotlin是什么?1.Kotlin是一种基于JVM的编程语言。2.实际上它是对Java的一种扩展。3.Kotlin支持函数式编程。4.Kotlin类和Java类的互相调用。2.Kotlin的环境搭建1.Android Studio安装Kotlin插件。2.编写ActivityKotlin进行测试。3.Kotlin会自动配置。3.有关K...

weixin_30739835的博客 365

Android面试指南与参考答案——基于领星安卓开发职位要求

本文基于领星安卓开发职位要求,整理Android开发岗位常见面试问题与参考答案。核心内容包括:1.基础知识:Android四层架构、SDK组件及API使用;2.编程语言:Kotlin优势、Jetpack组件应用及MVVM/MVP架构对比;3.开发工具:性能优化方法及版本适配策略;4.实战经验:第三方SDK集成和APP发布流程。针对1-3年经验者及应届生,提供代码示例和项目实例说明,覆盖框架搭建、性能优化等关键技术点,帮助候选人系统准备面试,突出技术能力和问题解决思维。

郑伟强dev的专栏 1193

【Android kotlin 面试题及解析

Android kotlin 面试题及解析Kotlin 已经成为 Android 开发的首选语言,面试时可能会涉及 Kotlin 的特性、协程、数据类等核心内容。

qxf865618770的博客 2148

安卓kotlin面试题 91-100

96. 解释Kotlin类的默认行为?

我很好 594

安卓kotlin面试题 101-105

101. 简述如何在 Kotlin 中比较两个字符串? Kotlin 语言允许多种方法来检查两个字符串是否相等。 使用比较运算符 在 Kotlin 中, == 用于检查两个对象的结构相等性。如果两个对象具有相同的值,它将返回 true: fun main(args: Array) { val str1: String = "Hello World" val str2: String = "Hello Kotlin" va

我很好 970

2024安卓开发面试题及答案,kotlin语言优点特性

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)4.介绍做过的项目,沿着项目一直问下去(重点问遇到的问题以及解决的方式)怎么实现,遇到哪些问题,怎么解决。

2401_84407972的博客 820

iOS逆向实战:绕过SSL Pinning抓取ChatGPT设备令牌

在移动应用安全与网络协议分析领域,中间人攻击是一种核心的流量拦截与分析技术。其原理是在客户端与服务器之间插入一个代理节点,通过伪造数字证书来解密和窥探HTTPS加密流量。这项技术的工程价值在于,它使开发者能够调试API、分析通信协议以及实现自动化集成。然而,许多高安全要求的应用(如金融、社交类App)会采用SSL Pinning(证书绑定)技术来抵御此类攻击,这为逆向工程带来了挑战。本文聚焦于一个具体的应用场景:如何针对启用了SSL Pinning的ChatGPT iOS客户端,通过特定的工具链(如Trol

weixin_28235889的博客 974

Android面试Kotlin问题整理

Kotlin面试问题整理 1、什么是kotlin kotlin是静态类型的编程语言,运行在JVM上。 2、Kotlin是谁开发的 Kotlin是由JetBrains开发的。 3、为什么使用Kotlin语言 Kotlin语言简洁高效,没有那么多冗余代码,而且是空安全的。 4、解释一下extension函数 extension函数用来对class进行扩展,而不用从class派生 5、kotlin中的空安全null safety是什么意思 空安全的特性是为了避免空指针异...

博客,是nsacer先森的 3932

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 151

TPS5430/54302调试血泪史:从‘烫手山芋’到冒烟烧板,我的5V电源到底怎么了?

本文深入剖析了TPS5430/TPS54302 DCDC电源芯片调试中的常见问题,包括异常发热、电压漂移等,并提供了从热设计到PCB布局的全面解决方案。通过实战案例,揭示了数据手册中未明确的‘潜规则’,帮助工程师避免烧板风险,提升电源系统稳定性。

weixin_28744423的博客 502

kotlin面试_Kotlin面试问题

kotlin面试Kotlin is the latest JVM programming language from the JetBrains. Google has made it the official language for Android Development along with Java. Developers say it addresses the issues faced...

从零开始的教程世界 4785

RK3576+IMX415 MIPI摄像头零拷贝显示系统

MIPI CSI-2是嵌入式视觉系统中主流的高速图像传感器接口标准,其核心价值在于低延迟、高带宽与硬件级DMA直通能力。基于V4L2子系统与DRM/KMS驱动栈,可构建从传感器RAW数据到帧缓冲区的零拷贝通路,显著降低CPU负载并提升实时性。该技术广泛应用于工业检测、边缘AI推理前数据接入及多路同步采集等场景。本文以Rockchip RK3576 SoC和索尼IMX415传感器为典型组合,详解MIPI物理层适配、内核驱动集成、GStreamer零拷贝管道搭建及systemd服务化部署,覆盖从硬件信号完整性到

weixin_36047538的博客 216

Android开发面试:Kotlin面试知识答案精解

Kotlin 什么是Kotlin:目标(更好的Java)、编程方式(面向对象命令式编程+函数式编程(Scala有包括宏))、一些改良(单例模式,data数据类,NPE,可变性,更多的语法糖,类型推导) 为什么使用Kotlin:a、Kotlin在空安全、扩展函数、协程和语法糖带来诸多特性,让代码量减少,也更加易读;b、Google一直在大力推Kotlin,目前很多源码都是Kotlin,并且可以和Java互操作无缝切换,继续做Android开发需要我们去掌握这门语言;c、自己也比较喜欢接触新事物,主动买书Kot

让学习编程变得生动有趣~ 1179

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 180

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

最新的30个Android Kotlin面试题

以上问题覆盖了Kotlin语法、协程、Android架构、性能优化等核心领域。协程是轻量级线程,通过挂起而非阻塞实现并发,减少上下文切换开销。静态代理在编译时生成,动态代理通过反射运行时创建(如Retrofit接口代理)。依次为:重试拦截器、桥接拦截器、缓存拦截器、连接拦截器、请求服务拦截器。声明式UI框架,减少模板代码,支持实时预览,与Kotlin深度集成。使用Koin或Hilt框架,通过模块化声明依赖关系,减少耦合。空安全、扩展函数、协程、更简洁的语法(如数据类)。实现数据观察,支持编译时SQL验证。

tangweiguo03051987的博客 6025

19、英国模式:银行体系的演变与现代金融架构

本文深入探讨了英国银行体系从专业化向全能银行的演变过程,分析了自律监管模式的优劣,并解析了围栏制度对金融稳定的影响。同时,文章还介绍了信用合作社、建筑协会和投资银行的角色与转型,全面展示了英国金融体系的多样性与复杂性,以及其在全球金融市场中的重要作用。

embedding5hiker的博客 104

Android studio 创建kotlin工程,爆赞

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_83946826的博客 1168

零件边界线提取处理原理详解

该程序提出了一种高效的点云边界提取方法,通过三阶段处理流程实现零件几何特征的精确提取。首先采用RANSAC算法进行坐标系标准化,包括主平面检测、点云分割和双重旋转对齐。接着使用凹包算法和RANSAC直线拟合提取底面边界。最后通过多方向密度切片分析(Z向100片、X向50片),自动选择高密度切片进行边界提取和直线拟合。算法具有鲁棒性强、处理效率高(支持OpenMP并行计算)和参数可配置等特点,能有效提取零件的几何边界特征,为后续质量检测提供基础。实验结果显示该方法能准确提取零件的多方向边界线。

weixin_45196569的博客 432

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2024年安卓最全做Android开发怎么才能不被淘汰?,kotlin语言就是你最好的选择,2024年最新字节跳动技术面试有几面

总结可以看出,笔者的工作学习模式便是由以下「六个要点」组成:❝ 多层次的工作/学习计划 + 番茄工作法 + 定额工作法 + 批处理 + 多任务并行 + 图层工作法❞希望大家能将这些要点融入自己的工作学习当中,我相信一定会工作与学习地更富有成效。下面是我学习用到的一些书籍学习导图,以及系统的学习资料。每一个知识点,都有对应的导图,学习的资料,视频,面试题目。**如:我需要学习 **Flutter的知识。(大家可以参考我的学习方法)Flutter 的思维导图(无论学习什么,有学习路线都会事半功倍)

2401_84561420的博客 944

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 【Android 源码】RecylerView的深入理解
下一篇: 【跨端技术ReactNative】JavaScript学习
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值