首页 > 其他 > 详细

ArrayList源码解析

时间:2021-05-24 16:46:42      阅读:18      评论:0      收藏:0      [点我收藏+]
1 /**
2      * elementData:Object[] elementData
3      * Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}
4      * 将elementData初始化为一个空数组
5      */
6     public ArrayList() {
7         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
8     }
 1 //eg1:e=100 size=0
 2     //eg2:e=200 size=1
 3     //eg3:e=1100 size=10 测试扩容
 4     public boolean add(E e) {
 5         //eg3:此步骤已经将elementData.length由10扩容为15
 6         ensureCapacityInternal(size + 1);  // Increments modCount!!
 7         //eg1:elementData[0]=100,size=1
 8         //eg2:elementData[1]=200,size=2
 9         //eg3:elementData[10]=1100,size=11
10         elementData[size++] = e;
11         return true;
12     }
//eg1:minCapacity=1
    //eg2:minCapacity=2
    //eg3:minCapacity=11
    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
/**
     * 判断elementData是否为空数组,minCapacity=elementData.size+1
     * @param elementData
     * @param minCapacity
     * @return
     */
    //eg1:elementData={},minCapacity=1
    //eg2:elementData={100},minCapacity=2
    //eg2:elementData={100,200,...,1000},minCapacity=11
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        //eg1:true
        //eg2:false
        //eg3:false
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            //eg1:DEFAULT_CAPACITY=10 return 10
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
        }
/**
     * 自增对象的操作次数,判断是否需要扩容
     * @param minCapacity
     */
    //eg1:minCapacity=10
    //eg2:minCapacity=2
    //eg3:minCapacity=11
    private void ensureExplicitCapacity(int minCapacity) {
        //记录对对象的操作次数
        modCount++;
        // overflow-conscious code
        //eg1:minCapacity=10,elementData.length=0 true
        //eg2:minCapacity=2,elementData.length=10 false
        //eg2:minCapacity=11,elementData.length=10 true
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
 1 /**
 2      * 扩容操作,
 3      */
 4     /**
 5      * 位运算
 6      * 4>>1,右移一位,相当于(int)value/2
 7      * 0100>>1=0010=2
 8      * 4<<1左移一位,相当于value*2
 9      * 0100<<1=1000=8
10      */
11     //扩容操作
12     //eg1:minCapacity=10
13     //eg3:minCapacity=11
14     private void grow(int minCapacity) {
15         // overflow-conscious code
16         //eg1:oldCapacity=0
17         //eg3:oldCapacity=10
18         int oldCapacity = elementData.length;
19         //eg1:newCapacity=0
20         //eg3:newCapacity=10+5=15
21         int newCapacity = oldCapacity + (oldCapacity >> 1);
22         //eg1:true,newCapacity=10
23         //eg3:false,newCapacity=15
24         if (newCapacity - minCapacity < 0)
25             newCapacity = minCapacity;
26         //eg1:MAX_ARRAY_SIZE=Integer.MAX_VALUE - 8,false
27         //eg3:false
28         if (newCapacity - MAX_ARRAY_SIZE > 0)
29             newCapacity = hugeCapacity(minCapacity);
30         // minCapacity is usually close to size, so this is a win:
31         //eg1:elementData=new Object[10]
32         //eg3:elementData.length=15
33         elementData = Arrays.copyOf(elementData, newCapacity);
34     }

以上是初始化方法和add方法,接下来介绍remove方法

 1 //eg1:index=2,size=11,elementData={100,200,300,...,1100}
 2     public E remove(int index) {
 3         //判断index是否越界
 4         //eg1:index=2
 5         rangeCheck(index);
 6 
 7         modCount++;
 8         //eg1:oldValue=elementData[2]=300
 9         E oldValue = elementData(index);
10         //eg1:numMoved=11-2-1=8
11         int numMoved = size - index - 1;
12         //eg1:numMoved=8,true
13         if (numMoved > 0)
14         /**
15          * System.arraycopy,将src数组下标为3后续的8个value复制到desc数组下标为2开始的8个value
16          * eg1:System.arraycopy(
17          *         {100,200,300,...,1100}, //src数组
18          *         3,//src数组下标
19          *         {100,200,300,...,1100},//desc数组
20          *         2,//desc下标
21          *         8//移动的位数
22          * )
23          */
24             System.arraycopy(elementData, index+1, elementData, index,
25                              numMoved);
26         //eg1:elementData={100,200,400,500,600,700,800,900,1000,1100,1100}
27         elementData[--size] = null; // clear to let GC do its work
28         //eg1:elementData={100,200,400,500,600,700,800,900,1000,1100}
29         return oldValue;
30     }

 

ArrayList源码解析

原文:https://www.cnblogs.com/zhujianqiang/p/14803678.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!