关闭

SparseArray

标签: SparseArray
702人阅读 评论(0) 收藏 举报
分类:

单纯从字面上来理解,SparseArray指的是稀疏数组(Sparse array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。


在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组:


其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。

继续阅读SparseArray的源码,从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10

public SparseArray() {
        this(10);
    }
 
    public SparseArray(int initialCapacity) {
        initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
 
        mKeys = new int[initialCapacity];
        mValues = new Object[initialCapacity];
        mSize = 0;
    }
1.插入   
public void put(int key, E value) {}
public void append(int key, E value){}
2.删除
public void delete(int key) {}
public void remove(int key) {} //直接调用的delete(int key)
public void removeAt(int index){}
public void clear(){}
//例如下面的代码
sparseArray.remove(sparseArray.keyAt(0));
3.修改
public void put(int key, E value)
public void setValueAt(int index, E value)
4.查找
public E get(int key)
public E get(int key, E valueIfKeyNotFound)
5.另外还有通过下标来访问的
public int keyAt(int index)
public E valueAt(int index)
或者获得下标的
public int indexOfValue(E value)
6.遍历
类似数组的遍历 获取大小后按顺序取出每个元素
public String listArray()
	{
		StringBuffer result = new StringBuffer();
		int size = sparseArray.size();
		if(size == 0)
		{
			return "threadMap size is 0";
		}
		for(int i = 0; i < size; i++)
		{
			if(sparseArray.keyAt(i) > 0)
			{
				result.append(i+"="+sparseArray.keyAt(i)+"; ");
			}
		}
		return result.toString();
	}


无聊测试了下,删除一个元素后,size会减1,但是假如遍历整个数组,即i < 10  的话,依然能得到下标是size-1 即9的元素。
例如数组= {0=0,1=1,2=2,3=3}  size是4  删掉下标0后,变成了{0=1,1=2,2=3}
但是使用4来遍历的话  {0=1,1=2,2=3,3=3}
即  会保存最大size的值,当小于最大size时,填充最后的下标元素的值。有时间看看源码希望能找到答案。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38183次
    • 积分:522
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:3篇
    • 译文:0篇
    • 评论:8条
    最新评论