Android ArrayMap和SparseArray系列存储对象分析

Android为了提高开发效率,提供了一些了Sparse类用于取代Java原生的Map,主要是包括ArrayMap、SparseArray、SparseBooleanArray、SparseIntArray、SparseLongArray

ArrayMap

特点

1、hash值和键值对都是使用数组进行存储,有序数组
2、查找使用二分查找
3、只有ArrayMap可以用于存储各类数据,也就是键和值都可以自定义类型,其他的Sparse系列中键只能存储int类型的数据,SparseArray值可以存储各种类型,SparseBooleanArray、SparseIntArray、SparseLongArray值只能存储特定类型的数据

数据结构:
在这里插入图片描述
所以初始化的时候,mArray的大小就是mHashes的两倍,每次存储的时候,先二分查找hash值的位置,查找时候也会查找key是否存在,存在就返回存在的位置,否则就查找该放的位置。查找到hash值位置好之后,就会确定key的位置,因为key的位置都是hash位置的2倍大小位置,例如hash在4,对应的key就在8,value就在9。

优点:

1、代替HashMap,优点是数据结构不依赖与额外的结构体,存储结构是数组数据结构
2、当存储几百的数据时,内存性能消耗少于50%

缺点:

1、不能用于存储大量的数据
2、速度比hashmap慢,因为查找要求二分查找,添加删除要求在数组中插入和删除,要移动数组

使用详解:

 ArrayMap<String, Integer> map = new ArrayMap<>();
map.put("123",123);
Integer integer = map.get("124");
Integer remove = map.remove("123");

SparseArray:

特点

1、有序数组
2、查找使用二分查找
3、只有SparseArray可以用于存储各类数据,包括自定义实体类的对象,其他三个只能用于存储特定类型的数据

优点:

1、代替HashMap,优点是避免自动装箱、数据结构不依赖与额外的结构体,存储结构是数组数据结构
2、当存储几百的数据时,内存性能消耗少于50%
3、提高性能做了一个优化:删除键的时候,不立即删除,保留条目,标记为已删除。然后这个条目可以给相同键值的数据使用,或者将所有删除的条目集中进行删除。就是在数组扩展、检索数组时,执行垃圾回收。

缺点:

1、不能用于存储大量的数据
2、速度比hashmap慢,因为查找要求二分查找,添加删除要求在数组中插入和删除,要移动数组

使用讲解:

创建对象、添加、删除、遍历

SparseArray<String> array = new SparseArray<>();
array.append(0,"zero");
array.append(1,"fir");
array.append(2,"sec");

array.removeAt(0);

array.put(0,"zero1");
for (int i = 0; i < array.size(); i++) {
   
    Log.e("SparseArray","key="+array.keyAt(i)+":::::value="+array.get(array.keyAt(i)));
}

对象说明:

private static final Object DELETED = new Object();//values被删除时候,会标记为该对象,之后回收的时候,会将这一对数据删除
private boolean mGarbage = false;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值