ArrayList

ArrayList

java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。  

ArrayList 中可不断添加元素,其大小也自动增长。
ArrayList集合的特点
  底层是数组实现的,长度可以变化
泛型的使用   用于约束集合中存储元素的数据类型

构造方法

ArrayList的构造函数总共有三个:

(1)ArrayList()构造一个初始容量为 10 的空列表。

(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。

使用泛型与不使用泛型有什么区别

List lists=new ArrayList();
List<String> lists=new ArrayList<String>();
从list中取出的值不一样,
第一种的话取出来是object类型的,需要强制类型转换,
而第二个不用,取出来之后直接就是string类型的

常用方法

//方法名 说明
public boolean remove(Object o) 删除指定的元素,返回删除是否成功
public E remove(int index) 删除指定索引处的元素,返回被删除的元素
public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中的元素的个数
public boolean add(E e) 将指定的元素追加到此集合的末尾
public void add(int index,E element) 在此集合中的指定位置插入指定的元素

实现可变长度

建ArrayList对象时,ArrayList有个带参数的构造函数,那个参数的意思就代表着ArrayList长度,默认情况是10。当数据多了,ArrayList容不下时,这时ArrayList会增加长度,newLength = oldLength + oldLength/2;如果初始值是10,那么依次是15,22,33,49,73.....
.,长度是增加了,那是怎样实现的呢?当数据容不下时,ArrayList会再创建一个更大的数组,数组长度为之前所说的那样,然后将之前的数据拷贝到新数组中。这就是ArrayList基于数组实现的可变长度原理。

添加操作,首先会调用ensureCapacityInternal(size + 1),其作用为保证数组的容量始终够用,其中size是elementData数组中元组的个数,初始为0。

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }


在ensureCapacityInternal()函数中,用if判断,如果数组没有元素,给数组一个默认大小,会选择实例化时的值与默认大小中较大值,然后调用ensureExplicitCapacity()。

 private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
 
        ensureExplicitCapacity(minCapacity);
    }
 
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
 
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }



如果数组长度小于默认的容量10,则调用扩大数组大小的方法grow()。
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
}

从内部实现机制来讲ArrayList是使用数组(Array)来控制集合中的对象。当你增加元素的时候,如果元素的数目超出了内部数组目前的长度,它需要扩展内部数组的长度,ArrayList是原来的50%,即newCapacity = oldCapacity+(oldCapacity/2)

 

posted @ 2020-06-01 11:13  一半人生  阅读(248)  评论(0编辑  收藏  举报