返回

以细致的方式为你解读 SparseArray

Android

SparseArray 概览

SparseArray是一种数据结构,它允许您使用int作为键,存储任何类型的值。SparseArray与HashMap相似,但它使用不同的方法来存储数据。SparseArray将键和值存储在两个单独的数组中,而HashMap将它们存储在单个哈希表中。

SparseArray的优点在于它可以节省内存。这是因为SparseArray只存储键和值,而HashMap还存储键和值的哈希码。此外,SparseArray的查询速度更快,因为它不需要计算哈希码。

SparseArray的缺点在于它不支持null键或值。此外,SparseArray不能保证键的顺序。

SparseArray 的构造方法

SparseArray 有两个构造方法,一个参数为容量大小,另一个无参构造方法,最终调用的是容量为 10 的构造方法。

public SparseArray() {
    this(10);
}

public SparseArray(int initialCapacity) {
    if (initialCapacity == 0) {
        initialCapacity = 10;
    }

    mKeys = new int[initialCapacity];
    mValues = new Object[initialCapacity];
    mSize = 0;
}

SparseArray 的使用方法

SparseArray提供了put和append方法让使用者可以放以int作为key,任何类型作为值的数据。

public void put(int key, Object value) {
    if (mSize == 0) {
        mKeys = new int[Math.max(10, key + 1)];
        mValues = new Object[Math.max(10, key + 1)];
    } else if (key >= mKeys.length) {
        growKeyAndValueArrays(key + 1);
    }

    mKeys[key] = key;
    mValues[key] = value;
    mSize = Math.max(mSize, key + 1);
}

public void append(int key, Object value) {
    if (mSize == 0) {
        mKeys = new int[Math.max(10, key + 1)];
        mValues = new Object[Math.max(10, key + 1)];
    } else if (key >= mKeys.length) {
        growKeyAndValueArrays(key + 1);
    }

    int index = key;
    while (mKeys[index] != 0) {
        index++;
    }

    mKeys[index] = key;
    mValues[index] = value;
    mSize = Math.max(mSize, index + 1);
}

SparseArray 的优缺点

SparseArray 有以下优点:

  • 内存效率高,因为它只存储键和值,而HashMap还存储键和值的哈希码。
  • 查询速度快,因为它不需要计算哈希码。

SparseArray 有以下缺点:

  • 不支持null键或值。
  • 不能保证键的顺序。

SparseArray 与 HashMap 的比较

SparseArray 和 HashMap 都是用于存储键值对的数据结构。但是,它们在实现方式和性能方面存在一些差异。

  • 存储方式: SparseArray 将键和值存储在两个单独的数组中,而 HashMap 将它们存储在单个哈希表中。
  • 性能: SparseArray 的查询速度通常比 HashMap 快,因为它不需要计算哈希码。但是,SparseArray 的插入和删除操作速度可能比 HashMap 慢,因为需要重新排列数组。
  • 内存使用: SparseArray 通常比 HashMap 使用更少的内存,因为它只存储键和值,而 HashMap 还存储键和值的哈希码。

结语

SparseArray 是一种有用的数据结构,它可以用来存储键值对。SparseArray 的优点在于它可以节省内存,查询速度快。SparseArray 的缺点在于它不支持null键或值,不能保证键的顺序。

如果您需要存储键值对,并且您不介意牺牲一些功能(例如支持null键或值),那么SparseArray是一个不错的选择。