arraylist源码

Posted 三号小玩家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arraylist源码相关的知识,希望对你有一定的参考价值。

ArrayList集合

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
 
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    private static final int DEFAULT_CAPACITY = 10;
 

默认初始化空数组,Object数组,默认初始化数组大小,是10。

 

我们使用arraylist不会使用默认构造函数,一般都会给一个比较靠谱的数据,100或者1000个大小,避免让他不断扩容的操作。

 

 

add(E e)方法

    public boolean add(E e) {
        ensureCapacityInternal(size + 1); // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
 
 
 
 每增加一个 size就会++;
 elementData=["张三","李四","王五"];
 size=2;

 

set方法

     public E set(int index, E element) {
        rangeCheck(index);
 
        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }
     
    elementData[x]=ele;
     
     
  index,不能大于等于size   rangeCheck
  (E) elementData[index]; 读数组里的元素
 
  set(1,"赵六");
  判断 长度是否大于size,
  将index=1的数据读出来。
  给index位置的数据赋值给,传入的值。
  将之前读出来的value返回。
 

add(int index, E element) 方法

 add(int index, E element)
 
 index,不能大于等于size   rangeCheck
 size+1,确保数据不能满了。
 数组拷贝的api
    System.arraycopy(elementData, index, elementData, index + 1,
                          size - index);
                         
  add(1,"麻子");
  elementData=["张三","李四","王五"];
  index=1;
  size=3;
  System.arraycopy(elementData, 1, elementData,2,
                          2);
        elementData这个数组,从第一位开始(第二个元素)到数组(原来的)从第二位开始(第三个元素),到原来的向后挪一位。
                         

##get(int index)

  public E get(int index) {
        rangeCheck(index);//检查
        return elementData(index);//直接拿数据
    }

remove(int index)

    public E remove(int index) {
        rangeCheck(index);
 
        modCount++;
        E oldValue = elementData(index);
 
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                              numMoved);
        elementData[--size] = null; // clear to let GC do its work
 
        return oldValue;
    }
 
 检查,获取当前index的value,然后获取numMoved 也就是删除这个index后面需要向前挪数据的个数,
 然后就复制。
 将最后那位的数据给null。

 

add和addall这两个方法,数组需要扩容,数组长度固定,初始大小是10,需要扩容影响性能。

 

set,get定位到随机位置,性能很高。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于arraylist源码的主要内容,如果未能解决你的问题,请参考以下文章

获取 Intent 片段上的 Serializable ArrayList

ArrayList源码分析超详细

包含不同片段的HashMap(或ArrayList)

JAVA——底层源码阅读——集合ArrayList的实现底层源码分析

面试常用的代码片段

1 手写ArrayList核心源码