重学Java—Vector

Vector是List集合框架源码分析系列文章的最后一位篇,Vector与之前的ArrayList和LinkedList不同,其实是大家在项目中很少会接触到。

下面是Vector代码框架和继承关系,和List家族的其他两位相差无二,唯一可以说道说道的就是其线程安全性。

public class Vector<E> extends AbstractList<E> implements 
List<E>, RandomAccess, Cloneable, java.io.Serializable
{
}
复制代码

image.png

基础知识

关于vector我们应该掌握的知识如下所示:

默认容量:10

默认增长容量:0

基本数据结构:数组

最大容量:0x7fffffff(Integer.MAX_VALUE) – 8

下面是Vector的扩容算法实现。

private void grow(int minCapacity) {
		int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity -MAX_ARRAY_SIZE> 0)
        newCapacity =hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
复制代码

算法实现步骤:

  • 获取旧的容量
  • 新的容量 = 旧容量 + (容量增长 > 0)?容量增长:旧容量
  • 如果新容量 – 旧容量 < 0 旧直接用旧容量
  • 如果新容量 > 默认的最大容量,则直接走默认的容量
  • 最后调用copyof复制出一个数组执行扩容

保障多线程能力:synchronized。
Java Vector通过synchronized来保障Vector能够在多线程场景下的使用。

synchronized

什么是synchronized?

synchronized是一种同步锁,其能够保障在同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

其修饰范围如下所示:

  • 修饰一个代码块;
  • 修饰一个方法;
  • 修改一个静态的方法;
  • 修改一个类;

具体的作用就不在本文中详细去解释。

如何让ArrayList和LinkedList转化为线程安全的类型

这里会有一个问题,假如你的老板非要用ArrayList或LinkedList来做开发呢?面对线程安全问题我们该如何解决呢?

Collections.synchronizedList(list);
复制代码

通过这个接口,我们可以实现给任意继承List接口的类上锁。

synchronized (mutex) {return list.equals(o);}
复制代码

其内部由一个互斥锁实现线程安全,这里我也不过多分析,详细的源码分析将在线程安全的集合框架章节来描述。

总结

这算是集合框架的最后一章节之后文章将进入到Map的章节,其实对于学习过Java的同学来说List算是Java程序员从新手进化到高级的必经之路,其实不难关键我们需要掌握其核心思想,比如说基本数据结构,默认值,扩容方式,最大值,是否线程安全等。只要关注了这些其实也就基本掌握了这些框架的用法了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享