线程安全解决办法 :
方法1: Collections.synchronizedList(new LinkedList())
方法2: LinkedList和ArrayList换成线程安全的集合,如CopyOnWriteArrayList,ConcurrentLinkedQueue…
方法3:Vector(内部主要使用synchronized关键字实现同步)java
ArrayList有三种构造方法
第一种:不含参数的默认构造方法
public ArrayList()
第二种:带初始容量参数的构造函数(用户可本身指定容量)
public ArrayList(int initialCapacity)
第三种:构造包含指定collection元素的列表。
public ArrayList(Collection<? extends E> c)
git
具体过程: 当咱们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (由于仍是一个空的 list),由于执行了 ensureCapacityInternal() 方法 ,因此 minCapacity 此时为10。此时,minCapacity - elementData.length > 0 成立,因此会进入 grow(minCapacity) 方法。
当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)在添加第一个元素后扩容成 10 了。此时,minCapacity - elementData.length > 0 不成立,因此不会进入 (执行)grow(minCapacity) 方法。
添加第三、4···到第10个元素时,依然不会执行grow方法,数组容量都为10。
直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进入grow方法进行扩容。
ArrayList 每次扩容以后容量都会变为原来的 1.5 倍左右(oldCapacity为偶数就是1.5倍,不然是1.5倍左右)! 奇偶不一样,好比 :10+10/2 = 15, 33+33/2=49。若是是奇数的话会丢掉小数.github
最好在 add 大量元素以前用 ensureCapacity 方法,以减小增量从新分配的次数
更详细的源码解读web
参考:JavaGuide面试