Java ArraysList
Java 除了原生的数组外,collections 中还有 ArrayList, LinkedList, Vector三种。
ArrayList 动态数组,好处可以动态增长,缺点为此牺牲了效率。
本质上,仍然是用array来存储对象
|
|
当需要添加元素时,会调用ensureCapacityInternal查看是否需要扩容
|
|
通过一步步调用,如果需要扩容,创建size更大的新数组,然后将原数组内容复制过去,并将引用指向新数组。
这里发现扩容的时候并非需要多少就给多少,会额外给一部分空间,避免频繁进行扩容操作。默认只要空间不够了扩容为原先size 的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1);
(新空间如果不满足本次需求minCapacity,那么就用这次需求的最小值 minCapacity)。
#Python List
看下list 的append源码按照下面PyList_Append-> app1-> list_resize
调用顺序
|
|
大体的思路也跟Java 的 ArrayList很像,如果空间不够了就扩容,开辟一块新的空间,把原数据复制过去,然后引用指向新内存。
而且同样,扩容内存的时候也不是要多少给多少,依然会多给 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
不过多给的算法就不太一样了。至于为啥要多给这么些个,用网上的话说,这些公式都是Python设计者当初经过大量实验得出的最佳实践。