Vector

什么是Vector
类似于ArrayList,Vector也是由数组组成,默认的初始化大小是【10】
Vector_第1张图片
但是Vector是线程安全的,在大多数的方法上面都存在synchronized关键字
Vector_第2张图片

如果需要进行扩容,每次扩容大小默认为【2】,注意(capacityIncrement > 0)是双括号条件
Vector_第3张图片

Vector和ArrayList的区别
1.vector默认构造还是饿汉式,而arrayList在1.8后改为了懒汉式
2.Vector 是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果,而 ArrayList 不是,这个可以从源码中看出,Vector 类中的方法很多有 synchronized 进行修饰,这样就导致了 Vector 在效率上无法与 ArrayList 相比【第二张图能体现】
3.vector可以设置增长因子【默认0】
● 以2倍的方式扩容,导致下一次申请的内存必然大于之前分配内存的总和,导致之前分配的内存不能再被使用,所以最好倍增长因子设置为(1,2)之间
Vector_第4张图片

4.因为考虑到线程安全的问题,效率比较低
可以用什么代替Vector
CopyOnWriteArrayList 相当于线程安全的ArrayList,它是个可变数组
● 它是线程安全的
○ 是通过volatile和监视器锁Synchrnoized来实现的
Vector_第5张图片

● 它的List通常保持很小,只读操作大于可变操作,需要在遍历的时候防止线程间冲突
● 因为需要复制整个基础数组,所以add,set,remove等可变操作开销大
○ 在“添加/修改/删除”数据时,都会新建一个数组,并将更新后的数据拷贝到新建的数组中,最后再将该数组赋值给“volatile数组”。这就是它叫做CopyOnWriteArrayList的原因!
● 支持hasNext和next,但是不支持可变remove操作
Vector_第6张图片

● 使用迭代器进行遍历的速度很快,并且不会与其它线程发生冲突,但是在构造迭代器的时候,迭代器依赖于不变的数组快照
○ COWIterator不支持修改元素的操作。例如,对于remove(),set(),add()等操作,COWIterator都会抛出异常!
Vector_第7张图片

Vector_第8张图片
Vector_第9张图片

你可能感兴趣的:(java,java)