JAVA集合(二)-ArrayList

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口,提供了相关的添加,删除,修改,遍历等功能。

一.ArrayList继承结构 
java.lang.Object
     -java.util.AbstractCollection
          -java.util.AbstractList
               -java.util.ArrayList

所有实现的接口:

直接子类(用的比较少):

二.实现方法介绍
2.1 构造方法:
~ArrayList()
将一个空的数组Object[],赋值给当前实例的elementData属性,当第一次添加对象的时候,会默认将数组扩容到10
~ArrayList(int initialCapacity)
实例化一个Object数组,大小为传入的initialCapacity,赋值给当前实例的elementData属性
~ArrayList(Collection c)
构造一个Object数组里面包含传入的集合类的所有元素

通过构造方法我们可以看出ArrayList是通过数组方式来存放对象

2.2 add 插入对象
 public boolean add(E e) {
        ensureCapacityInternal( size + 1); 
        elementData[size ++] = e;
        return true ;
    }
插入对象简单来看就是往数组中添加一个对象,ensureCapacityInternal方法是检验是否超过数组的大小,若超过则进行扩容,
private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            minCapacity = Math. max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

基于ArrayList已有的大小加1,作为minCapacity,判断实例中的elementData是否是空Object数组,为空则比较minCapacity和10的大小,赋给minCapacity大的值。
比较minCapacity和当前数组的大小,若minCapacity大于object数组大小,则进行扩容。产生一个新的容器大小newCapacity,计算方法为当前数组的大小*1.5倍。
如果minCapacity大于计算出的newCapacity,则将minCapacity赋给newCapacity,最后用system.arraycopy方法构造一个扩容的数组

其余一些方法:
~public boolean add(int index, E element) 在指定位置插入对象,若指定位置已有对象,则这个对象往后挪
~public E set(int index, E element) 替换指定位置的对象
~public boolean addAll(Collection c) 插入集合中的所有对象
~public boolean addAll(int index, Collection c) 在指定位置插入集合中的对象

2.3 remove 删除对象
public boolean remove(Object o) {
        if (o == null ) {
            for (int index = 0; index < size; index++)
                if (elementData [index] == null) {
                    fastRemove(index);
                    return true ;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData [index])) {
                    fastRemove(index);
                    return true ;
                }
        }
        return false ;
    }

判断删除的对象是否为null,如果为null,则遍历数组中所有的对象,并且判断是否为null,如果为null,则调用fastRemove来删除对应位置的对象。
fastRemove的实现方法是将数组中index后的元素往前复制一位,并将数组中的最后一个元素的值设置为null,自动调用GC来释放对这个对象的引用。
如果这个对象不为null的话,通过E的equals方法来比较元素的值是否相同,如果相同,同样是调用fastRemove方法完成删除操作。

另外一些方法:
~public E remove(int index) 删除指定位置的对象,实现比remove(E)多了一个数组范围的检测,但是少了对元素的遍历,因此性能会更好
~public E removeRange(int fromIndex, int toIndex) 删除从fromIndex到toIndex这段索引内的的对象
~public boolean removeAll(Collection c) 删除包含在集合c中的对象

2.4 get 获取对象
public E get( int index) {
        rangeCheck(index);

        return elementData(index);
    }

数组范围检测,是否数组越界,然后返回数组中的元素

2.5 contains 判断对象是否存在
 public boolean contains(Object o) {
        return indexOf(o) >= 0;
  }

  public int indexOf (Object o) {
        if (o == null ) {
            for (int i = 0; i < size; i++)
                if (elementData [i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData [i]))
                    return i;
        }
        return -1;
    }

查找对象是否为null,如果为null,直接遍历数组,查找为null的元素,返回位置。如果不为null,则遍历数组,equals方法判断是否相同,返回位置。最后判断这个位置是否大于0

三.ArrayList总结
对于ArrayList中,有几点需要注意

~ArrayList基于数组方式实现,最大容量为Integer.MAX_VALUE

~ArrayList在插入对象的时候会进行扩容的判断,删除对象的时候不会修改数组的大小,查找对象的时候进行数组的遍历

~ArrayList是非线程安全的






你可能感兴趣的:(JAVA集合)