重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组。数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集合类更好一些,这是使用数组的一大优势。但是我们知道数组存在致命的缺陷,就是在初始化时必须指定数组大小,并且在后续操作中不能再更改数组的大小。在实际情况中我们遇到更多的是一开始并不知道要存放多少元素,而是希望容器能够自动的扩展它自身的容量以便能够存放更多的元素。ArrayList就能够很好的满足这样的需求,它能够自动扩展大小以适应存储元素的不断增加。它的底层是基于数组实现的,因此它具有数组的一些特点,例如查找修改快而插入删除慢。本篇我们将深入源码看看它是怎样对数组进行封装的。首先看看它的成员变量和三个主要的构造器。
目前成都创新互联已为上千多家的企业提供了网站建设、域名、网页空间、网站托管维护、企业网站设计、锡山网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。//默认初始化容量 private static final int DEFAULT_CAPACITY = 10; //空对象数组 private static final Object[] EMPTY_ELEMENTDATA = {}; //对象数组 private transient Object[] elementData; //集合元素个数 private int size; //传入初始容量的构造方法 public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } //新建指定容量的Object类型数组 this.elementData = new Object[initialCapacity]; } //不带参数的构造方法 public ArrayList() { super(); //将空的数组实例传给elementData this.elementData = EMPTY_ELEMENTDATA; } //传入外部集合的构造方法 public ArrayList(Collection<? extends E> c) { //持有传入集合的内部数组的引用 elementData = c.toArray(); //更新集合元素个数大小 size = elementData.length; //判断引用的数组类型, 并将引用转换成Object数组引用 if (elementData.getClass() != Object[].class) { elementData = Arrays.copyOf(elementData, size, Object[].class); } }