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

时间:2014-05-10 12:58:34

标签: android append put

我只是想知道SparseArray的put(...)append(...)之间有什么区别?

来自官方文件:

  • append(...):将一个键/值对放入数组中,针对键大于数组中所有现有键的情况进行优化。
  • put(...):添加从指定键到指定值的映射,如果有指定键,则替换先前的映射。

但我只是不明白:s

感谢您的帮助!

2 个答案:

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