JAVA深入集合--Vector
2.1 Vector 的属性 : protected Object[] elementData; 这是用来存放元素的。 protected int elementCount; 这是记录这个对象存放了好多个元素 protected int capacityIncrement; 这是增长因子,就是你数组放不下了,增加容量。2.2 构造方法: public Vector() { this(10); } public Vector(int initialCapacity, int capacityIncrement) { this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; } public Vector(int initialCapacity) { this(initialCapacity, 0); } 这里我取了主要部分,从构造不难看出,我们默认 new Vector(),实际上是通过public Vector(int initialCapacity, int capacityIncrement) 方法,创建了长度为10 ,增长因子为0 的Object 数组。这里如果大概知道数组长度,请指定长度,必然复制数组带来的开销。public Vector(Collection<? extends E> c) {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); }这个构造 是把集合元素存放到Vector对象里面。
3.3 方法介绍:这里只介绍几个主要的,其余可以查询APIpublic synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e; return true; } 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);} }
同理: 方法:add(int index,E element) 向指定位置添加元素,实际上访问的是: 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++; }但是你发现 最终都是 调用 ensureCapacityHelper 等方法。还有: public synchronized void addElement(E obj) 方法,和add方法相比,只是返回值不一样,一个是boolean,一个是 void 内部完全一样。方法: public boolean contains(Object o) 判断元素是否存在,实际访问的是: public synchronized int indexOf(Object o, int index) {if (o == null) { for (int i = index ; i < elementCount ; i++)if (elementData[i]==null) return i;} else { for (int i = index ; i < elementCount ; i++)if (o.equals(elementData[i])) return i;}return -1; } 简单来说就是一个素组的循环。
方法:public Enumeration<E> elements()这里是创建了一个枚举类型,里面实现还是通过元素是否存在,通过下标遍历数组public Enumeration<E> elements() {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?类,或者其他类,以便于更适应我们的项目。不要把这些看得很圣神,其实都是你和JDK开发人员,差距没那么大,相信自己。