奇怪为什么ArrayList初始化容量大小为10?.docx
《奇怪为什么ArrayList初始化容量大小为10?.docx》由会员分享,可在线阅读,更多相关《奇怪为什么ArrayList初始化容量大小为10?.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、背景看ArrayList源码时,无意中看到ArrayList的初始化容量大小为10,这就奇怪了! 我们都知道ArrayList和HashM叩底层都是基于数组的,但为什么ArrayList不 像用HashMap那样用16作为初始容量大小,而是采用10呢?于是各方查找资料,求证了这个问题,这篇文章就给大家讲讲。为什么HashMap的初始化容量为16?在聊ArrayList的初始化容量时,要先来回顾一下HashMap的初始化容量。这里 以Java 8源码为例,HashMap中的相关因素有两个:初始化容量及装载因子:/为为* The default initial capacity - MUST be
2、 a power of two./static Mt DEFAULT_INEAL_CAPACITY = 1 4; / aka 16/兴兴* The load factor used wke八 八。八e specified in coistriACtor./static filial float DEFAULTLLOAD_FA6TOR = 0.75在HashM叩当中,数组的默认初始化容量为16,当数据填充到默认容量的0.75 时,就会进行2倍扩容。当然,使用者也可以在初始化时传入指定大小。但需要 注意的是,最好是2的n次方的数值,如果未设置为2的n次方,HashMap也 会将其转化,反而多了一步
3、操作。关于HashM叩的实现原理的内容,这里就不再赘述,网络上已经有太多文章讲 这个了。有一点我们需要知道的是HashM叩计算Key值坐标的算法,也就是通 过对Key值进行Hash,进而映射到数组中的坐标。此时,保证HashM叩的容量是2的n次方,那么在hash运算时就可以采用位 运行直接对内存进行操作,无需转换成十进制,效率会更高。通常,可以认为,HashM叩之所以采用2的n次方,同时默认值为16,有以下 方面的考量: 减少hash碰撞; 提高M叩查询效率; 分配过小防止频繁扩容; 分配过大浪费资源;总之,HashM叩之所以采用16作为默认值,是为了减少hash碰撞,同时提升 效率。Arra
4、yList的初始化容量是10吗?下面,先来确认一下ArrayList的初始化容量是不是10,然后在讨论为什么是这 个值。先来看看Java 8中,ArrayList初始化容量的源码:/次为* Default initial capacity./private static filial Mt DEFAUL匚CAPACITY =工。;很明显,默认的容器初始化值为10。而且从JDK1.2到JDK1.6,这个值也始终都 为10。从JDK1.7开始,在初始化ArrayList的时候,默认值初始化为空数组:* Scared CMptg array ihstance used for default siz
5、ed CMptg instances. Wedisti八guish this froEMPTY_ELEMENTDATA to khow how ck to inflate when * first elekvxeiat is added.Vprivate static filial Object DEFAULTCAPACITY_EMPTY_ELEM ENTDATA = ;/米兴* Constructs av CMptg list with a八 initial capacity of ten.Vpublic ArrayList() t.eleieiatData = DEFAULTCAPACIT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 奇怪 为什么 ArrayList 初始化 容量 大小 10
限制150内