1. ArrayList 和 Vector 的区别是什么?
线程安全:Vector使用了 Synchronized 来实现线程同步,是线程安全的,而
性能:ArrayList 在性能方面要优于 Vector。
扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
2. Arraylist的初始化默认长度?
在jdk1.2到jdk1.6中的ArrayList的源码中,在构造方法上的确是创建了一个长度为10的数组。
从jdk_1.7之后,当你进行new ArrayList()的时候创建的是一个空数组初始容量就不是10了,而是一个空数组。
3. Arraylist的扩容原理?
当你第一次调用add进行添加元素的时候,会触发扩容。源码中我记得有个DEFAULT_CAPACITY常量=10。在第一次扩容的时候,会把数组长度变成10.如需要再次扩容,则扩容当前长度的1.5倍。是否再次扩容,取决于ArrayList在add之前的有效长度 1是否大于最大长度,如果大于就调用grow方法完成扩容。扩容的时候是用的位运算>>1,相当于之前容量的1.5倍。
4. 为什么要ArrayList扩容要是自身长度的1.5倍
1.5能充分利用前面已经释放的空间。如果是2的话,新容量刚刚好永远大于过去所有废弃的数组容量。
扩容容量不能太小,防止频繁扩容,频繁申请内存空间,数组频繁复制
扩容容量不能太大,需要充分利用空间,避免浪费过多空间。
所以一般情况下会选择(1, 2)之间。
5. 为什么要ArrayList扩容必须是1.5,而不是1.2,1.25,1.8或者1.75??
因为1.5 可以充分利用移位操作,减少浮点数或者运算时间和运算次数。
// 新容量计算
int newCapacity = oldCapacity (oldCapacity >> 1);
Capacity是容量的意思。
>> 1,的数学意义就是 当前值*1.5,只不过是>>运算在计算机中更快。