关于Java中使用K=1.5的理由

来源:2-7 动态数组

软件工程小白菜

2019-09-17

波波老师您好,在课程中,您指出在Java的ArrayList实现中,扩容常数K并没有选择我们所用来实现的2,而是选择的1.5。请问老师可不可以简单讲解下选择K=1.5和K=2的不同,以及选择1.5的理由和好处呢?


谢谢老师!



写回答

1回答

liuyubobobo

2019-09-17

这种“超参数”的选取,通常没有理论原因,都是统计原因。如果你学习过我的“机器学习”课程,应该对超参数理解的更深刻。


显然 k 越大,触发扩容的概率越低,意味着平均性能更优,但可能浪费的空间越多;反之,k越小,触发扩容的概率越高,意味着平均性能越低,但可能浪费的空间越小。具体 k 选择多少,是在这二者之间选取一个平衡。


我不知道为什么 java 选择 1.5,我个人不认为选择 1.6 或者 1.7 或者 2 会有多么大的问题。Java 的工程师选择了 1.5 应该有他们的统计基础,但也很有可能就是闭着眼睛选的。你可以给 Oracle 官方写信,询问一下这个问题,我觉得是很好的问题。


当然,其实类似这样的问题还能问出很多。比如 Java 的 ArrayList 默认初始空间大小是 10。为什么是 10,不是 20?或者 15?


继续加油!:)

2
1
软件工程小白菜
非常感谢!
2019-09-17
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程