SimpleArrayMap 源码解析

本文详细解析了SimpleArrayMap的源码,探讨了其内存优化策略,包括通过allocArrays()和freeArrays()进行内存管理,以及如何通过缓存避免不必要的内存分配。SimpleArrayMap使用键值对数组和哈希值数组,采用二分查找定位,适用于内存敏感的场景。同时,文章建议在需要标准API操作时使用ArrayMap,若存储数据较多,推荐使用HashMap。
摘要由CSDN通过智能技术生成

首先,SimpleArrayMap的设计,是为了在对内存空间的使用上,要优于HashMap。因为HashMap在分配空间时是使使用空间倍增,且对空间的使用率因具体环境而定,也就是说HashMap为了保证它高速定位的特性,要牺牲很多内存空间,在Android里内存空间异常珍贵,因为,引入了SimpleArrayMap。

接着,当说起SimpleArrayMap,不能不提及ArrayMap。在本质上,这两个数据结构是同样的东西,只不多ArrayMap提供了可以使用Java的API集合的标准方式来操作数据,且ArrayMap拥有EntrySet。SimpleArrayMap是以键值对的方式将数据关联起来,然后利用Hash值进行定位,下面开始说源码

构造SimpleArrayMap

public SimpleArrayMap();
public SimpleArrayMap(int capacity);
public SimpleArrayMap(SimpleArrayMap map);

SimpleArrayMap拥有三个构造函数,一种使用默认大小,一种使用指定大小,还有一种接受另一个SimpleArrayMap

public SimpleArrayMap(int capacity) {
        if (capacity == 0) {
            mHashes = ContainerHelpers.EMPTY_INTS;
            mArray = ContainerHelpers.EMPTY_OBJECTS;
        } else {
            allocArrays(capacity);
        }
        mSize = 0;
    }

在接收指定大小构造上,会调用到allocArrays(),此函数完成了对内存空间的有效利用,后面再加以说明。

    // 分配空间的步增,也是利用内存空间的依据
     private static final int BASE_SIZE = 4;


    private static final int CACHE_SIZE = 10;

    // 内存空间的缓存
    static Object[] mBaseCache;
    // 缓存了几组SimpleArrayMap结构的空间
    static int mBaseCacheSize;
    // 内存空间的缓存 与上差别为容量大小
    static Object[] mTwiceBaseCache;
    // 缓存了几组SimpleArrayMap结构的空间
    static int mTwiceBaseCacheSize;

    //hash值
    int[] mHashes;
    //hash值对应的对象
    Object[] mArray;
    int mSize;

SimpleArrayMap维护的参数已做说明,不多阐述

SimpleArrayMap对空间的利用

在simpleArrayMap使用allocArrays()和freeArrays()完成了对内存空间的利用,前者在分配空间或构造使使用,后者在释放时使用。基本原理在于,当键值对数组mArray和哈希值数组mArray不再使用时,如果这两个数组满足一定条件,就不会马上将他们释放掉,而是存起来,以便在构造或分配空间时候重建利用这一段内存空间。

首先看freeArrays()

private static void freeArrays(final int[] hashes, final Object[] array, final int size) {
        if (hashes.length == (BASE_SIZE*2)) {
            synchronized (ArrayMap.class) {
                if (mTwiceBaseCacheSize < CACHE_SIZE) {
                    array[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值