为什么阿里的开发手册要求集合要这样写:报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

为什么阿里的开发手册要求集合要这样写:报错

kun坤 2020-06-09 22:35:02 102

分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-06-10 09:35:33

    在明确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. ArrayList 实现了接口 List<E>。所以,用 ArrayList 的构造方法所生成的对象, 可以用这个接口的名称 List<String>来表示其类型
    2. 因为 List<E> 的泛型 E, 是字符串类型,所以在调用 ArrayList 的构造方法时,必须 指明它的元素是字符串类型:new ArrayList<String>(…);
    3. 通过多态地挑选,选定的ArrayList 的构造方法是:public ArrayList(int initialCapacity)。调用这个函数的结果是,构造一个具有指定初始容量的空列表。其中参数:initialCapacity,表示列表的初始容量。在给出的代码里,initialCapacity 是 2
    4.  “每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。”(出自: API 手册
    5. 从提供的代码可以看到,你提出的圆括号里的 2,表示要求产生的列表 list的初始容量是2个元素。
    6. 接下来,果然添加了两个字符串元素: “guan”和 “bao”。看来,用来存储列表元素的数组的大小 2,正好够用。
    7. 因此,list 的大小(list.size())仍然是 2
    8. 所以,最终导致创建并赋值的的字符串数组 array的长度,也是 
    9. 总之,你所提出的 (2 ), 虽然只是 列表的初始容量。但 碰巧后来,只添加了2个字符串,致使,list 的大小未变,导致最终字符串数组的长度,也只是2
    ######回复 @PengTdy : 建议阅读 http://blog.csdn.net/arui319/article/details/3557743######如果初始化值那里我设置的是3是不是就是3的次方,如果设置的6是不是就是6的次方;如果没有指定就是默认2的次方?######

    大家的回复果然很溜。

    ######

    预先分配容器的容量,1:可以节省内存使用;2:可以减少频繁扩容导致的内存垃圾和数组拷贝损耗。

    0 0
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章