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

本文首发于公众号“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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/356675.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码

知识星球&#x1f517;除了包含技术干货&#xff1a;《Java代码审计》《Web安全》《应急响应》《护网资料库》《网安面试指南》还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 我们来看一下市面上常见的图形验证…

状态压缩DP——AcWing 291. 蒙德里安的梦想

状态压缩DP 定义 状态压缩DP是一种利用二进制数来表示状态的动态规划算法。它通过将状态压缩成一个整数&#xff0c;从而减少状态数量&#xff0c;提高算法效率。 运用情况 状态压缩DP通常用于解决具有状态转移和最优解性质的问题&#xff0c;例如组合优化、图论、游戏等问…

Vue82-组件内路由守卫

一、组件内路由守卫的定义 在一个组件里面去写路由守卫&#xff0c;而不是在路由配置文件index.js中去写。 此时&#xff0c;该路由守卫是改组件所独有的&#xff01; 只有通过路由规则进入的方式&#xff0c;才会调这两个函数&#xff0c;否则&#xff0c;若是只是用<Ab…

LogicFlow 学习笔记——9. LogicFlow 进阶 节点

LogicFlow 进阶 节点&#xff08;Node&#xff09; 连线规则 在某些时候&#xff0c;我们可能需要控制边的连接方式&#xff0c;比如开始节点不能被其他节点连接、结束节点不能连接其他节点、用户节点后面必须是判断节点等&#xff0c;想要达到这种效果&#xff0c;我们需要为…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一&#xff0c; 文档描述二&#xff0c; Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一&#xff0c; 文档描述 RT600的启动模式共支持4种&#xff1a; 1&am…

C++设计模式——Composite组合模式

一&#xff0c;组合模式简介 真实世界中&#xff0c;像企业组织、文档、图形软件界面等案例&#xff0c;它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易&#xff0c;在软件开发中&#xff0c;组合模式的设计思想和它们类似。 组合模式是…

数据库设计概述-数据库设计内容、数据库设计方法(基于E-R模型的规范设计方法)

一、引言 如何利用关系数据库理论设计一个满足应用系统需求的数据库 二、数据库设计内容 1、数据库设计是基于应用系统需求分析中对数据的需求&#xff0c;解决数据的抽象、数据的表达和数据的存储结构等问题 2、其目标是设计出一个满足应用要求、简洁、高效、规范合理的数…

Redis 集群 - 数据分片算法

前言 广义的集群&#xff1a;只要是多个机器构成了一个分布式系统&#xff0c;都可以被称为集群。 狭义的集群&#xff1a;redis 的集群模式&#xff0c;这个集群模式下&#xff0c;主要是解决存储空间不足的问题。 Redis 集群 redis 采用主从结构&#xff0c;可以提高系统的可…

「动态规划」如何求最长湍流子数组的长度?

78. 最长湍流子数组https://leetcode.cn/problems/longest-turbulent-subarray/description/ 给定一个整数数组arr&#xff0c;返回arr的最长湍流子数组的长度。如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是湍流子数组。更正式地来说&#xff0c;…

从开源EPR产品Odoo学习

前言 一个先进、敏捷、经济高效、可快速扩展的Odoo免费开源企业信息化解决方案&#xff0c;让企业获得适应未来发展的长期创新和增长能力。 Odoo 的免费开源模式 让我们可利用无数开发人员和业务专家&#xff0c;在短短数年内&#xff0c;打造数百款应用。凭借强大的技术基础&…

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

现在这个行情,又又又要开始准备面试了~~

亲爱的程序员朋友们: 这些资料曾经帮助过许多有志之士顺利拿下抖音、快手、阿里等大厂的Offer&#xff0c;现在也希望它们能为你的面试旅程助力&#xff01; 关注【程序员世杰】回复【1024】惊喜等你来拿&#xff01; 截图 关注【程序员世杰】回复【1024】惊喜等你来拿&#xf…

车辆轨迹预测系列 (三):nuScenes数据集详细介绍-1

车辆轨迹预测系列 (三)&#xff1a;nuScenes数据集详细介绍-1 文章目录 车辆轨迹预测系列 (三)&#xff1a;nuScenes数据集详细介绍-1一、数据集准备1、解压2、安装nuscenes-devkit3、介绍 二、架构内容解释1、category 类别2、attribute 属性3、visibility 可见性4、instance …

包含网关的概念及案例演示

包容网关 知识点讲解 包容网关可以看作排他网关和并行网关的结合体。与排他网一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;但与排他网关不同的是&#xff0c; 进行决策判读时&#xff0c;包容网关所有条件为true的后继分支都会被依次执行。如果所有分支条件都为fa…

IMU用于飞行坐姿校正

为了提升长途飞行的舒适度并预防乘客因不良坐姿导致的身体不适&#xff0c;来自荷兰上海两所大学的研究团队携手开发出一种创新的“舒适穿戴”设备&#xff0c;专为识别飞行中的坐姿设计。 研究团队制作了两种原型设备&#xff1a;一种追求极致舒适&#xff0c;另一种为紧身设…

干货!!SSAS模型刷新步骤

白茶在上一篇文章PowerBI迁移到SSAS向小伙伴们介绍了如何将已经开发好的PowerBI模型迁移到SSAS整个操作过程&#xff0c;与此同时也带来了新的问题&#xff0c;那就是SSAS的模型该如何刷新呢&#xff1f; 配套工具 SSMS Visual Studio SSIS SSIS[1]的全称是SQL Server Inte…

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群

桂电人工智能学院大数据实验&#xff0c;使用 Docker 搭建 hadoop 集群 第一步 安装 Docker, Windows 上可以使用 Docker Desktop 下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ 安装过程自行谷歌 安装好的标志&#xff1a;打开终端 运行docker p…

JetBrains PyCharm 2024 mac/win版编程艺术,智慧新篇

JetBrains PyCharm 2024是一款功能强大的Python集成开发环境(IDE)&#xff0c;专为提升开发者的编程效率和体验而设计。这款IDE不仅继承了前代版本的优秀特性&#xff0c;还在多个方面进行了创新和改进&#xff0c;为Python开发者带来了全新的工作体验。 JetBrains PyCharm 20…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具&#xff08;Vite 或 webpack&#xff09;处理的所有资产。 public/目录 public目录用作静态资产的公共服务器&#xff0c;可在您的应用程序定…

PDF标准详解(三)—— PDF坐标系统和坐标变换

之前我们了解了PDF文档的基本结构&#xff0c;并且展示了一个简单的hello world。这个hello world 虽然只在页面中显示一个hello world 文字&#xff0c;但是包含的内容却是不少。这次我们仍然以它为切入点&#xff0c;来了解PDF的坐标系统以及坐标变换的相关知识 图形学中二维…