SparseArrayCompat
Android 支持库中的类是使用数组的 map 的轻量级实现。与许多使用数组的容器实现一样,它有一个不断增长的策略,以确保数组容量足以容纳所有元素。在 SparseArrayCompat
实现,不断增长的政策表达于 ContainerHelpers.idealByteArraySize()
,如下所示:
public static int idealByteArraySize(int need) {
for (int i = 4; i < 32; i++)
if (need <= (1 << i) - 12)
return (1 << i) - 12;
return need;
}
它似乎选择了一个最接近的大于或等于所需容量的 2 的幂。我没有得到的是 return 语句中 12 的减法。 -12
if
中的术语条件似乎是任意额外的空间,以防在不久的将来所需的容量增加,这是有道理的,但 return 语句消除了该额外的空间。 return 语句不应该只返回 (1 << i)
没有减法?
我很想听听是否有人可以帮助向我解释这一点。我情不自禁地感到后背发痒,但不明白为什么。
引用文献:
最佳答案
这是an old comment关于它:
// it looks like right now objects want to be powers of 2 minus 8
// and the array size eats another 4 bytes
也许它试图让整个容器对象完美地适合 2^n 分配?如果是这样,由于 mGarbage
成员,它似乎不适用于 SparseArrayCompat
类...
关于java - Android 中 SparseArrayCompat 政策不断增长背后的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32730919/