android独有的省内存的轻量级容器类

在android中, 如果可能, 请优先考虑SparseArray族(稀疏数组)代替HashMap:
SparseArray HashMap<Integer, Object>
SparseBooleanArray HashMap<Integer, Boolean>
SparseIntArray HashMap<Integer, Integer>
SparseLongArray HashMap<Integer, Long>
给出的优点: 比HashMap省很多内存; 没有装箱拆箱; 与equals()和hashCode()无关; 对于小容量情况(小于1000), 速度与HashMap相差不大;
不过可能的缺点: 不工作在非android项目上; 速度比HashMap慢(SparseArray使用两个数组, 其添加、查找、删除数据都需要先进行一次二分查找), 不适合大容量的情况; 当然你也可以尝试trove.jar;


在android中, 如果可能, 请优先考虑ArrayMap/ArraySet代替HashMap/HashSet:
1. ArraySet不是由ArrayMap实现(HashSet是由HashMap实现), 整体上ArraySet/ArrayMap比HashSet/HashMap轻量级的多;
2. 将Key的hash存在一个int[]数组里, 表明Key的唯一性, 而不是用作hash查找算法, 将Key/Value都存在Object[]类型的数组里, 如果Key存在索引i上, 则Value存在i+1的位置上, 使用二分查找在int[]中找到对应hash所在的index, 然后由index映射到对应Object[]的某个索引位置, 进而得到Key/Value;
3. 为了KeySet, 有必要在Object[]中存储Key;
4. ArrayMap/ArraySet会更积极地控制底层数组的大小增长, 因为它只要求复制数组条目, 而不是像HashMap/HashSet那样重建一个哈希映射;
5. 和SparseArray族一样, 比HashMap/HashSet更省内存, 但在大容量情况, 速度比HashMap/HashSet慢, 其中一个原因是为了节省内存, ArrayMap/ArraySet可能在删除操作时, 压缩底层数组, HashMap/HashSet取胜的另一个关键是hash查找算法比二分查找高效, 但前提是一个好的hash算法函数和一个大的容器空间以减少hash碰撞;
6. 如果你不需要Java类库里的标准容器API(比如迭代器等), 可以考虑使用支持库里的SimpleArrayMap, 后者没有实现java.util.Map接口;


注: 对于大容量的情况, 请务必关注构造器capacity的设置, 它对性能的影响至关重要;

猜你喜欢

转载自blog.csdn.net/kslinabc/article/details/50834710