我们对下面代码进行debug,当我们使用无参构造器时,也就是没用指定ArrayList的容量的时候他他是空的,当我们第一次添加的时候才会扩容为10,当容量满之后每次会以1.5倍进行扩容。
当我们new之后elementData是空的 ,只有执行add方法后才会初始化容量,在add方法中会判断时候需要扩容,这个判断是每次执行add方法时都要判断的,由此我们可以看出ArrayList 的效率并不高。
在方法内我们会判断elementData是否为空通过前面的分析我们知道这个判断是成立的,if判断内会将 DEFAULT_CAPACITY, minCapacity中大的那个赋值给minCapacity,之后进入ensureExplicitCapacity()方法.
modCount是用来记录集合被修改的次数,为了防止多个线程同时操作同一个集合。
紧接着进入grow方法这个才是我们真正进行扩容的方法,先将elementData的长度保存起来, int newCapacity = oldCapacity + (oldCapacity >> 1);这个就相当于1.5倍,右移一位相当于➗2也就是0.5.下面的第一个if判断设计的非常巧妙,当你第一次扩容时并没有直接按照1.5倍数扩容而是将容量设置为10,最后进行数组的拷贝就可以