ArrayList简介

在这里插入图片描述ArrayList是Java集合框架中比较常用的数据结构了。继承自AbstractList,实现了List接口。底层基于数组实现容量大小动态变化。一看就是一个比较重要的模块,所以我们今天就来学习一下ArrayList相关知识。
ArrayList的数据结构和作用ArrayList数据结构是数组,用来装载数据。相对于LinkedList,查询效率高,因为底层是数组,分配的是连续的内存空间,CPU在读取时可以缓存连续的内存空间,大幅度降低读取的性能开销;增删效率低,相对于Vector来说是线程不安全。虽然ArrayList是线程不安全的,但在我们实际的应用过程中,一般都是用来查询,涉及到增删的操作比较少,如果涉及到的增删操作比较频繁的场景,我们可以选择LinkedList,如果想保证线程安全,可以使用Vector、CopyOrWriteArray。如何实现存放任意数量的对象ArrayList构造器有无参构造和有参构造。在有参构造器中,ArrayList可以通过构造方法在初始化的时候进行指定底层数组的大小。但是我们在使用有参构造时,会不会初始化数组大小呢?我们先来看一下代码:public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); }}由代码可知,我们可以很明确地得出结论:不会初始化数组大小。不信的话我们可以测试一下:public static void main(String[] args){ //此处使用有参构造,大小为10 ArrayList arrayList = new ArrayList<>(10); System.out.println(“size:” + arrayList); arrayList.set(1, “A”);}图片看到这里是不是已经懵圈了?不要慌,我们慢慢来分析。我们的参数是 initialCapacity,这里是将参数基于 elementData 设置的,并不是直接设置的数组大小(值得注意的是,ensureCapacity();方法也是这种原理)。我们也可以理解为这个数组现在理论上最大可以装10个数据,但是他现在还是空的。在无参构造器中,初始化出一个默认空的数组,数组容量为 0,当我们调用add();方法是,默认分配【DEFAULT_CAPACITY = 10】的初始容量。下面会具体介绍新增过程,此处不再赘述。/** * 数组默认初始容量 /private static final int DEFAULT_CAPACITY = 10;/* * 用于默认大小的空实例的共享空数组实例。 * 与 EMPTY_ELEMENTDATA 区分开来,以了解何时膨胀多少添加第一个元素。 /private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};/* * 构造一个初始空列表。 */public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}但是,对于无参构造和有参构造,数组都是有长度限制的,ArrayList是通过什么方式去实现可以存放任意数量的对象,长度没有限制的呢?不要慌,原来这个地方也是用到了数组的扩容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值