Vector是List集合框架源码分析系列文章的最后一位篇,Vector与之前的ArrayList和LinkedList不同,其实是大家在项目中很少会接触到。
下面是Vector代码框架和继承关系,和List家族的其他两位相差无二,唯一可以说道说道的就是其线程安全性。
public class Vector<E> extends AbstractList<E> implements
List<E>, RandomAccess, Cloneable, java.io.Serializable
{
}
复制代码
基础知识
关于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