Sky*_*ost 12 android append put
我只是想知道SparseArray put(...)和append(...)SparseArray 之间的区别是什么?
从官方文档:
append(...) :将键/值对放入数组中,针对键大于数组中所有现有键的情况进行优化.put(...) :添加从指定键到指定值的映射,如果有指定键,则替换先前映射.但我只是不明白:s
谢谢你的帮助 !
323*_*3go 12
在我看来,文档非常简单:
如果添加顺序键,例如1,2,3,5,7,11,13 ......,请使用append().
如果添加非顺序键,例如100,23,45,277,42 ......,请使用put().
没有理由你不能put()在任何一个场景中使用,但如果你知道密钥将是顺序的 - 例如,在从存储加载数据时 - 那么append()将给你一个性能优势.
基本上他们做同样的事情.事实上,追加使用的代码放在:
/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)
那么区别是什么呢? 从源代码中可以看出,如果键大于数组中的所有现有键,代码将创建一个新的大小优化数组,将所有键/值复制到新数组中并在顶部添加新键数组.
你应该什么时候使用它? 如果您的密钥是顺序的,那么您将获得性能优势,因为您知道您要使用的下一个密钥大于您之前使用的密钥(嗯,这就是顺序意味着:-)),所以你知道你将需要增长阵列.如果您的密钥不是顺序的,那么在这种情况下,每次添加新密钥时都必须"花费"CPU功率,以确定您添加的密钥是否需要代码来扩展阵列.具有许多键/值和键/值输入的大型数组,可能会降低性能.
| 归档时间: |
|
| 查看次数: |
8442 次 |
| 最近记录: |