Android开发之十七:集合之SparseArray、ArrayMap详解

前言


作为一个Anndroid开发人员来说,我们大多数情况下时使用的Java语言,自然在一些数据的处理时,使用到的集合框架也是Java的,比如HashMap、HashSet等,但是你可否知道,Android因为自身特殊的需求,也为自己量身定制了“专属”的集合类,查阅官方文档,android.util包下,一共捕获如下几个类:SparseArray系列(SparseArray,SparseBooleanArray,SparseIntArray,SparseLongArray,LongSparseArray),以及ArrayMap、ArraySet,我相信即便没学过,看到这些类名,基本也能猜到一些它们的区别和用法了,下面我们就来好好学一学它们,开始吧!

目录


1.使用方法 
2.感受设计之美 
3.优缺点及应用场景

正文


使用方法
按照我的习惯,我觉得不管学什么,首先需要的就是会用“它”,感受一下它的用法,其次才能再谈理论上的东西,下面我们先来学一学怎么使用。 
首先我们看一下SparseArray的使用方法

       

 //声明
        SparseArray<String> sparseArray= new SparseArray<>();
        //增加元素,append方式
        sparseArray.append(0, "myValue");
        //增加元素,put方式
        sparseArray.put(1, "myValue");
        //删除元素,二者等同
        sparseArray.remove(1);
        sparseArray.delete(1);
        //修改元素,put或者append相同的key值即可
        sparseArray.put(1,"newValue");
        sparseArray.append(1,"newValue");
        //查找,遍历方式1
        for(int i=0;i<sparseArray.size();i++){
            Log.d(TAG,sparseArray.valueAt(i));
        }
        //查找,遍历方式2
        for(int i=0;i<sparseArray.size();i++){
            int key = sparseArray.keyAt(i);
            Log.d(TAG,sparseArray.get(key));
        }


OK,很正常的使用方法,和hashmap 等数据结构基本一样。 
唯一不同的就是key和value的类型,hashmap的key值和value值为泛型,但是SparseArray 的key值只能为int 类型,value值为Object类型,看到这,你可能会觉得很奇怪,这不是在使用上受到了很大的约束嘛,这样约束的意义何在呢?

先别急,我们看看剩下的SparseArray 的双胞胎兄弟姐妹们,LongSparseArray 和SparseArray 相比,唯一的不同就是key值为long,所以,既然为long ,那么相对SparseArray 来说,它可以存储的数据元素就比SparseArray 多。

顺带温习一下,int的范围是-2^31 到 2^31-1,而long是-2^63 到 2^63-1

然后轮到了SparseBooleanArray,SparseIntArray,SparseLongArray,这三兄弟相对SparseArray 来说就是value值是确定的,SparseBooleanArray的value固定为boolean类型,SparseIntArray的value固定为int类型,SparseLongArray的value固定为long类型。

注意这里的value中的值类型boolean、int、long都是小写的,意味着是基本类型,而不是封装类型

稍作总结一下,如下

SparseArray          <int, Object>
LongSparseArray      <long, Object>
SparseBooleanArray   <int, boolean>
SparseIntArray       <int, int>
SparseLongArray      <int, long>



ok,然后我们再看看ArrayMap和ArraySet 的使用

       

ArrayMap<String,String> map=new ArrayMap<>();
        //增加
        map.put("xixi","haha");
        //删除
        map.remove("xixi");
        //修改,put相同的key值即可
        map.put("xixi2","haha");
        map.put("xixi2","haha2");
        //查找,通过key来遍历
        for(String key:map.keySet()){
            Log.d(TAG,map.get(key));
        }


OK,很正常的用法,和HashMap无异。ArraySet就不用我继续说了吧,它们的关系就像HashMap和HashSet一样,它和HashSet都是不能存储相同的元素。

额外说明一下,ArraySet使用要求sdk最小版本为23,也就是minSdkVersion值必须大于等于23

发布了377 篇原创文章 · 获赞 145 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/Windgs_YF/article/details/104298890