Android - 性能优化之数据结构
2024-04-10 07:20:02  阅读数 377

什么是性能优化

一款app除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的享受,这样才能提供用户体验

优化目的 性能指标 优化方法
更快 流畅性 启动速度,页面显示速度(显示和切换),响应速度
更稳定 稳定性 避免出现应用崩溃(Crash),避免出现应用无响应(ANR)
更省 资源节省性 内存大小,安装包大小,耗电量,网络流量

线性数据结构

  • 数组

    一片连续的存储空间. eg:int[i]

  • 顺序表 (ArrayList)

    • 物理上连续
    • 逻辑上连续
    • 大小可以动态增加
  • 链表(LinkedList)

    • 物理上不连续

    • 逻辑上连续

    • 可以动态增加和删除节点

顺序表 链表
优点 物理上连续,所以寻找快 空间不连续,逻辑上连续,删除,增加元素快
缺点 删除和增加元素要大量移动数据,损耗性能 物理上不连续,查找要轮训,查找慢

Hash 表

结合了数组和链表的优点,增删改查都很快。

HashMap
hashMap的特点
  • Collection 是集合,有数组(ArrayList)查找快增删慢,有链表(LinkList)增删快查找慢,Map 就是数组与链表的结合体,结合了两的优点。

  • HashMap 的数据关系是 key 到 value 的映射关系,key 是唯一的,value是可以重复的。

  • HashMap 的 Hash , 是因为 key 是需要计算哈希值,这种数组就是散列表。

  • HashMap 可以理解为 key计算后的位置用 数组 保存,数组里面的内容放着 链表,链表的节点是 key-value 一个个保存起来,查找的时候,快速找到数组中对应的位置,然后遍历链表。

  • HashMap 非线程安全,可以用 HashTable。

  • HashMap 数据是无序的,需要有序的使用 LinkedHashMap。

操作 原理
增加 先计算Key的hash值(装箱拆箱),根据hash值找到数组位置,再往链表中添加元素
查找 先计算Key的hash值(装箱拆箱),根据hash值找到数组位置,再遍历链表
删除 先计算Key的hash值(装箱拆箱),根据hash值找到数组位置,再从链表中删除节点

SparseArray

操作 原理
增加 根据Key值进行二分查找,找到可以添加元素的位置,然后插入数据,并移动其他数据
查找 根据Key值进行二分查找,找到数组下标,然后取出对应value值
删除 根据Key值进行二分查找,找到数组下标,然后将mValues数组的对应下标处的值置为DELETED

HashMap 和 SparseArray性能对比