arraylist

 一、为啥arraylist的扩容因子是1.5?
 首先要明确 左移右移 的操作符是直接对应cpu硬件指令的,也就是从cpu层面上来说,位运算是直接比乘除效率更高;
对于一些特定的算法可以利用位运算的方法,但是大部分计算还是通过浮点运算
例如:就像除以2,除以4 都可以用>>1>>2替代,但是像乘以0.2这种就只能用浮点运算,计算机是没办法右移log2的5次方)
回到题目为什么扩容因子是1.5,而不是1.21.251.8或者1.75
先从位运算层面分析:
1.5 -> new = old + (old >> 1)
1.2 -> new = old + (old * 0.2)
1.25 -> new = old + (old >> 2)
1.75 -> new = old + (old * 0.75)
1.8 -> new = old + (old * 0.8)
由此可以看出1.51.25是优于其他的参数因子,而这两者的区别一个是右移1位,和右移2位,抛开题目本身,右移是指令,不带任何参数,也就是每次指令只执行一位?也就是1.5这个扩容因子从指令执行成本出发,是减少了运算次数和运算时间,只执行右移指令一次;
考虑到是ArrayList扩容机制,也要考虑扩容一次不能太少,会导致反复扩容,如果一次数组长度过大,又浪费空间,考虑折中在考虑到折中区间1.5刚好是 右移1位的特殊算法,能直接操作cpu硬件指令,所以1.5是个很好的选择;
tips:除以2的n次方可以用右移代替,乘以2的n次方,用左移,会有首位溢出的问题,不能替代;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值