在明确list大小情况下应该尽可能的给定初始容量,节省内存开销。很多情况我们不知道初始容量,所以一般没有传入此参数,这样一来,其容量的扩充是基于2的多少次方来计算的,扩容的时候或许初始化了很多数组元素,但可能绝大部分没用到,这就浪费内存了。######回复 @PengTdy : 好像list如果不传入初始容量,默认初始容量是16,如果add了17个,那么容量变为32,add了33个变为64......,注意这里的16、 32、 64......。当然动态扩容的时候会重新分配list内部数组的内存空间,然后进行数据拷贝。如果程序员预先知道会add多少个,那么传入初始容量,就省去了扩容数组和数据拷贝,不管是内存分配和执行效率都会提升的。######回复 @BoXuan : 好的谢谢######回复 @PengTdy : 一般的数组是不能动态扩容的,list其实就是动态扩容数组,内部实现还是基于数组的。这个初始容量就是指示list内部数组初始化几个数组元素,你这里是2,就是初始化2个数组元素,而你这又刚好add了2个,你再add一下,内部数组扩容就会基于2的多少次方去重新初始化多少个数组元素,你可以找找ArrayList的源码看看######是不是 如果初始化值那里我设置的是3是不是就是3的次方,如果设置的6是不是就是6的次方;如果没有指定就是默认2的次方?######时刻想到,要节约使用内存空间。######
图片里面圈出来的那个2是List初始大小.文档要求的那部分是String[] array = new String[list.size()],要求array的大小和list.size()一致.
######回复 @PengTdy : 因为后来要把list里的数据(所有字符串元素),都储存到字符串数组 array之中。试想一下,如果创建的字符串空间(array数组长度)太小,则不够存下 list 的所有元素;如果创建的字符串空间(array数组长度)太大,则没必要(太浪费)。故,一致才好。######这保持一致有什么好处吗?######大家的回复果然很溜。
######预先分配容器的容量,1:可以节省内存使用;2:可以减少频繁扩容导致的内存垃圾和数组拷贝损耗。
时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。