SparseArray的put(...)和append(...)之间的区别?

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()将给你一个性能优势.

  • 误导性答案。yoram givon的回答要好得多。即使键不是连续的,您仍然可以使用append()。只是您将无法从中受益。 (2认同)

yor*_*von 8

基本上他们做同样的事情.事实上,追加使用的代码放在:

 /**
 * 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功率,以确定您添加的密钥是否需要代码来扩展阵列.具有许多键/值和键/值输入的大型数组,可能会降低性能.