相信大家都用过HashMap
用来存放键值对,最近在项目中使用HashMap
的时候发现,有时候 IDE 会提示我这里的HashMap
可以用SparseArray
或者SparseIntArray
等等来代替。
SparseArray(稀疏数组).它是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只需要指定value的类型即可.并且key不需要封装成对象类型.
首先是创建:
SparseArray<Student> sparseArray = new SparseArray<>();
SparseArray<Student> sparseArray = new SparseArray<>(capacity);//这里是可以指定长度的
插入:
sparseArray.put(int key,Student value);// 这里SparseArray存放的键值对中的键是int型的数据
获取:
sparseArray.get(int key);
sparseArray.get(int key,Student valueIfNotFound);
删除:
sparseArray.remove(int key);// 通过int类型的键删除指定的值
index:
因为是可以替代HashMap的,前面的方法和其没有太大区别。而这个index
就是SparseArray
所特有的属性了,SparseArray
从名字上看就能猜到跟数组有关系,事实上他底层是两条数组,一组存放key
,一组存放value
,知道了这一点应该能猜到index
的作用了...
sparseArray.indexOfKey(int key);
sparseArray.indexOfValue(T value);
sparseArray.keyAt(int index);
sparseArray.valueAt(int index);
sparseArray.setValueAt(int index);
sparseArray.removeAt(int index);
sparseArray.removeAt(int index,int size);
注:通过对SparseArray[
index]底层源码的分析---SparseArray
每次的插入方式都需要调用二分查找.因此这样在倒序插入的时候会导致情况非常的糟糕,效率上绝对输给了HashMap学过数据结构的大家都知道.Map在插入的时候会对冲突因子做出相应的决策.有非常好的处理冲突的方式.不需要遍历每一个值.因此无论是倒序还是正序插入的效率取决于处理冲突的方式,因此插入时牺牲的时间基本是相同的.