java - Android 中 SparseArrayCompat 政策不断增长背后的基本原理是什么?

标签 java android arrays android-support-library sparse-matrix

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/

相关文章:

android - 在我的笔记本电脑上访问由 android 模拟器相机应用程序保存的文件

android - android webview是否支持html5视频播放?

arrays - 动态数组与静态数组有何不同?

java - 如何在swing jframe中嵌入SWT浏览器

java - 在 Main 中调用静态方法

android - 是否可以在 onPostExecute() 中将对 AsyncTask 的引用设置为 null?

C# 按名称对 FileInfo 数组进行排序,得到一些意想不到的结果,需要知道是否有其他可用的排序选项

python - 如何使用不均匀子数组作为平铺来平铺一维 numpy 数组?

java - 为什么我的 Spring 设置失败并出现 NoSuchBeanDefinitionException?

java - 数组打印Java