继承实现关系
Arraylist就是一个可以动态扩容的容器,属于集合类的一种,要追根溯源的话它是间接实现了Collection接口,下面我画一下它的结构图

类定义
ArrayList类继承自抽象类AbstractList,同时实现了List和Collection接口,进入源码我们可以看到它的类定义
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable数据存储结构
    transient Object[] elementData;看到源码中我们可以知道,它的底层其实是一个对象数组,我们传进去的对象都会被存放到这个数组当中去
构造器初始化方式
1.指定数组大小
 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);
        }
    }这是它的构造器之一,传入一个int类型的数据,然后编译器就根据指定的大小创建相应大小的数组
ArrayList A=new ArrayList(10);像这样既可以给它赋一个初值大小,当然后面根据加入元素的个数数组还会自动的扩容
2.无参构造器
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }如果我们在创建对象时什么也不写,会给数组分配一个默认大小的空间即10,数组内容为空
ArrayList A=new ArrayList();//其中的数组大小默认为103.传入ArrayList对象初始化
    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }传入一个ArrayList对象,系统会将传入的对象中的数据拷贝到新创建的数组中去,相当于拷贝一份参数中的对象
		ArrayList a1=new ArrayList();
		
		ArrayList a2=new ArrayList(a1);类似这样,当我们想要复制一份原对象时可以这样使用
类中的常用方法
1.添加元素
(1)public boolean add(E e)
对于这个方法,我们直接使用对象调用方法,括号中传入想要插入的元素即可
		ArrayList a1=new ArrayList();
		a1.add(1);//默认插入到数组末尾这样直接传入元素的方式系统会默认插入到数组的末尾
(2)public void add(int index, E element)
对于这个方法,我们可以指定要插入到数组中的哪个位置,当然这个index不能超出数组目前的元素个数,比如目前数组中有5个元素,那么最大index为5,即插入到最后,我们插入位置及以后的元素都会向后顺延一位
		ArrayList a1=new ArrayList();
		a1.add(1);
		a1.add(1,2);//插入到数组中下标为1的位置像上面这样使用输出a1的结果是 1 2
2.删除元素
(1)public E remove(int index)
传入一个下标,删除指定下标处的元素
a1.remove(0);比如这样就是删除a1中第一个元素
(2)public boolean remove(Object o)
传入要删除的对象,删除指定的对象
  
3.修改元素
public E set(int index, E element)
 传入下标和新对象,将指定下标处的元素修改为传入的新对象
4.size()
返回对象中的元素数量
5.isEmpty()
判断对象元素是否为空,为空则返回true,否则返回false
6.indexOf(Object obj)
传入一个对象,返回数组中该对象第一次出现的位置,若找不到返回-1
7.lastIndexOf(Object obj)
传入一个对象,返回数组中该对象最后一次出现的位置,若找不到返回-1
 好了以上是一些常用的方法,当然ArrayList还有一些非常使用的方法比如sort等,需要用到朋友去别处搜索把这里不在展开讲了。
总结
集合其实就是更方便的数组,我们在使用时不需要考虑它的大小,只需要调用类的接口实现就可以了,方便我们开发需要的功能,不必在细节上犯难,这是它的好处。
但是还是推荐有兴趣的小伙伴去看一下它的源码,它的底层代码设计的非常巧妙。
后面我会继续出一些集合类的结构梳理,如LinkedList、Vector还有Map的一些类,如果觉得本期内容写的还不错希望可以给我点个赞



















