Array、ArrayList、Vector、LinkedList

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就扩大多少 。









猜你喜欢

转载自blog.csdn.net/xubo_ob/article/details/70598108