Android性能优化之容器使用

一款Android应用除了具备实现好用的功能和清晰明了的交互之外,对性能也应该有极致的追求,对每一个点做好优化,积少成多最终做出高性能的APP,能极大的增强用户的体验

优化的目标

从优化的目的来看,可分为以下三个:

1.更快:更快指的是应用的流畅性,可从以下几点来提升APP的流畅性

  • 启动速度
  • 页面显示的速度
  • 响应的速度

2.更稳定:更稳定指的是减少APP的异常情况

  • 避免出现APP崩溃(Crash)
  • 避免出现APP无响应(ANR)

3.更节省:更节省指的是对资源的节省,可分为以下几点

  • 内存大小:应尽量减少不必要的内存消耗
  • 安装包大小
  • 耗电量
  • 网络流量

容器的选择

在Android中最常用的数据容器大概就是ArrayList,在大多数情况下使用ArrayList作为数据容器是比较合适的,但ArrayList也有它的缺陷,我们应该基于业务场景选择更合适的数据容器,下面来分析一下Android中各种容器的优劣势

ArrayList
ArrayList是实现了基于动态数组的数据结构,创建时申请一块连续的内存。
优点:对于指定的查询和修改,通过下标get/set,拥有更快的速度
缺点:对于指定的插入和删除,其实现是通过拷贝数组来实现,这样就导致速度较慢

LinkedList
LinkedList是底层是双向链表,内部通过指向前后节点来关联。
优点:对于指定的插入和删除,只需改变指向的目标对象就可实现,速度更快
缺点:对于指定的查询和修改,需要一个个查询目标节点,速度较慢

对比:

  • 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
  • 在ArrayList集合中添加或者删除一个元素时,当前的列表移动元素后面所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
  • LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
  • ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

所以在查询,修改操作更为频繁的场景更适合ArratList,而对于查询比较少而插入删除比较多的场景更适合使用LinkedList

HashMap
HashMap可以说结合了ArrayList和LinkedList的优点,底层使用数组加(链表或红黑树)的结构是一种查询效率高和插入删除效率也高的数据结构。

对于put操作:第一步首先将k,v封装到Node对象当中(节点)。第二步它的底层会调用K的hashCode()方法得出hash值。第三步通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表(哈希碰撞)。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。

对于get操作:第一步:先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。第二步:通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着参数K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。

增删是在链表上完成的,而查询只需扫描部分,则效率高。
而在使用时,用作key的对象,需要重写其equals方法,因为equals默认比较是两个对象内存地址,hashmap集合的默认初始化容量为16,默认加载因子为0.75,也就是说这个默认加载因子是当hashMap集合底层数组的容量达到75%时,数组就开始扩容。hashmap集合初始化容量是2的陪数,为了达到散列均匀,提高hashmap集合的存取效率,

JDK8之后,如果哈希表单向链表中元素超过8个,那么单向链表这种数据结构会变成红黑树数据结构。当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。

SparseArray
SparseArray采用两个数组,分别用来存放key和value的值,核心思想是通过二分查找来找到key对应的位置,然后取出值,或者插入值。
SparseArray采用两个数组分别用来存放key,value,通过二分查找法每次插入的时候会找到最合适的位置顺序插入,保证key在数组中是有序的,取出也是类似!时间复杂度是log(n),比较高效!并且越用越快(删除值时,并不会重新拷贝数组而是给一个标志位DELETED,下次需要插入该位置时也就不用重新拷贝数组了,达到了复用的效果)
缺点:key只能是int类型

ArrayMap
ArrayMap同样有两个数组;一个数组用来存放key的hash值,并且是排好序的;另一个数组用来存放keyvalue值;这样一个数据就占用一份内存;内存节省;get/put时会根据key的hashCode进行二分查找到index,在另一个数组中获取值;
缺点:需要装箱操作,同样使用int类型性能略低于SparseArray

小结
在实际使用中,数据量小于1000的时候可以使用ArrayMap来替代hashMap,能节约内存,而key可为int类型则使用SparseArray性能更高,超过这个数据量使用hashMap效率更高,但在android的APP应用场景作为终端,很少有很大的数据量,通常情况下SparseArray更有优势。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 性能优化实战篇 PDF 是一本介绍如何优化 Android 应用性能的电子书。该书通过实践经验和案例分析,向读者提供了一系列提高应用性能的实用技巧和方法。 该书首先介绍了性能优化的基本概念,例如应用启动时间、内存管理、网络请求和绘制性能等方面。之后,通过对真实应用情景的分析,详细介绍了一些常见的性能问题,并给出了相应的解决方案。 对于应用启动时间的优化,该书提供了一些切实可行的建议。例如合理使用启动模式、使用冷启动的启动动画、减少启动时的初始化操作等。这些方法可以明显减少应用的启动时间,提升用户体验。 在内存管理方面,该书介绍了如何减少内存泄漏和优化内存占用。通过使用合适的数据结构、避免频繁的对象创建和销毁、注意资源的主动释放等方法,可以有效地减少内存开销,提高应用的稳定性和响应速度。 对于网络请求的优化,该书提供了一些网络请求的最佳实践。例如使用合适的网络请求库、优化请求的并发性、合理使用缓存等。这些方法可以减少网络请求的时间,提高数据加载速度,提升用户体验。 对于绘制性能的优化,该书介绍了如何优化布局和渲染过程,提高界面的流畅度。例如使用合适的布局容器、避免过度绘制、使用硬件加速等。这些方法可以减少界面卡顿和掉帧现象,提升应用的视觉效果。 总而言之,Android 性能优化实战篇 PDF 提供了一些宝贵的经验和方法,帮助开发者优化应用的性能,提升用户体验。不仅可以帮助开发者理解性能优化的基本原理,还给出了一些具体的解决方案,对于 Android 应用的开发和优化都非常有帮助。 ### 回答2: 《Android性能优化实战篇》是一本针对Android开发者的重要参考书籍,旨在帮助开发者提升应用性能,提高用户体验。该书内容包含以下几个方面: 1. 性能分析工具:介绍了常用的性能分析工具,如Android Profiler、TraceView等。通过使用这些工具,开发者可以监测应用在不同场景下的性能情况,例如CPU占用、内存使用、网络请求等,从而快速定位并解决性能问题。 2. UI性能优化:详细介绍了Android UI渲染原理以及优化方法。通过合理使用View的绘制流程、减少UI层级和View的复杂度、适当使用缓存等方法,可以提升UI渲染的速度,提高应用的响应性。 3. 内存优化:介绍了内存泄漏的原因及排查方法,提供了避免内存泄漏的最佳实践。此外,还介绍了内存管理机制以及如何合理地使用内存,包括优化Bitmap的加载、使用SparseArray替代HashMap等。 4. 网络优化:讨论了网络请求中存在的性能问题,并提供了相应的解决方法。例如,合理使用缓存技术、减少网络请求的频率、使用多线程进行并发请求等。 通过学习《Android性能优化实战篇》,开发者可以更全面地了解和掌握Android性能优化的方法与技巧,并能够针对具体场景中的性能问题进行准确的分析和解决。这对于提高应用的性能和用户体验具有重要意义。 ### 回答3: 《Android性能优化实战篇》是一本介绍如何提升Android应用性能的实战指南,旨在帮助开发人员通过一系列优化技巧和方法,使应用在运行时更加稳定和高效。 该书首先介绍了性能优化的基本概念和原则,包括优化目标、优化思路等。然后详细讲解了Android系统的性能优化核心内容,如内存优化、CPU优化、网络优化等。其中涉及到了一些基本的工具和技术,如内存泄漏的检测与优化、多线程优化、数据缓存等。同时,该书还提供了一些优化实例,通过示例展示了具体的优化方法和效果。 对于开发人员来说,优化应用的性能是一个非常重要的任务,能够提高用户的体验度和应用的竞争力。《Android性能优化实战篇》通过详细的指导和实例,帮助读者快速理解和掌握性能优化的基本方法和技巧,同时提供了大量实战经验和案例,让读者能够更加深入地了解优化的过程和效果。 总而言之,该书是一本非常实用的Android性能优化指南,对于开发人员来说是一本必备的参考书籍。通过阅读该书,开发人员能够系统地学习和掌握Android应用的性能优化方法,提高应用的性能和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值