美文网首页
ArrayList源码理解

ArrayList源码理解

作者: 秋实_218f | 来源:发表于2019-01-11 11:47 被阅读0次

61、数据结构

ArrayList底层是用数组结构来保存数据的,所以它是一个有序结构(和插入位置有关)。它可以添加null元素。有初始容量,默认为10,当添加元素超过容量后,会进行容量扩充,新容量为oldCapacity + (oldCapacity  >> 1)也就是旧容量+旧容量的2分之1。

2、线程安全

ArryList是线程不安全的,如果需要多线程访问需要用户自己实现同步(synchronized)或用其他数据结构代替。

3、常用方法

~、get()

// 获取index位置的元素

public E get(int index){

    // 下标检查,保证index < size

    rangeCheck(index);

    return elementData(index);

}

E elementData(index){

    //可以看出是数组

    return (E) elementData[index];

}

~、add()

//  在数组最后添加

public boolean add(E e){

    // 进行容量检查,如果需要还要扩容

    ensureCapacityInternal(size + 1);

    elementData[size++] = e;

    return true;

}

// 在指定位置添加

public void add(int index, E e){

    rangeCkeckForAdd(index);

    ensureCapacityInternal(size + 1);

    System.arraycopy(elementData, index, elementData, index + 1, size - index);

    elementData[index] = e;

    size++;

}

addAll(Collection<? extends E> c)

addAll(int index, Collection<? extends E> c)

2个方法同add2个方法原理一样。

~、 remove()

// 删除指定位置的元素

public E remove(int index){

        rangeCheck();

        modCount++;

        E oldValue = elementData(index);

        int numMoved = size - index - 1;

        if(numMoved > 0)

            System.arraycopy(elementData, index + 1, elementData, index, numMoved);

        // 消除引用

        elementData[--size] = null;

        return oldValue;

}

// 删除第一次出现的与参数o相等的元素

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;

}

~、set()

// 替换index位置的的元素为element

public E set(int index, E element) {

    // 下标检查,保证index < size

    rangeCheck();

    E oldValue = elementData(index);

    elementData[index] = element;

    return oldValue;

}

~、clear()

// 清空

public void clear(){

    modCoumt++;

    for(int i = 0; i < size; i++){

        elementData[i] = null;

    }

    size = 0;

}

相关文章

网友评论

      本文标题:ArrayList源码理解

      本文链接:https://www.haomeiwen.com/subject/qstxdqtx.html