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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值