首页 > 试题广场 >

ArrayList list = new ArrayList

[单选题]
ArrayList list = new ArrayList(20);中的list扩充几次
  • 0
  • 1
  • 2
  • 3

Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8,如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容


private static final int DEFAULT_CAPACITY = 10; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 
private void grow(int minCapacity) { // overflow-conscious code  int oldCapacity = elementData.length;  int newCapacity = oldCapacity + (oldCapacity >> 1);  if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;  if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);  // minCapacity is usually close to size, so this is a win:  elementData = Arrays.copyOf(elementData, newCapacity); }


编辑于 2019-09-02 11:18:04 回复(17)
上来就选2次的这里报道一下。
发表于 2020-04-09 12:56:29 回复(34)
阴险的一道题。
发表于 2019-09-01 16:42:35 回复(6)
在创建时直接分配了数组的大小,没有扩充
发表于 2019-08-20 19:38:33 回复(2)
ArrayList list=new ArrayList(); 
这种是默认创建大小为10的数组,每次扩容大小为1.5倍 
ArrayList list=new ArrayList(20); 
使用的ArrayList的有参构造函数 

这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。 
一次性为创建了传入的数字的长度的数组 
所以,扩充为0次
发表于 2020-02-26 15:06:46 回复(3)
直接初始化数组大小为20,不扩容
发表于 2019-08-21 13:18:06 回复(1)
创建对象是直接分配内存地址,不存在扩容得操作,如果是添加元素超过容量,则会存在扩容的概念
发表于 2019-09-24 19:23:45 回复(0)
这个问题API里面也可以找到答案

发表于 2021-01-17 22:01:17 回复(1)
现在的正确答案应该是B,
在JDK1.8开始,ArrayList的底层源码创建集合默认容量改成0了,
所以增加一个元素就会扩容一次,容量增加为10。
编辑于 2020-09-14 20:49:44 回复(3)
出这种题的应该都不是好人吧
发表于 2020-07-13 19:33:11 回复(1)
• JDK1.7 之前 ArrayList 默认大小是 10;
• JDK1.7 之后是 0;
• JDK1.8是没有加入元素之前默认大小为0,加入元素之后,扩容成10,等元素到11个的时候,扩容约1.5倍;

ArrayList 每次扩容之后容量都会变为原来的 1.5 倍左右;
grow()方法中:int newCapacity = oldCapacity + (oldCapacity >> 1)
(oldCapacity 为偶数就是 1.5 倍,否则是 1.5 倍左右)! 奇偶不同,比如 :10+10/2 = 15, 33+33/2=49。如果是奇数的话会丢掉小数.;
grow()方法申请一个更大的数组,然后将原来数组中的元素拷贝过去;
如果新容量大于 MAX_ARRAY_SIZE,进入(执行) hugeCapacity() 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,如果 minCapacity 大于最大容量,则新容量则为Integer.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 Integer.MAX_VALUE - 8;

发表于 2022-08-15 11:28:44 回复(0)
arrayList初始化传入值就是默认它的大小了,不会进行扩容,所以选择A选项
发表于 2022-04-26 16:05:31 回复(0)
传入初始化容量会分配空间,只有当添加元素个数大于初始化容量时才会进行1.5倍扩容。未传入初始化容量,只有添加元素时才会分配空间大小为10的数组。
发表于 2023-09-14 23:50:40 回复(1)
如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容
发表于 2022-04-06 10:27:20 回复(0)
如果使用ArrayList 的空构造器,那么这个数组的长度就为0。ArrayList(int initialCapacity)会使用指定的容量,数组的长度是20。如果使用ArrayList的空构造器,要是这个数组长度不够了,就会自动扩容,扩容的加载因子为1.5。扩容的过程是,如果没有元素扩容为Math.max(10,实际元素的个数),也就是扩容为10。如果有元素时Math.max(原容量的1.5倍,实际元素个数),同时为防止扩容太多内部还实现了trimToSize()缩容的方法
发表于 2022-01-04 10:33:59 回复(0)
Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8,如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容
发表于 2021-02-02 19:10:31 回复(0)
0次,没添加元素 何来扩容之说
发表于 2021-01-22 00:10:19 回复(0)
我倒是不这么觉得,因为看源码的时候,是在添加第一个参数的时候才给的10的空间,按理来说初始为0,至少扩容1次吧-0-
发表于 2020-12-07 12:01:59 回复(0)
根据源码不难看出,如果是通过传入初始容器大小的参数进行初始化时,就不需要扩容,直接拿来用就好了,
扩容估计得等加数据加着加着发现到了阈值,再扩容,扩容的规则在不超过最大值的前提下,变为当前大小的1.5倍。
发表于 2020-09-16 16:24:32 回复(0)
指定了大小为20,直接分配空间。
发表于 2020-08-17 18:15:48 回复(0)