首页 > 编程语言 >Android面试题:App性能优化之Java和Kotlin常见的数据结构

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

时间:2024-06-22 19:03:33浏览次数:12  
标签:面试题 Java HashMap val Kotlin value key 数组

本文首发于公众号“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查看更多精彩文章!

AntDream

标签:面试题,Java,HashMap,val,Kotlin,value,key,数组
From: https://blog.csdn.net/myth13141314/article/details/139873659

相关文章

  • 学习面向对象前--Java基础练习题
    前言        写给所有一起努力学习Java的朋友们,敲代码本身其实是我们梳理逻辑的一个过程。我们在学习Java代码的过程中,除了需要学习Java的一些基本操作及使用,更重要的是我们需要培养好的逻辑思维。逻辑梳理好之后,我们编写代码实现需要的功能自然也就如鱼得水,因此本篇......
  • Javascript 教程
     JavaScript 输出使用 window.alert() 弹出警告框<!DOCTYPEhtml><html><head><metacharset="UTF-8"> <title>使用window.alert()弹出警告框</title></head><body> <script>window.alert(&qu......
  • Java--面向对象--接口
    接口的概念与定义接口可以理解为抽象到不能再抽象的类,但是不要将接口和类混为一谈。可以认为类是一套体系,接口是另外一套体系,只不过类可以实现接口。接口中的方法全部都是抽象方法,不能存在实现的方法。接口使用interface关键字定义,接口的定义和类很相似。下面是经过简化的接......
  • 接口面试题
    postman接口测试,它有一个功能可以设置参数化,你有用过吗?多接口怎么测?(1)有(2){{}}、a、设置环境变量、b、在run中通过导入csv文件引用变量(3)postman里面有一个批量处理,将多个接口放至一个项目文件夹中,点击run,选择环境变量、修改运行次数和延迟秒数、选中csv文件,点击运行进行测试你......
  • JAVA学习笔记DAY10——SpringBoot基础
    文章目录SpringBoot3介绍SpringBoot快速入门@SpringBootApplicationSpringBoot配置文件统一配置管理Yaml配置优势tipsSpringBoot整合SpringMVC静态资源拦截器interceptorSpringBoot整合DruidSpringBoot整合MybatisSpringBoot整合txaopSpringBoot打包......
  • 关于随机数函数(包含C、java)
    -随机数函数在C语言中是rand()C语言的rand()函数要与srand()一起使用,使用前要用srand()进行初始化。想在for循环中使用仅需在外部使用 srand((unsigned)time(NULL)) 初始化一次就行。(此处使用当前时间作为种子)-随机函数在java中要使用到Random类与C语言不同,java的随......
  • Java计算机毕业设计超市管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代商业的快速发展,超市作为零售业的重要组成部分,其管理效率和运营水平直接影响到企业的竞争力和市场地位。然而,传统的超市管理方式往往存在效率......
  • Java Lambda 表达式中为何不能访问局部定义的变量?
    问题展示代码:publicstaticvoidtest01(){Stringstr="str";newThread(()->{str+="yes";System.out.println(str);}).start();}在jdk1.8下,在lambda表达式中访问str,编译器未报错;提示我不可访问非f......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript旅游网站
    HTML+CSS+JS【旅游网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript影视网站(爱美剧)
    HTML+CSS+JS【影视网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......