上图,画工差,大家随便看看。
ArrayList
1.ArrayList是什么?有什么特点
(1)ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。
(2)ArrayList不是线程安全的, ArrayList实现了Serializable接口,因此它支持序列化。
(3)实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问。
(4)实现了Cloneable接口,能被克隆
2.ArrayList实现源码
2.1构造方法
很明显ArrayList就是一个数组哈。
//1----------------------- public ArrayList() { this(10); //调用ArrayList(10) 默认初始化一个大小为10的object数组。 } //2------------------------- public ArrayList(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //如果用户初始化大小小于0抛异常,否则新建一个用户初始值大小的object数组。 this.elementData = new Object[initialCapacity]; } //3-------------------------- public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // 当c.toArray返回的不是object类型的数组时,进行下面转化。 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
2.2 看下add(E e)方法
//1----------------------- public boolean add(E e) { ensureCapacityInternal(size + 1); // 加入元素前检查数组的容量是否足够 elementData[size++] = e; return true; } //2----------------------- private void ensureCapacityInternal(int minCapacity) { modCount++; // 如果添加元素后大于当前数组的长度,则进行扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); } //3----------------------- private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //将数组的长度增加原来数组的一半。 int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //如果扩充一半后仍然不够,则 newCapacity = minCapacity;minCapacity实际元素的个数。 if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); //数组最大位2^32 // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }