1.ArrayList的总结
//1.底层数组实现,使用默认的构造方法,初始化出来的容量是10(JDK 8 无参构造容量为0)
//2.扩容的长度是元长度的基础上加二分之一
//3.实现了RandomAccess接口,底层有事数组,get读取元素的性能很好
//4.线程不安全,所有的方法均不是同步方法,也没有加锁,因此,多线程下慎用
//5.顺序添加很方便
//6.删除和插入需要赋值数组性能很差(可以使用LinkindList)
ArrayList和Vector的区别
标准答案
//1.ArrayList是线程不安全的,Vector是线程安全的
//2.扩容时候ArrayList扩0.5倍,Vector扩1倍
那么问题来了
ArrayList有没有办法使线程安全?
Collection工具类有一个synchronizedList方法
可以把list变为线程安全的集合,但是意义不大,因为可以使用Vector
Vector为什么是线程安全的?
老实讲,抛开线程,它们两个的区别不大,但是多线程就不一样了,nameVectyor是如何实现线程安全的,我们来看几个关键的方法
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
int numMoved = elementCount - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;
}
就代码的实现上来说,和ArrayList并没有很多逻辑上的区别,但是Vector的关键方法都是用了synchronized修饰