Android 内存优化—从小事做起

如何编写高性能的 Android 应用,要提高应用性能当然少不了对内存管理和优化。今天我们就从一些大家平时不注意的地方,而这些地方也是不能忽略的地方进行内存优化。

1. 数据类型

基本数据类型大家经常忽略他,就像忽略加减乘除一样。我记得一次面试就被问到各种数据类型所在字节数,当时还不以为然,觉得问题low,平时在coding时也很少注意这些。其实这才是看出您coding水平的地方,一句话大家都懂—不要使用比需求更大的基本类型:大才小用。希望大家从今天也开始注意这些。

Android 内存优化—从小事做起_第1张图片

2. 自动装箱

使用自动装箱并非改善性能,自动装箱有一个问题,那就是在一个循环中进行自动装箱操作的情况,如下面的例子就会创建多余的对象,影响程序的性能。

Android 内存优化—从小事做起_第2张图片

一个 Interger 需要 16byte 的内存空间,而基本类型只需要 16 bit。

int temp = integer.inValue() + 1;

先创建 integer 对象,接着加 1,然后将值符给 integer 对象。

Android 内存优化—从小事做起_第3张图片

Sparse 数组登场

上面我们建议使用基本数据类型,而不是用包装类型。但显示并非如此,我们集合中经常要使用到包括类型

Android 内存优化—从小事做起_第4张图片

List list;

Map map

Set set

我们都清楚在开发中不可避免要遇到这些数据类型,怎么办?Android 为我们提供一些有用的对象,来代替 Map 对象,避免发生自动装箱又防止占用大量无意义的内存。

SparseBooleanArray: HashMap

SparseLongArray: HashMap

...

SpareseArray : HashMap

我们就 SparseArray 讨论一下,

SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只需要指定value的类型即可.并且key不需要封装成对象类型

SparseArray 使用两个不同的数组,分别用于存储 hash 和对象。

SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间,我们从源码中可以看到key和value分别是用数组表示

我们可以看到,SparseArray只能存储key为int类型的数据,同时,SparseArray在存储和读取数据时候,使用的是二分查找法。

Android 内存优化—从小事做起_第5张图片

也就是在put添加数据的时候,会使用二分查找法和之前的key比较当前我们添加的元素的key的大小,然后按照从小到大的顺序排列好,所以,SparseArray存储的元素都是按元素的key值从小到大排列好的。

我们今天就到这里,我会持续推出编写高性能 android 的分享。

你可能感兴趣的:(Android 内存优化—从小事做起)