本文结构:
1.介绍特点
2.基本方法
3.重点源码分析

1.介绍特点

ArrayList:
是List的一个具体实现子类,是List接口的一个数组实现 (里面必定维护了一个数组)。
默认初始容量10, 扩容机制1.5倍。(数组必然有初始容量和扩容机制)
有序。
允许null元素。
允许重复元素。
线程不安全。

2.基本方法

关键字 简介
add 增加
contains 判断是否存在
get 获取指定位置的对象
indexOf 获取对象所处的位置
remove 删除
set 替换
size 获取大小
toArray 转换为数组
addAll 把另一个容器所有对象都加进来
clear 清空

3.重点源码分析

源码解析:

public class MyArrayList<E>{

    private static final int DEFAULT_CAPACITY = 10;// 默认容量
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// 最大容量

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={} ;//空数组


    private Object[] elements;//底层维护的数组
    private int size;//容器内对象的个数
    private int modCount;//记录ArrayList这个对象被修改的次数
    //构造方法
    public MyArrayList(Object[] elements) {
        this.elements = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }


    /**
     *增加内容
     * @param e
     * @return
     */
    public boolean add(E e) {
        //创建一个默认为10的数组,若小则扩容

        int minCapacity=size+1;

        ensureCapacityInternal(minCapacity);
        //确保容量够,则添加数据,并讲数据大小加1.
        elements[size]=e;
        size++;
        return true;
    }

    //该方法来确保数组的容量够用,若为创建则创建数组并赋予默认值。
    private void ensureCapacityInternal(int minCapacity) {
        //若数组为空(还未添加数据)
        if (elements==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            //则选出默认值和最小容量的最大值
            minCapacity=Math.max(DEFAULT_CAPACITY,minCapacity);
            //只add方法其实没必要比较,主要是addAll()这个方法需要比较
        }

        modCount++;//修改次数加一

        //判断一下是否需要扩容,若数据+1大于当前数组,则需要扩容
        if(minCapacity-elements.length>0){
            grow(minCapacity);//调用扩容方法
        }
    }

    //扩容具体方法
    private void grow(int minCapacity){
        int oldCapacity=elements.length;//获取原始数组的长度
        int newCapacity=oldCapacity+(oldCapacity>>1);//扩容 1+0.5 倍
        //若扩容后的长度比所需要的最低长度还要小,则直接把扩容的长度更改为最低所需长度
        if (newCapacity-minCapacity<0){
            newCapacity=minCapacity;
        }
        //若扩容完的新长度比规定的最大容量还大,则要进一步判断,并进一步修改数组大小
        if (newCapacity-MAX_ARRAY_SIZE>0){
            //若所需的容量竟然小于0,说明超过Int最大值,越界了,抛出异常
           if (minCapacity<0){
               throw new OutOfMemoryError();
           }
           //若所需的容量不超过Int最大值,则再判断
            if (minCapacity>MAX_ARRAY_SIZE){//若所需的大于数组要求的而小于Int最大值
                newCapacity=Integer.MAX_VALUE;//直接赋值Int最大值
            }else{//否则只有小于数组最大值这一种情况了,赋予数组最大值即可
                newCapacity=MAX_ARRAY_SIZE;
            }
        }

    }
}

版权声明:本文为niujiajun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/niujiajun/p/14364352.html