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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值