SparseArray源码分析(未完)

idealByteArraySize

首先来看idealByteArraySize这个函数,这是ArrayUtils里的函数。直译函数名,即是“字节数组理想化的大小”,源码如下
    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的n次方大小。对于字节数组(数组的元素类型是字节),如果他占用的总的内存是2的n次方,那么这个数组的length是多少呢?
是2的n次方-12
12个字节里,8个字节表示对象头,4个字节表示数组长度(若不理解,可参考
http://www.javamex.com/tutorials/memory/object_memory_usage.shtml 介绍JAVA对象的内存占用
http://www.javamex.com/tutorials/memory/array_memory_usage.shtml  介绍JAVA数组的内存占用
代码中(1 <<i) - 12就是指2的i次方-12
举个例子,代码中如果need为10,也就是说我想要一个length为10的数组,那这个数组的大小就至少是10+12=22,找一个比22大的2 的幂次方,就是32, 因此给他分配32个字节的空间比较合适,那这个32个字节空间可以放多少个byte元素呢,32-12=20。
对应代码中输入10,输出20
也就是说,输入值是用户本意希望的数组长度,输出是经过内存优化分析之后这个数组的长度(理想化的数组长度)。这个函数就是寻找理想化的数组长度,一般来说返回值大于等于输入值。

为什么i从4开始呢,因为2的3次方为8,小于12 
为什么小于32呢,因为int最大值2^31-1如果i=32的话,那1<<32就溢出了
为什么会有return need;呢,因为有可能need大于2^31-12



阅读更多
换一批

没有更多推荐了,返回首页