java Vector 和 ArrayList 的分析及比较
这里有新鲜出炉的 Java 并发编程示例, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 java Vector 和 ArrayList 的分析及比较的相关资料, Vector 是多线程安全的, 而 ArrayList 不是, 本文主要做对比对这两个方法, 需要的朋友可以参考下
java Vector 和 ArrayList 比较
今天研究了一下 Vector 和 ArrayList 的源码, 又加深了对这两个类的理解
List 接口下一共实现了三个类: ArrayList,Vector,LinkedListLinkedList 就不多说了, 它一般主要用在保持数据的插入顺序的时候
ArrayList 和 Vector 都是用数组实现的, 主要有这么三个区别:
1Vector 是多线程安全的, 而 ArrayList 不是, 这个可以从源码中看出, Vector 类中的方法很多有 synchronized 进行修饰, 这样就导致了 Vector 在效率上无法与 ArrayList 相比;
2 两个都是采用的线性连续空间存储元素, 但是当空间不足的时候, 两个类的增加方式是不同的, 很多网友说 Vector 增加原来空间的一倍, ArrayList 增加原来空间的 50%, 其实也差不多是这个意思, 不过还有一点点问题可以从源码中看出, 一会儿从源码中分析
3Vector 可以设置增长因子, 而 ArrayList 不可以, 最开始看这个的时候, 我没理解什么是增量因子, 不过通过对比一下两个源码理解了这个, 先看看两个类的构造方法:
ArrayList 有三个构造方法: 分别是
- public ArrayList(int initialCapacity)// 构造一个具有指定初始容量的空列表
- public ArrayList()// 构造一个初始容量为 10 的空列表
- public ArrayList(Collection<? extends E> c)// 构造一个包含指定 collection 的元素的列表
Vector 有四个构造方法:
- public Vector()// 使用指定的初始容量和等于零的容量增量构造一个空向量
- public Vector(int initialCapacity)// 构造一个空向量, 使其内部数据数组的大小, 其标准容量增量为零
- public Vector(Collection<? extends E> c)// 构造一个包含指定 collection 中的元素的向量
- public Vector(int initialCapacity,int capacityIncrement)// 使用指定的初始容量和容量增量构造一个空的向量
Vector 比 Arraylist 多一个构造方法, 没错就是 public Vector(int initialCapacity,int capacityIncrement)这个构造方法, capacityIncrement 就是容量增长, 即前面所说的增长因子, ArrayList 中是没有的
再贴出两个类的添加源码分析下(jdk1.7 版本):
- //ArrayList 类的添加源码:
- public boolean add(E e) {
- ensureCapacityInternal(size + 1); // Increments modCount!!
- elementData[size++] = e;
- return true;
- }
- private void ensureCapacityInternal(int minCapacity) {
- modCount++;
- // overflow-conscious code
- // 如果添加一个元素之后, 新容器的大小大于容器的容量, 那么就无法存值了, 需要扩充空间
- if (minCapacity - elementData.length > 0) grow(minCapacity);
- }
- private void grow(int minCapacity) {
- // overflow-conscious code
- int oldCapacity = elementData.length;
- int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩充的空间增加原来的 50%(即是原来的 1.5 倍)
- if (newCapacity - minCapacity < 0) // 如果容器扩容之后还是不够, 那么干脆直接将 minCapacity 设为容器的大小
- newCapacity = minCapacity;
- if (newCapacity - MAX_ARRAY_SIZE > 0) // 如果扩充的容器太大了的话, 那么就执行 hugeCapacity
- newCapacity = hugeCapacity(minCapacity);
- // minCapacity is usually close to size, so this is a win:
- elementData = Arrays.copyOf(elementData, newCapacity);
- }
Vector 类的添加源码:
- public synchronized boolean add(E e) {
- modCount++;
- ensureCapacityHelper(elementCount + 1);
- elementData[elementCount++] = e;
- return true;
- }
- private void ensureCapacityHelper(int minCapacity) {
- // overflow-conscious code
- if (minCapacity - elementData.length > 0)
- grow(minCapacity);
- }
- private void grow(int minCapacity) {
- // overflow-conscious code
- int oldCapacity = elementData.length;
- int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
- capacityIncrement : oldCapacity);
- /**
- 这个扩容需要做个判断: 如果容量增量初始化的不是 0, 即使用的 public Vector(int initialCapacity,int capacityIncrement)构造方法进行的初始化, 那么扩容的容量是(oldCapacity+capacityIncrement), 就是原来的容量加上容量增量的值; 如果没有设置容量增量, 那么扩容后的容量就是(oldCapacity+oldCapacity), 就是原来容量的二倍
- **/
- if (newCapacity - minCapacity < 0)
- newCapacity = minCapacity;
- if (newCapacity - MAX_ARRAY_SIZE > 0)
- newCapacity = hugeCapacity(minCapacity);
- elementData = Arrays.copyOf(elementData, newCapacity);
- }
通过分析, 现在应该可以理解了吧!
来源: http://www.phperz.com/article/18/0211/359311.html