ArrayList的源码分析

/**

企业建站必须是能够以充分展现企业形象为主要目的,是企业文化与产品对外扩展宣传的重要窗口,一个合格的网站不仅仅能为公司带来巨大的互联网上的收集和信息发布平台,成都创新互联公司面向各种领域:封阳台成都网站设计网络营销推广解决方案、网站设计等建站排名服务。


  • Default initial capacity.
  • 初始化容量为10
    */
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    /**
  • Shared empty array instance used for default sized empty instances. We
  • distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
  • first element is added.
  • */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    /**

  • The array buffer into which the elements of the ArrayList are stored.
  • The capacity of the ArrayList is the length of this array buffer. Any
  • empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
  • will be expanded to DEFAULT_CAPACITY when the first element is added.
    */
    transient Object[] elementData; // non-private to simplify nested class access
    /**
  • The size of the ArrayList (the number of elements it contains).
  • @serial
    */
    private int size;
    //最大数组大小
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    //默认实例为一个空数组
    public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    //添加元素
    public boolean add(E e) {
    //确定容量
    ensureCapacityInternal(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
    }

    private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

    private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    //超过扩容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);

    }
    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);
    }
    //循环清除
    public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    
    size = 0;

    }
    //删除 --很巧妙的删除
    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;

    }

网页标题:ArrayList的源码分析
URL链接:https://www.cdcxhl.com/article2/gcjdoc.html

成都网站建设公司_创新互联,为您提供做网站云服务器搜索引擎优化ChatGPT网页设计公司商城网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

搜索引擎优化