Arraylist

ArrayList是Java中的一个列表实现,基于动态数组。它的优点是查询速度快,但修改效率低,因删除或增加元素需移动后续元素。无参构造函数初始容量为10,有参构造可自定义容量。扩容时,若数组为空则创建容量为10的新数组,否则增长至原容量的一半或满足最小容量需求的较大值。ArrayList不是线程安全的。
摘要由CSDN通过智能技术生成

Arraylist

一.

实现list接口.底层是动态数组.

优点:查询快(顺序存放,按下标查找快)

缺点:1.修改效率低(因为删除或增加一个元素 ,要移动后面的所有元素)

底层原理:动态数组的扩容.

2.线程不安全

二.ArrayList的三个构造函数:

 

1.无参构造函数

第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

​
List<String>list = new ArrayList<>()

 

可以看出来,当我们直接创建ArrayList时,elementData被赋予了默认空容量的数组。注意,因为默认空容量数组是被final修饰的,此时ArrayList数组是空的、固定长度的,也就是说其容量此时是0,元素个数size为默认值0。

2.有参构造:

可以按你的想法来设置容量

 

List<String>list = new ArrayList<>(30)

当initialCapacity > 0时,会在堆上new一个大小为initialCapacity的数组,然后将其引用赋给elementData,此时ArrayList的容量为initialCapacity,元素个数size为默认值0。

  当initialCapacity = 0时,elementData被赋予了默认空数组,因为其被final修饰了,所以此时ArrayList的容量为0,元素个数size为默认值0。

  当initialCapacity < 0时,会抛出异常。

3.通过传入Collection元素列表进行生成(不主要讲)

三.扩容机制

无参构造函数的扩容:

 

先看到add函数:e为输入参数表,元素个数size加1,调用ensureCapacityInternal函数

 

转到这个函数:调用calculateCapacity函数,参数为元素数组elementData和最小容量minCapacity.

 

 

在跳转到这个函数:当元素数组为空返回DEFAULT_CAPACITY(常量为10), minCapacity之间的最大值

 

将10返回ensureCapacityInternal函数,调用ensureExplicitCapacity函数

如果最小容量 minCapacity大于elementData.length(老容量)就调用grow函数进行扩容.

 

grow函数会扩容旧容量的一半,如果还是小于最小容量,新容量就是最小容量,大于最小容量并小于最大容量(2的31次方-9)就扩容一半.并调用copyOf函数生成一个新数组并将原来的元素复制过去,这样扩容成功了.

总结:扩容先考虑数组是否为空,为空返回10,不为空返回DEFAULT_CAPACITY(常量为10), minCapacity之间的最大值;

只有数组为空或数组满了才可以扩容;

扩容时,数组为空则创建初始容量为10的数组.

数组不为空,且数组不大于最大容量,就扩容一半.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值