Java中ArrayList初始化容量大小为10的原因是什么


这篇文章主要讲解了“Java中ArrayList初始化容量大小为10的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中ArrayList初始化容量大小为10的原因是什么”吧!在聊ArrayList的初始化容量时,要先来回顾一下HashMap的初始化容量。这里以Java 8源码为例,HashMap中的相关因素有两个:初始化容量及装载因子:在HashMap当中,数组的默认初始化容量为16,当数据填充到默认容量的0.75时,就会进行2倍扩容。当然,使用者也可以在初始化时传入指定大小。但需要注意的是,最好是2的n次方的数值,如果未设置为2的n次方,HashMap也会将其转化,反而多了一步操作。关于HashMap的实现原理的内容,这里就不再赘述,网络上已经有太多文章讲这个了。有一点我们需要知道的是HashMap计算Key值坐标的算法,也就是通过对Key值进行Hash,进而映射到数组中的坐标。此时,保证HashMap的容量是2的n免费云主机域名次方,那么在hash运算时就可以采用位运行直接对内存进行操作,无需转换成十进制,效率会更高。通常,可以认为,HashMap之所以采用2的n次方,同时默认值为16,有以下方面的考量:减少hash碰撞;提高Map查询效率;分配过小防止频繁扩容;分配过大浪费资源;总之,HashMap之所以采用16作为默认值,是为了减少hash碰撞,同时提升效率。下面,先来确认一下ArrayList的初始化容量是不是10,然后在讨论为什么是这个值。先来看看Java 8中,ArrayList初始化容量的源码:很明显,默认的容器初始化值为10。而且从JDK1.2到JDK1.6,这个值也始终都为10。从JDK1.7开始,在初始化ArrayList的时候,默认值初始化为空数组:此处肯定有朋友说,Java 8中ArrayList默认初始化大小为0,不是10。而且还会发现构造方法上的注释有一些奇怪:构造一个初始容量10的空列表。什么鬼?明明是空的啊!保留疑问,先来看一下ArrayList的add方法:在add方法中调用了ensureCapacityInternal方法,进入该方法一开始是一个空容器所以size=0传入的minCapacity=1:上述方法中先通过calculateCapacity来计算容量:会发现minCapacity被重新赋值为10 (DEFAULT_CAPACITY=10),传入ensureExplicitCapacity(minCapacity);minCapacity=10下面是方法体:上述代码中grow方法是用来处理扩容的,将容量扩容为原来的1.5倍。了解上面的处理流程,我们会发现,本质上ArrayList的初始化容量还是10,只不过使用懒加载而已,这是Java 8为了节省内存而进行的优化而已。所以,自始至终,ArrayList的初始化容量都是10。这里再多提一下懒加载的好处,当有成千上万的ArrayList存在程序当中,10个对象的默认大小意味着在创建时为底层数组分配10个指针(40 或80字节)并用空值填充它们,一个空数组(用空值填充)占用大量内存。如果能够延迟初始化数组,那么就能够节省大量的内存空间。Java 8的改动就是出于上述目的。最后,我们来探讨一下为什么ArrayList的初始化容量为10。其实,可以说没有为什么,就是“感觉”10挺好的,不大不小,刚刚好,眼缘!首先,在讨论HashMap的时候,我们说到HashMap之所以选择2的n次方,更多的是考虑到hash算法的性能与碰撞等问题。这个问题对于ArrayList的来说并不存在。ArrayList只是一个简单的增长阵列,不用考虑算法层面的优化。只要超过一定的值,进行增长即可。所以,理论上来讲ArrayList的容量是任何正值即可。ArrayList的文档中并没有说明为什么选择10,但很大的可能是出于性能损失与空间损失之间的最佳匹配考量。10,不是很大,也不是很小,不会浪费太多的内存空间,也不会折损太多性能。如果非要问当初到底为什么选择10,可能只有问问这段代码的作者“Josh Bloch”了吧。如果你仔细观察,还会发现一些其他有意思的初始化容量数字:ArrayList与Vector初始化容量一样,为10;HashSet、HashMap初始化容量一样,为16;而HashTable独独使用11,又是一个很有意思的问题。感谢各位的阅读,以上就是“Java中ArrayList初始化容量大小为10的原因是什么”的内容了,经过本文的学习后,相信大家对Java中ArrayList初始化容量大小为10的原因是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: Laravel开发环境怎么搭建

本文小编为大家详细介绍“Laravel开发环境怎么搭建”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel开发环境怎么搭建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。开始前你需要先去安装一个docker客户端,docke…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/15 07:24
下一篇 03/15 07:24

相关推荐