Vector的浅析

  Vector 可实现自动增长的对象数组。java.util.vector 提供了向量类(vector)以实现类似动态数组的功能。在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量。Java提供了丰富的类库来方便编程者使用,vector类便是其中之一。事实 上,灵活使用数组也可以完成向量类的功能,但向量类中提供大量的方法大大方便了用户的使用。创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。对于预先不知或者不愿预先定义数组大小,并且需要频繁地进行查找,插入,删除工作的情况。可以考虑使用向量类。
  Vector类的核心声明如下:

public class Vector<E> extends AbstractList<E> implements List<E>,
		RandomAccess, Cloneable, java.io.Serializable {
	protected Object[] elementData;// 保存Vector中数据的数组
	protected int elementCount;// 实际数据的数量
	protected int capacityIncrement;// 容量增长系数
	private static final long serialVersionUID = -2767605614048989439L;
}

  Vector类具有构造函数:

     public Vector() {
		this(10);
	}
	// 指定Vector容量大小的构造函数
	public Vector(int initialCapacity) {
		this(initialCapacity, 0);
	}
	// 指定Vector"容量大小"和"增长系数"的构造函数
	public Vector(int initialCapacity, int capacityIncrement) {
		super();
		if (initialCapacity < 0)
			throw new IllegalArgumentException("Illegal Capacity:"+ initialCapacity);
		this.elementData = new Object[initialCapacity];
		this.capacityIncrement = capacityIncrement;
	}

	// 指定集合的Vector构造函数。
	public Vector(Collection<? extends E> c) {
		// 获取“集合(c)”的数组,并将其赋值给elementData
		elementData = c.toArray();
		// 设置数组长度
		elementCount = elementData.length;
		// c.toArray might (incorrectly) not return Object[] (see 6260652)
		if (elementData.getClass() != Object[].class)
			elementData = Arrays.copyOf(elementData, elementCount,Object[].class);
	}

  其他代码:

public class Vector<E> extends AbstractList<E> implements List<E>,
		RandomAccess, Cloneable, java.io.Serializable {
	...
	// 将数组Vector的全部元素都拷贝到数组anArray中
	public synchronized void copyInto(Object[] anArray) {
		System.arraycopy(elementData, 0, anArray, 0, elementCount);
	}
	public synchronized void trimToSize() {
		modCount++;
		int oldCapacity = elementData.length;
		if (elementCount < oldCapacity) {
			elementData = Arrays.copyOf(elementData, elementCount);
		}
	}

	private void ensureCapacityHelper(int minCapacity) {
		int oldCapacity = elementData.length;
		if (minCapacity > oldCapacity) {
			Object[] oldData = elementData;
			int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement)
					: (oldCapacity * 2);
			if (newCapacity < minCapacity) {
				newCapacity = minCapacity;
			}
			elementData = Arrays.copyOf(elementData, newCapacity);
		}
	}
	public synchronized void ensureCapacity(int minCapacity) {
		modCount++;
		ensureCapacityHelper(minCapacity);
	}

	// 设置容量值为 newSize
	public synchronized void setSize(int newSize) {
		modCount++;
		if (newSize > elementCount) {
			// 若 "newSize 大于 Vector容量",则调整Vector的大小。
			ensureCapacityHelper(newSize);
		} else {
			// 若 "newSize 小于/等于 Vector容量",则将newSize位置开始的元素都设置为null
			for (int i = newSize; i < elementCount; i++) {
				elementData[i] = null;
			}
		}
		elementCount = newSize;
	}

  	public synchronized int capacity() {
		return elementData.length;
	}

	// 返回“Vector的实际大小”,即Vector中元素个数
	public synchronized int size() {
		return elementCount;
	}
	public synchronized boolean isEmpty() {
		return elementCount == 0;
	}

	// 返回“Vector中全部元素对应的Enumeration”
	public Enumeration<E> elements() {
		// 通过匿名类实现Enumeration
		return new Enumeration<E>() {
			int count = 0;
			// 是否存在下一个元素
			public boolean hasMoreElements() {
				return count < elementCount;
			}
			// 获取下一个元素
			public E nextElement() {
				synchronized (Vector.this) {
					if (count < elementCount) {
						return (E) elementData[count++];
					}
				}
				throw new NoSuchElementException("Vector Enumeration");
			}
		};
	}

	// 返回Vector中是否包含对象(o)
	public boolean contains(Object o) {
		return indexOf(o, 0) >= 0;
	}
	// 从index位置开始向后查找元素(o)。
	// 若找到,则返回元素的索引值;否则,返回-1
	public synchronized int indexOf(Object o, int index) {
		if (o == null) {
			// 若查找元素为null,则正向找出null元素,并返回它对应的序号
			for (int i = index; i < elementCount; i++)
				if (elementData[i] == null)
					return i;
		} else {
			// 若查找元素不为null,则正向找出该元素,并返回它对应的序号
			for (int i = index; i < elementCount; i++)
				if (o.equals(elementData[i]))
					return i;
		}
		return -1;
	}

	// 查找并返回元素(o)在Vector中的索引值
	public int indexOf(Object o) {
		return indexOf(o, 0);
	}

	// 从后向前查找元素(o)。并返回元素的索引
	public synchronized int lastIndexOf(Object o) {
		return lastIndexOf(o, elementCount - 1);
	}

	// 从后向前查找元素(o)。开始位置是从前向后的第index个数;
	// 若找到,则返回元素的“索引值”;否则,返回-1。
	public synchronized int lastIndexOf(Object o, int index) {
		if (index >= elementCount)
			throw new IndexOutOfBoundsException(index + " >= " + elementCount);

		if (o == null) {
			// 若查找元素为null,则反向找出null元素,并返回它对应的序号
			for (int i = index; i >= 0; i--)
				if (elementData[i] == null)
					return i;
		} else {
			// 若查找元素不为null,则反向找出该元素,并返回它对应的序号
			for (int i = index; i >= 0; i--)
				if (o.equals(elementData[i]))
					return i;
		}
		return -1;
	}

	// 返回Vector中index位置的元素。
	// 若index月结,则抛出异常
	public synchronized E elementAt(int index) {
		if (index >= elementCount) {
			throw new ArrayIndexOutOfBoundsException(index + " >= "
					+ elementCount);
		}

		return (E) elementData[index];
	}

	// 获取Vector中的第一个元素。
	// 若失败,则抛出异常!
	public synchronized E firstElement() {
		if (elementCount == 0) {
			throw new NoSuchElementException();
		}
		return (E) elementData[0];
	}

	// 获取Vector中的最后一个元素。
	// 若失败,则抛出异常!
	public synchronized E lastElement() {
		if (elementCount == 0) {
			throw new NoSuchElementException();
		}
		return (E) elementData[elementCount - 1];
	}

	// 设置index位置的元素值为obj
	public synchronized void setElementAt(E obj, int index) {
		if (index >= elementCount) {
			throw new ArrayIndexOutOfBoundsException(index + " >= "
					+ elementCount);
		}
		elementData[index] = obj;
	}

	// 删除index位置的元素
	public synchronized void removeElementAt(int index) {
		modCount++;
		if (index >= elementCount) {
			throw new ArrayIndexOutOfBoundsException(index + " >= "
					+ elementCount);
		} else if (index < 0) {
			throw new ArrayIndexOutOfBoundsException(index);
		}

		int j = elementCount - index - 1;
		if (j > 0) {
			System.arraycopy(elementData, index + 1, elementData, index, j);
		}
		elementCount--;
		elementData[elementCount] = null; /* to let gc do its work */
	}

	// 在index位置处插入元素(obj)
	public synchronized void insertElementAt(E obj, int index) {
		modCount++;
		if (index > elementCount) {
			throw new ArrayIndexOutOfBoundsException(index + " > "
					+ elementCount);
		}
		ensureCapacityHelper(elementCount + 1);
		System.arraycopy(elementData, index, elementData, index + 1,
				elementCount - index);
		elementData[index] = obj;
		elementCount++;
	}

	// 将“元素obj”添加到Vector末尾
	public synchronized void addElement(E obj) {
		modCount++;
		ensureCapacityHelper(elementCount + 1);
		elementData[elementCount++] = obj;
	}

	// 在Vector中查找并删除元素obj。
	// 成功的话,返回true;否则,返回false。
	// 本栏目更多精彩内容:http://www.bianceng.cn/Programming/Java/
	public synchronized boolean removeElement(Object obj) {
		modCount++;
		int i = indexOf(obj);
		if (i >= 0) {
			removeElementAt(i);
			return true;
		}
		return false;
	}

	// 删除Vector中的全部元素
	public synchronized void removeAllElements() {
		modCount++;
		// 将Vector中的全部元素设为null
		for (int i = 0; i < elementCount; i++)
			elementData[i] = null;

		elementCount = 0;
	}

	// 克隆函数
	public synchronized Object clone() {
		try {
			Vector<E> v = (Vector<E>) super.clone();
			// 将当前Vector的全部元素拷贝到v中
			v.elementData = Arrays.copyOf(elementData, elementCount);
			v.modCount = 0;
			return v;
		} catch (CloneNotSupportedException e) {
			// this shouldn‘t happen, since we are Cloneable
			throw new InternalError();
		}
	}

	// 返回Object数组
	public synchronized Object[] toArray() {
		return Arrays.copyOf(elementData, elementCount);
	}

	// 返回Vector的模板数组。所谓模板数组,即可以将T设为任意的数据类型
	public synchronized <T> T[] toArray(T[] a) {
		// 若数组a的大小 < Vector的元素个数;
		// 则新建一个T[]数组,数组大小是“Vector的元素个数”,并将“Vector”全部拷贝到新数组中
		if (a.length < elementCount)
			return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());

		// 若数组a的大小 >= Vector的元素个数;
		// 则将Vector的全部元素都拷贝到数组a中。
		System.arraycopy(elementData, 0, a, 0, elementCount);

		if (a.length > elementCount)
			a[elementCount] = null;

		return a;
	}

	// 获取index位置的元素
	public synchronized E get(int index) {
		if (index >= elementCount)
			throw new ArrayIndexOutOfBoundsException(index);

		return (E) elementData[index];
	}

	// 设置index位置的值为element。并返回index位置的原始值
	public synchronized E set(int index, E element) {
		if (index >= elementCount)
			throw new ArrayIndexOutOfBoundsException(index);

		Object oldValue = elementData[index];
		elementData[index] = element;
		return (E) oldValue;
	}

	// 将“元素e”添加到Vector最后。
	public synchronized boolean add(E e) {
		modCount++;
		ensureCapacityHelper(elementCount + 1);
		elementData[elementCount++] = e;
		return true;
	}

	// 删除Vector中的元素o
	public boolean remove(Object o) {
		return removeElement(o);
	}

	// 在index位置添加元素element
	public void add(int index, E element) {
		insertElementAt(element, index);
	}

	// 删除index位置的元素,并返回index位置的原始值
	public synchronized E remove(int index) {
		modCount++;
		if (index >= elementCount)
			throw new ArrayIndexOutOfBoundsException(index);
		Object oldValue = elementData[index];

		int numMoved = elementCount - index - 1;
		if (numMoved > 0)
			System.arraycopy(elementData, index + 1, elementData, index,
					numMoved);
		elementData[--elementCount] = null; // Let gc do its work

		return (E) oldValue;
	}

	// 清空Vector
	public void clear() {
		removeAllElements();
	}

	// 返回Vector是否包含集合c
	public synchronized boolean containsAll(Collection<?> c) {
		return super.containsAll(c);
	}

	// 将集合c添加到Vector中
	public synchronized boolean addAll(Collection<? extends E> c) {
		modCount++;
		Object[] a = c.toArray();
		int numNew = a.length;
		ensureCapacityHelper(elementCount + numNew);
		// 将集合c的全部元素拷贝到数组elementData中
		System.arraycopy(a, 0, elementData, elementCount, numNew);
		elementCount += numNew;
		return numNew != 0;
	}

	// 删除集合c的全部元素
	public synchronized boolean removeAll(Collection<?> c) {
		return super.removeAll(c);
	}

	// 删除“非集合c中的元素”
	public synchronized boolean retainAll(Collection<?> c) {
		return super.retainAll(c);
	}

	// 从index位置开始,将集合c添加到Vector中
	public synchronized boolean addAll(int index, Collection<? extends E> c) {
		modCount++;
		if (index < 0 || index > elementCount)
			throw new ArrayIndexOutOfBoundsException(index);

		Object[] a = c.toArray();
		int numNew = a.length;
		ensureCapacityHelper(elementCount + numNew);

		int numMoved = elementCount - index;
		if (numMoved > 0)
			System.arraycopy(elementData, index, elementData, index + numNew,
					numMoved);

		System.arraycopy(a, 0, elementData, index, numNew);
		elementCount += numNew;
		return numNew != 0;
	}

	// 返回两个对象是否相等
	public synchronized boolean equals(Object o) {
		return super.equals(o);
	}

	// 计算哈希值
	public synchronized int hashCode() {
		return super.hashCode();
	}

	// 调用父类的toString()
	public synchronized String toString() {
		return super.toString();
	}

	// 获取Vector中fromIndex(包括)到toIndex(不包括)的子集
	public synchronized List<E> subList(int fromIndex, int toIndex) {
		return Collections.synchronizedList(super.subList(fromIndex, toIndex),
				this);
	}

	// 删除Vector中fromIndex到toIndex的元素
	protected synchronized void removeRange(int fromIndex, int toIndex) {
		modCount++;
		int numMoved = elementCount - toIndex;
		System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved);

		// Let gc do its work
		int newElementCount = elementCount - (toIndex - fromIndex);
		while (elementCount != newElementCount)
			elementData[--elementCount] = null;
	}

	// java.io.Serializable的写入函数
	private synchronized void writeObject(java.io.ObjectOutputStream s)
			throws java.io.IOException {
		s.defaultWriteObject();
	}
}
时间: 2024-10-12 08:21:28

Vector的浅析的相关文章

向量vector 容器浅析

一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. 二.容器特性 1.顺序序列 顺序容器中的元素按照严格的线性顺序排序.可以通过元素在序列中的位置访问对应的元素. 2.动态数组 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作.操供了在序列末尾相对快速地添加/删除元素的操作. 3.能够感知内存分配器的

C++数组和vector容器的比较以及浅析

作为一个C语言程序猿来说,数组是非常重要的,也是必不可少的一种数据组织和存储方式.在C++中却很少使用数组.从根本说主要有以下几个方面: 数据存储方式: (1)数组的内存地址是连续的,也就是说如果你要申请的内存地址必须是连在一起的.数组为每一个元素申请的空间大小相同的,连续的存储空间.对于空间的申请和控制需要我们自己控制. (2)vector也是连续的存储空间.对于空间的申请和控制都由标准库帮我们管理. 空间利用率: (1)数组在定义的时候已经指定了空间的大小,不能改变,除非你新申请一个空间来存

STL浅析——序列式容器vector的构造和内存管理: constructor() 和 push_back()

咱们先来做一个测试capacity是容器容量,size是大小: #include <iostream> #include <vector> using namespace std; int main(){ vector<int> result; for (int i = 0; i < 17; i++) { result.push_back(i); printf("element count: %d\t", result.size()); pri

C++ stack,queue,vector 中 易混淆的常用方法 浅析

C++ 中stack,queue,vector是常见的数据结构,它们分别封装在<stack>,<queue>,<vector>头文件中. stack,queue,vector的定义如下: stack<class T> s; queue<class T> q; vector<class T> v; stack常用方法: push()的向容器顶部里插入元素: pop()是删除容器顶部的元素: top()返回容器顶部的元素: size()返

C++ vector,list,dequeue,stack 存储结构浅析

vector适用:对象数量变化少,简单对象,随机访问元素频繁. list适用:对象数量变化大,对象复杂,插入和删除频繁. 最大的区别是,list是双向的,而vector是单向的. 因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则: 1.如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector:7 2.如果你需要大量的插入和删除,而不关心随即存取,则应使用list: 3.如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque. vec

Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比【文末福利】

ArrayList线程安全问题 众所周知,ArrayList不是线程安全的,在并发场景使用ArrayList可能会导致add内容为null,迭代时并发修改list内容抛ConcurrentModificationException异常等问题.java类库里面提供了以下三个轮子可以实现线程安全的List,它们是 Vector Collections.synchronizedList CopyOnWriteArrayList 本文简要的分析了下它们线程安全的实现机制并对它们的读,写,迭代性能进行了对

C++ 浅析 STL 中的 list 容器

list - 擅长插入删除的链表 链表对于数组来说就是相反的存在. 数组本身是没有动态增长能力的(程序中也必须又一次开辟内存来实现), 而链表强悍的就是动态增长和删除的能力. 但对于数组强悍的随机訪问能力来说的话,链表却非常弱. list - 是一个双向链表的实现. 为了提供双向遍历的能力,list要比一般的数据单元多出两个指向前后的指针. 这也是没办法的,毕竟如今的PC内存结构就是一个大数组,链表要在不同的环境中实现自己的功能就须要花很多其它空间. list提供了push_back,push_

React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到补胎和成功发车经历>和<React Native Android Gradle 编译流程浅析>两篇文章的学习我们 React Native 已经能够基本接入处理一些事情了,那接下来的事情就是渐渐理解 RN 框架的一些东西,以便裁剪和对 RN 有个更深入的认识,所以本篇总结了我这段时间阅读源码

(Android系统)android log机制浅析

在android下面debug,最主要的方式就是用logcat抓log了,我们可能有尝试过使用printf来打印,当然结果是不行的,这里有时间就看了一下android平台下log的flow,在此做个笔记以作记录 我们一般使用ALOGD来打印log,所以这里就跟一下ALOGD的flow system/core/include/log/log.h system/core/include/log/log.h #ifndef ALOGD #define ALOGD(...) ((void)ALOG(LO