jdk1.7.0_80版本 ArrayList集合解析

ArrayLIst

集合存在于Java.Util包路径下

  • 重复性
    可以存放重复的数值

  • null值
    可以有null值存在

  • 有序性
    可以保证元素插入有序

  • 底层数据结构
    ArrayList集合底层元素保存在数组中

源码研究

继承关系

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  1. ArrayList继承AbstractList,父类中对部分接口进行实现
  2. 实现了List接口提供的方法
  3. Serializable说明集合可以被序列化

基本属性及默认值

private static final int DEFAULT_CAPACITY = 10;//默认容量大小
private static final Object[] EMPTY_ELEMENTDATA = {};//默认数组大小
private transient Object[] elementData; //存储元素的数组
private int size;//集合存储元素的个数

构造函数

  1. 有参构造,指定集合初始化大小
public ArrayList( int initialCapacity){
    super();
    if (initialCapacity < 0)//指定大小不合法,抛出异常
       throw new IllegalArgumentException("Illegal Capacity: " +
              initialCapacity);
       this.elementData = new Object[initialCapacity];
}
  1. 无参构造
public ArrayList() {
	super();
	this.elementData = EMPTY_ELEMENTDATA;//给定的默认数组
}
  1. 有参构造,通过集合来创建新的集合
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

增长方式

1.5倍扩容

//minCapacity数值为size+1
private void grow(int minCapacity) {
		//记录旧的数组大小
        int oldCapacity = elementData.length;
        //新数组长度为旧数组的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

常用方法

  1. int size() 集合中存储元素的个数
  2. boolean isEmpty() 判断集合是否为空,返回值为boolean值
  3. boolean contains(Object o) 判断当前集合是否包含Object对象
  4. T[] toArray(T[] a) 将集合转化为数组
  5. boolean addAll(Collection<? extends E> c) 对该集合添加子集形成新的集合
  6. boolean addAll(int index, Collection<? extends E> c) 在指定位置对该集合添加子集形成新的集合
  7. boolean add(E e) 添加元素
    public boolean add(E e) {
       /**
     	*首先进行扩容考虑,如果size + 1 > elementData.length,需要扩容
        *将元素存放在数组的size位,并对其+1
        */
        ensureCapacityInternal(size + 1);  // 扩容
        elementData[size++] = e;
        return true;
    }
  1. void clear() 将集合清除掉
  2. int indexOf(Object o) 判断元素在集合中的位置(从前向后找)
  3. int lastIndexOf(Object o) 判断元素在集合中的位置,从尾部向前找
  4. List subList(int fromIndex, int toIndex) 找当前集合的子集(给定位置,例如0-3)

猜你喜欢

转载自blog.csdn.net/weixin_43289802/article/details/88224292
今日推荐