• Vector的浅析


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

      Vector每次默认扩充为原来的2倍,ArrayList默认扩充为原来的1.5倍。Vector是同步的,ArrayList不是同步的
      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;
    	}
    
      	...
    
    	// 返回“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");
    			}
    		};
    	}
    	
    	// 删除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++;
    	}
    
    	// 在Vector中查找并删除元素obj。
    	// 成功的话,返回true;否则,返回false。
    	public synchronized boolean removeElement(Object obj) {
    		modCount++;
    		int i = indexOf(obj);
    		if (i >= 0) {
    			removeElementAt(i);
    			return true;
    		}
    		return false;
    	}
    
    	// 返回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位置的值为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;
    	}
    
    	// 删除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是否包含集合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;
    	}
    	
    	// 获取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();
    	}
    }
    
  • 相关阅读:
    鼠标滑动察看
    jquery放大镜,可随意设置css
    常用的js插件配合滚轮事件左右滚动
    css的各种bug集合,主要针对ie6,7会出现
    ajax跨域请求及jsonp方式
    js随机生成一组指定区间的数组
    性能测试相关
    web窗体加载的过程。
    解密微软中间语言:MSIL
    .net应用程序版本控制
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5513190.html
Copyright © 2020-2023  润新知