我只是想知道SparseArray的put(...)
和append(...)
之间有什么区别?
来自官方文件:
append(...)
:将一个键/值对放入数组中,针对键大于数组中所有现有键的情况进行优化。put(...)
:添加从指定键到指定值的映射,如果有指定键,则替换先前的映射。但我只是不明白:s
感谢您的帮助!
答案 0 :(得分:13)
在我看来,文档很简单:
如果添加顺序键,例如1,2,3,5,7,11,13 ......,请使用append()
。
如果您添加非连续密钥,例如100,23,45,277,42 ......,请使用put()
。
在任何一种情况下都没有理由不使用put()
,但如果您知道密钥将是顺序的 - 例如,在从存储加载数据时 - 那么{{ 1}}会给你带来性能优势。
答案 1 :(得分:6)
基本上他们做同样的事情。 实际上,追加代码使用 put :
/**
* Puts a key/value pair into the array, optimizing for the case where
* the key is greater than all existing keys in the array.
*/
public void append(int key, E value) {
if (mSize != 0 && key <= mKeys[mSize - 1]) {
**put(key, value);**
return;
}
if (mGarbage && mSize >= mKeys.length) {
gc();
}
int pos = mSize;
if (pos >= mKeys.length) {
int n = ArrayUtils.idealIntArraySize(pos + 1);
int[] nkeys = new int[n];
Object[] nvalues = new Object[n];
// Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
mKeys = nkeys;
mValues = nvalues;
}
mKeys[pos] = key;
mValues[pos] = value;
mSize = pos + 1;
}
那有什么区别? 从源代码中可以看出,如果键大于数组中的所有现有键,代码将创建一个新的大小优化数组,将所有键/值复制到新数组中并在顶部添加新键数组。
什么时候应该使用它? 如果您的密钥是顺序的,那么您将获得性能优势,因为您知道您要使用的下一个密钥大于您之前使用的密钥(嗯,这就是顺序意味着:-)),所以你知道你将需要增长阵列。 如果您的密钥不是顺序的,那么在这种情况下,每次添加新密钥时都必须“花费”CPU功率,以确定您添加的密钥是否需要代码来扩展阵列。一个包含许多键/值和键/值输入的大型数组,可能会降低性能。