Array 、 ArrayList 、Vector 、 LinkedList 全部为 线性数据结构
Array : 固定大小的数组,需要内存的连续空间 ,不能扩容,无线程安全问题 。
ArrayList : 不固定大小的数据,初始化默认size=0,第一次插入的时候会增大defaultSize=10,后续每次加多少就扩充多大。 当然,删除的时候 ,size也会相应减小。
非线程安全, 但是自身会有安全检测, 需要内存的连续空间 ,适合遍历查询,不适合插入和删除操作
当有多个线程进行更新操作的时候,会 抛出ConcurrentModificationException
JDK代码中,所有的add(), next(), previous(), remove(), set()方法都会先执行 checkForComodification()
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }然后再执行操作之前,modCount++ , 执行完了之后 expectedModCount=modCount 。
但是,如果2个线程恰好都同时绕过了checkForComodification() ,那么假定同时在执行add方法的时候,
2者同时扩容,但是很明显,理论上需要扩容2次的,结果只扩容了一次,且添加的时候,是在this.size之后进行添加,那么就会导致2者相互覆盖的问题 。
建议 : 多线程 千万不要用ArrayList ,请用Vector.
Vectory : 线程安全的ArrayList, 在每一个add方法上面都加了Sychronized 。 初始化默认size=10,后续每次加多少就扩充多大。 当然,删除的时候 ,size也会相应减小。需要内存的连续空间 ,适合遍历查询,不适合插入和删除操作
LinkedList : 非线程安全 , 自身没有安全检测 。自身重写了add等方法 。多线程访问在断开某节点再连接新节点的时候,会在断开的节点重复连接,与预想不服,所以非线程安全。
不需要连续的内存空间 。适合 插入、删除,不适合遍历查询 。 初始化size=0 ,后续每次加多少SIZE就扩大多少 。