Android应用中使用大容量嵌套Map是否会降低运行性能?
问题一:onCreate中多次put是否会拖慢应用启动速度
1000次put操作本身的计算耗时极低,在绝大多数设备上都是毫秒级,通常不会造成可感知的启动速度下降,但仍存在两个潜在问题:
- 如果你把所有数据硬编码为一条条
put语句写在类中,会增加类加载的耗时,同时代码可维护性极差,后续新增/修改数据非常麻烦 - 你当前的示例代码写法本身存在错误:Java标准
HashMap的put方法返回的是被覆盖的旧值,不是Map对象本身,链式调用map.put("A").put(1, xxx)会直接触发空指针异常,正确的写法如下:
Map<String, Map<Integer, int[]>> map = new HashMap<>(); // 先初始化内层Map再放入外层Map Map<Integer, int[]> aInnerMap = new HashMap<>(); aInnerMap.put(1, new int[]{1,2,3,4,5,6,7,8,9,10}); aInnerMap.put(2, new int[]{2,3,4,5,6,7,8,9,10,11}); map.put("A", aInnerMap);
优化方案
- 优先将静态数据存放在
assets目录下的JSON/CSV文件中,启动时开子线程异步加载,加载完成后再供业务逻辑调用,完全不阻塞主线程onCreate的执行流程 - 内层的
Map<Integer, Integer[]>可以替换为安卓系统提供的SparseArray<int[]>,这是专门针对整数key优化的键值对结构,内存占用比HashMap低30%左右,存取效率也更高 - 如果必须硬编码数据,可以提前初始化好所有内层数组,减少运行时的对象创建开销
问题二:该规模的嵌套Map是否会在旧款安卓设备上出现运行问题
完全不会出现问题。
该数据结构的总内存占用极低:1000条数据,每条对应10个int的数组,单个数组仅占40字节,加上Map的对象头开销,总内存占用只有几百KB,哪怕是安卓4.x的老旧设备也完全可以承载,不会出现OOM、卡顿等运行问题。
唯一需要注意的是不要将数据初始化和其他 heavy 主线程任务叠加执行,单独的该Map结构本身没有任何性能压力。
内容的提问来源于stack exchange,提问作者Hi_road
相关产品推荐
相关产品推荐

