ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

集合——ArrayList

2021-09-19 16:05:34  阅读:130  来源: 互联网

标签:int ArrayList elementData minCapacity 数组 集合 public


本文主要记录arraylist存储数据的方式

  • 以下图为例
    public static void main(String[] args) {
        //构造一个arraylist对象
        ArrayList list = new ArrayList<>();
        //循环添加数据 0-9
        for (int i = 0; i<10;i++){
            list.add(i);
        }
        //打印输出数据
        System.out.println(list);
    }
  1. ArrayList list = new ArrayList<>();——调用下列方法
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
  //给不会被序列化的数组赋空值
  public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
}

2. list.add(i);——调用下列方法

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
  //为集合添加元素
  public boolean add(E e) {
        //确保数组空间充足
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //为当前顺序下标指定值
        elementData[size++] = e;
        return true;
    }
}

ensureCapacityInternal(size +1);

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private void ensureCapacityInternal(int minCapacity) {
        //返回当前所需最小数组长度,如果数组为空,给数组长度10。
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
}

ensureExplicitCapacity

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private void ensureExplicitCapacity(int minCapacity) {
        //记录操作次数
        modCount++;
    <span class="hljs-comment">// overflow-conscious code
    <span class="hljs-comment">/*判断如果最小所需数组空间 - 当前数组的长度 &gt; 0
      调用grow方法为数组扩容
    */
    <span class="hljs-keyword">if (minCapacity - elementData.length &gt; <span class="hljs-number">0)
        grow(minCapacity);
}

}

grow(minCapacity)

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //为数组扩容
    private void grow(int minCapacity) {
        // overflow-conscious code
        //取得当前数组的长度
        int oldCapacity = elementData.length;
        /*获取数组扩容后的长度 oldCapacity >> 1 = oldCapacity / 2
          扩容后的长度为原数组长度的1.5倍
        */
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果扩容后的长度-数组需要的最小长度<0 ,将minCapacity置为扩容后的长度
        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:
        //将原数组数据拷贝到扩容后的数组中,空闲空间值为null
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

最后回到add方法为当前下标赋值

//为当前顺序下标指定值
elementData[size++] = e;

END

标签:int,ArrayList,elementData,minCapacity,数组,集合,public
来源: https://www.cnblogs.com/isclay/p/15311876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有