Android面试题:App性能优化之Java和Kotlin常见的数据结构

简介: Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Java常见数据结构特点

ArrayList

  • ArrayList底层是基于数组实现
  • add、删除元素需要进行元素位移耗性能,但查找和修改块
  • 适合不需要频繁添加删除的

链表

  • LinkedList 是双链表插入和删除节点快,查找和修改耗时

HashMap

  • 1.7之前是数组+链表;1.8之后是数组+链表+红黑树
  • 计算key的位置时用的位运算:h & (length-1),位运算更快
  • HashMap对应的key、value是一一对应的唯一的
扩容
  • 默认HashMap大小是16,必须是2的倍数
  • 加载因子:默认是0.75
  • 阈值:0.75 * 16 = 12的时候扩容
  • 扩容是为了避免冲突,提升性能,扩容的时候会重新计算哈希,比较耗性能
  • 要尽量避免扩容,初始化的时候要设置HashMap的大小,会自动计算到最接近的2的次幂
  • HashMap真正初始化的时候是在put的时候,节约内存
  • 为什么是2的次幂,是为了计算index:h & (length-1),后面是1111,计算index更不容易碰撞
  • HashMap是用空间换时间

HashMap的一个经典的优化就是初始化时,尽可能的设置要初始化的容量,尽量避免扩容的发生

SparseArray

  • 原理是2个数组,key一个数组,value一个数组,key和value一一对应
  • key是int,value是object
  • key数组是按照大小顺序排,查找的时候是2分查找,提升性能
  • remove的时候,不会真的移除,而是会做个标记,这样不用arraycopy,下次再put就是一个赋值操作,提升性能
  • 会越用越快,缺点是key只能是int

ArrayMap

  • 原理是HashMap+SparseArray,也是2个数组,key数组和value数组,不过key不限于int
  • key的计算和HashMap一样,不过有哈希冲突时,没有用链表而是追加到后面

Kotlin中的优化

Kotlin提供了一些优化和特性来简化和高效地操作常见的数据结构,如 ListMap。以下是一些针对这些数据结构的优化和特性示例:

List

  1. Immutable Lists: 使用 listOf() 创建不可变列表。
  2. Mutable Lists: 使用 mutableListOf() 创建可变列表。
  3. 操作符重载: 你可以使用标准库中的高阶函数、扩展函数和操作符重载来高效地操作列表。
// 创建不可变列表
val numbers: List<Int> = listOf(1, 2, 3, 4, 5)

// 创建可变列表
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3)
mutableNumbers.add(4)

// 使用扩展函数
val doubled = numbers.map { it * 2 }  // [2, 4, 6, 8, 10]
val filtered = numbers.filter { it > 2 }  // [3, 4, 5]

Map

  1. Immutable Maps: 使用 mapOf() 创建不可变映射。
  2. Mutable Maps: 使用 mutableMapOf() 创建可变映射。
  3. Destructuring: 优化遍历和解构键值对。
// 创建不可变映射
val map: Map<String, Int> = mapOf("a" to 1, "b" to 2, "c" to 3)

// 创建可变映射
val mutableMap: MutableMap<String, Int> = mutableMapOf("x" to 10, "y" to 20)
mutableMap["z"] = 30

// 使用扩展函数
val keys = map.keys  // 获取所有的键
val values = map.values  // 获取所有的值

// Destructuring
for ((key, value) in map) {
    println("Key: $key, Value: $value")
}

特定优化和高级功能

1、Kotlin的序列提供了懒加载特性,有助于处理大量数据。
2、在扩展函数中使用默认参数提高代码可读性和灵活性。

// Lazy Sequence
val lazyList = listOf(1, 2, 3, 4, 5).asSequence()
    .filter { it % 2 == 0 }
    .map { it * 2 }
    .toList()

// 使用默认参数的扩展函数
fun List<Int>.sum(defaultValue: Int = 0): Int {
    return this.fold(defaultValue) { acc, i -> acc + i }
}

val sum = listOf(1, 2, 3).sum()  // 默认参数,结果是6
val sumWithInitial = listOf(1, 2, 3).sum(10)  // 初始值为10,结果是16

通过这些优化和特性,Kotlin使得操作常见数据结构变得更加简洁和高效。同时,通过深入使用Kotlin标准库中的扩展函数和特性,我们也可以大大简化代码并提高其可读性和可维护性。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
22 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
24 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
25天前
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
29 9
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
87 11
|
5月前
|
Android开发 Kotlin
Android经典面试题之Kotlin的==和===有什么区别?
本文介绍了 Kotlin 中 `==` 和 `===` 操作符的区别:`==` 用于比较值是否相等,而 `===` 用于检查对象身份。对于基本类型,两者行为相似;对于对象引用,`==` 比较值相等性,`===` 检查引用是否指向同一实例。此外,还列举了其他常用比较操作符及其应用场景。
211 93
|
4月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
63 1
|
4月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
90 4
|
4月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
68 1
|
5月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
207 1
|
4月前
|
Android开发 Kotlin
Android面试题之Kotlin中如何实现串行和并行任务?
本文介绍了 Kotlin 中 `async` 和 `await` 在并发编程中的应用,包括并行与串行任务的处理方法。并通过示例代码展示了如何启动并收集异步任务的结果。
56 0