Vector简介

来源:互联网 发布:钢笔书法 知乎 编辑:程序博客网 时间:2024/06/05 19:41

             Vector简介

Vector简介

    Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。

   Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。

   Vector实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问。

Vector源码剖析

public class Vector<E>    extends AbstractList<E>    implements List<E>, RandomAccess, Cloneable, java.io.Serializable{    // 保存Vector中数据的数组    protected Object[] elementData;    // 实际数据的数量    protected int elementCount;    // 容量增长系数     protected int capacityIncrement;     // Vector的序列版本号    private static final long serialVersionUID = -2767605614048989439L;  // 指定Vector"容量大小"和"增长系数"的构造函数       public Vector(int initialCapacity, int capacityIncrement) {        super();        if (initialCapacity < 0)            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);// 新建一个数组,数组容量是initialCapacity        this.elementData = new Object[initialCapacity];        this.capacityIncrement = capacityIncrement;// 设置容量增长系数    }   // 指定Vector容量大小的构造函数       public Vector(int initialCapacity) {        this(initialCapacity, 0);    }     // Vector构造函数。默认容量是10。    public Vector() {        this(10);    }    // 指定集合的Vector构造函数。    public Vector(Collection<? extends E> c) {        elementData = c.toArray();// 获取“集合(c)”的数组,并将其赋值给elementData        elementCount = elementData.length;// 设置数组长度        if (elementData.getClass() != Object[].class)            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);    }   // 将数组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);        }    }// 确认“Vector容量”的函数     public synchronized void ensureCapacity(int minCapacity) {        if (minCapacity > 0) {            modCount++;            ensureCapacityHelper(minCapacity);        }    }   //如果minCapacity大于当前容量,则进行扩容    private void ensureCapacityHelper(int minCapacity) {        // overflow-conscious code        if (minCapacity - elementData.length > 0)            grow(minCapacity);    }    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//扩容函数,先判断是否设置扩容系数;若扩容后大于最大限度,则调用hugeCapacity()函数,只扩展minCapacity    private void grow(int minCapacity) {        // overflow-conscious code        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);    }//扩展minCapacity    private static int hugeCapacity(int minCapacity) {        if (minCapacity < 0) // overflow            throw new OutOfMemoryError();        return (minCapacity > MAX_ARRAY_SIZE) ?            Integer.MAX_VALUE :            MAX_ARRAY_SIZE;    }   // 设置容量值为 newSize     public synchronized void setSize(int newSize) {        modCount++;        if (newSize > elementCount) {            ensureCapacityHelper(newSize);        } else {            for (int i = newSize ; i < elementCount ; i++) {                elementData[i] = null;            }        }        elementCount = newSize;    }     // 返回“Vector的总的容量”       public synchronized int capacity() {        return elementData.length;    }   // 返回“Vector的实际大小”,即Vector中元素个数      public synchronized int size() {        return elementCount;    }       // 判断Vector是否为空     public synchronized boolean isEmpty() {        return elementCount == 0;    } // 返回“Vector中全部元素对应的Enumeration”     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 elementData(count++);                    }                }                throw new NoSuchElementException("Vector Enumeration");            }        };    }   // 返回Vector中是否包含对象(o)     public boolean contains(Object o) {        return indexOf(o, 0) >= 0;    }   // 查找并返回元素(o)在Vector中的索引值      public int indexOf(Object o) {        return indexOf(o, 0);    }   //从index位置开始向后查找元素(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;    }    // 从后向前查找元素(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) {            for (int i = index; i >= 0; i--)                if (elementData[i]==null)                    return i;        } else {            for (int i = index; i >= 0; i--)                if (o.equals(elementData[i]))                    return i;        }        return -1;    }   // 返回Vector中index位置的元素。    public synchronized E elementAt(int index) {        if (index >= elementCount) {            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);        }        return elementData(index);    }  // 获取Vector中的第一个元素。    public synchronized E firstElement() {        if (elementCount == 0) {            throw new NoSuchElementException();        }        return elementData(0);    }     // 获取Vector中的最后一个元素。    public synchronized E lastElement() {        if (elementCount == 0) {            throw new NoSuchElementException();        }        return 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。      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++;        // Let gc do its work        for (int i = 0; i < elementCount; i++)            elementData[i] = null;        elementCount = 0;    }  // 克隆函数 ,将当前Vector的全部元素拷贝到v中    public synchronized Object clone() {        try {            @SuppressWarnings("unchecked")                Vector<E> v = (Vector<E>) super.clone();            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(e);        }    }     // 返回Object数组    public synchronized Object[] toArray() {        return Arrays.copyOf(elementData, elementCount);    }        // 返回Vector的模板数组。所谓模板数组,即可以将T设为任意的数据    @SuppressWarnings("unchecked")    public synchronized <T> T[] toArray(T[] a) {        if (a.length < elementCount)            return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());        System.arraycopy(elementData, 0, a, 0, elementCount);        if (a.length > elementCount)            a[elementCount] = null;        return a;    }    // Positional Access Operations    @SuppressWarnings("unchecked")    E elementData(int index) {        return (E) elementData[index];    }    // 获取index位置的元素     public synchronized E get(int index) {        if (index >= elementCount)            throw new ArrayIndexOutOfBoundsException(index);        return elementData(index);    }   // 设置index位置的值为element。并返回index位置的原始值     public synchronized E set(int index, E element) {        if (index >= elementCount)            throw new ArrayIndexOutOfBoundsException(index);        E oldValue = elementData(index);        elementData[index] = element;        return 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);        E 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 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);        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 void writeObject(java.io.ObjectOutputStream s)            throws java.io.IOException {        final java.io.ObjectOutputStream.PutField fields = s.putFields();        final Object[] data;        synchronized (this) {            fields.put("capacityIncrement", capacityIncrement);            fields.put("elementCount", elementCount);            data = elementData.clone();        }        fields.put("elementData", data);        s.writeFields();    }     // 返回一个从指定位置开始遍历的ListIterator迭代器    public synchronized ListIterator<E> listIterator(int index) {        if (index < 0 || index > elementCount)            throw new IndexOutOfBoundsException("Index: "+index);        return new ListItr(index);    }    // 返回一个ListIterator迭代器    public synchronized ListIterator<E> listIterator() {        return new ListItr(0);    }   // 返回一个Iterator迭代器    public synchronized Iterator<E> iterator() {        return new Itr();    }

Vector的源码实现总体与ArrayList类似,关于Vector的源码,给出如下几点总结:

    1、Vector有四个不同的构造方法。无参构造方法的容量为默认值10,仅包含容量的构造方法则将容量增长量(从源码中可以看出容量增长量的作用,第二点也会对容量增长量详细说)明置为0。

    2、很多方法都加入了synchronized同步语句,来保证线程安全。

    3、同样在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中也允许元素为null。

转载自:http://blog.csdn.net/ns_code/article/details/35793865


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 锁频君把应用变暗了怎么办 95的油加成92的怎么办 倒库一边宽了怎么办 倒库老是倒不好怎么办 倒库方向打早了怎么办 倒库左边小了怎么办 倒车入库小于30公分怎么办 倒库大于30公分怎么办 有行车记录仪遇到碰瓷怎么办 狗换了主人不吃怎么办 遇到扔东西碰瓷怎么办 碰见碰瓷的人怎么办 开店遇上碰瓷的顾客怎么办 我刮到别人的车怎么办 新车被刮了漆怎么办 停车擦到别人车怎么办 骑自行车被汽车撞了怎么办 车停在小区被刮怎么办 机动车被自行车撞了怎么办 单车撞小车后被起诉怎么办 给小车撞到电动单车怎么办 车停在路边被自行车撞怎么办 撞了碰瓷的人怎么办 谷丙转氨酶46该怎么办 渣土车开飞机了怎么办 自己车撞自己车怎么办 撞了人没钱赔怎么办 闯红灯扣了6分怎么办 开共享汽车闯红灯了怎么办 新手如果不小心闯红灯怎么办 红绿灯左转车道直行了怎么办 跟着大车后面闯了红灯怎么办 宝宝私处好红怎么办呢 甲亢难怀孕怎么办才好 怀孕8周查出甲亢怎么办 电动车被交警拖走了怎么办 电动车车被城管拖走了怎么办 12123地理反编码失败怎么办 苹果手机地理反编码失败怎么办 城管执法过程被打怎么办 老婆看不起老公不让碰怎么办