SparseArray是android裏爲<Interger,Object>這樣的Hashmap而專門寫的class,目的是提高效率,其核心是折半查找函數(binarySearch),今天在看這個class的實現時發現一個很好的設計:
public void remove(int key) {
delete(key);
}
remore和delete都實現了,功能當然是一樣的,對用戶來說,想用delete,和remove的都可以。
起折半查找算法也寫的非常棒:
private static int binarySearch(int[]a, int start, int len, int key) {
int high = start + len, low = start -1, guess;
while (high - low > 1) {
guess = (high + low) / 2;
if (a[guess] < key)
low = guess;
else
high = guess;
}
if (high == start + len)
return ~(start + len);
else if (a[high] == key)
return high;
else
return ~high;
}
單純從字面上來理解,SparseArray指的是稀疏數組(Sparse array),所謂稀疏數組就是數組中大部分的內容值都未被使用(或都爲零),在數組中僅有少部分的空間使用。因此造成內存空間的浪費,爲了節省內存空間,並且不影響數組中原有的內容值,我們可以採用一種壓縮的方式來表示稀疏數組的內容。
假設有一個9*7的數組,其內容如下:
在此數組中,共有63個空間,但卻只使用了5個元素,造成58個元素空間的浪費。以下我們就使用稀疏數組重新來定義這個數組:
其中在稀疏數組中第一部分所記錄的是原數組的列數和行數以及元素使用的個數、第二部分所記錄的是原數組中元素的位置和內容。經過壓縮之後,原來需要聲明大小爲63的數組,而使用壓縮後,只需要聲明大小爲6*3的數組,僅需18個存儲空間。