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天前
|
缓存 网络协议 安全
Android网络面试题之Http基础和Http1.0的特点
**HTTP基础:GET和POST关键差异在于参数传递方式(GET在URL,POST在请求体),安全性(POST更安全),数据大小限制(POST无限制,GET有限制),速度(GET较快)及用途(GET用于获取,POST用于提交)。面试中常强调POST的安全性、数据量、数据类型支持及速度。HTTP 1.0引入了POST和HEAD方法,支持多种数据格式和缓存,但每个请求需新建TCP连接。**
17 5
|
6天前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
28 9
|
1天前
|
缓存 网络协议 Android开发
Android网络面试题之Http1.1和Http2.0
HTTP/1.1 引入持久连接和管道机制提升效率,支持分块传输编码和更多请求方式如PUT、PATCH。Host字段指定服务器域名,RANGE用于断点续传。HTTP/2变为二进制协议,实现多工处理,头信息压缩和服务器推送,减少延迟并优化资源加载。HTTP不断发展,从早期的简单传输到后来的高效交互。
12 0
Android网络面试题之Http1.1和Http2.0
|
6天前
|
安全 Java 编译器
Kotlin和Java 单例模式
Kotlin和Java 单例模式
15 1
|
6天前
|
Java Android开发
Android性能优化:直播推流使用对象池
Android性能优化:直播推流使用对象池
5 0
|
26天前
|
安全 Java Android开发
使用Kotlin进行Android应用开发:高效、简洁与乐趣并存
【6月更文挑战第1天】Kotlin,JetBrains开发的静态类型语言,正日益成为Android开发首选。它与Java兼容,提供简洁、安全的语法,如空安全、扩展函数和Lambda表达式,提升开发效率和代码可读性。Kotlin在Android开发中的优势包括提高开发速度、降低学习曲线及强大的社区支持。实践中,数据类简化对象创建,扩展函数增强SDK,Lambda表达式简化回调处理,协程优化异步操作。掌握Kotlin对Android开发者极具价值。
|
28天前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第30天】在移动开发领域,Android平台的流畅性与效率一直是开发者追求的核心。随着Kotlin语言的普及,其提供的协程特性为编写高效、轻量级的异步代码提供了强大工具。本文将深入探讨如何在Android项目中利用Kotlin协程来优化性能,提升用户体验。我们将从协程的基本概念出发,通过实例演示如何在实际开发中合理运用协程,并讨论协程对资源管理和错误处理的影响。
21 3
|
27天前
|
存储 安全 Android开发
构建高效的Android应用:Kotlin与Jetpack的结合
【5月更文挑战第31天】 在移动开发的世界中,Android 平台因其开放性和广泛的用户基础而备受开发者青睐。随着技术的进步和用户需求的不断升级,开发一个高效、流畅且易于维护的 Android 应用变得愈发重要。本文将探讨如何通过结合现代编程语言 Kotlin 和 Android Jetpack 组件来提升 Android 应用的性能和可维护性。我们将深入分析 Kotlin 语言的优势,探索 Jetpack 组件的核心功能,并通过实例演示如何在实际项目中应用这些技术。
|
9天前
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
16 3
Android面试题之Java 泛型和Kotlin泛型
|
18天前
|
安全 Java Android开发
Kotlin与Java:Android开发的双剑合璧
【6月更文挑战第9天】Kotlin和Java在Android开发中形成互补态势。Java凭借广泛社区支持和丰富的类库资源占据主导,但其语法繁琐和空指针问题限制了发展。Kotlin,设计来解决这些问题,以其简洁、安全、高效的特性逐渐兴起。Kotlin的互操作性允许与Java无缝集成,提升开发效率,减少错误。两者结合提高了代码质量和开发者的灵活性,促进了Android开发社区的繁荣。开发者应把握这种&quot;双剑合璧&quot;,适应技术发展。
33 10