• JDK源码分析——Java.util.Vector的浅析


    首先我们来看JDK源码中Java.util.Vector的代码,剔除所有的方法和静态变量,

    Java.lang.Vector的核心代码如下:

    public class Vector<E>
        extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    {
       
        protected Object[] elementData;
    
        /**
         * The number of valid components in this {@code Vector} object.
         * Components {@code elementData[0]} through
         * {@code elementData[elementCount-1]} are the actual items.
         *
         * @serial
         */
        protected int elementCount;
    
        protected int capacityIncrement; //可以设定固定增量
    }

    通过上面的代码我们能看到他是数组存储。

    它的构造方法有四个:

     /**
         * Constructs an empty vector with the specified initial capacity and
         * capacity increment.
         *
         * @param   initialCapacity     the initial capacity of the vector
         * @param   capacityIncrement   the amount by which the capacity is
         *                              increased when the vector overflows
         * @throws IllegalArgumentException if the specified initial capacity
         *         is negative
         */
        public Vector(int initialCapacity, int capacityIncrement) {   //设置初始容量,及固定增量
    	super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
    	this.elementData = new Object[initialCapacity];
    	this.capacityIncrement = capacityIncrement;
        }
    
        /**
         * Constructs an empty vector with the specified initial capacity and
         * with its capacity increment equal to zero.
         *
         * @param   initialCapacity   the initial capacity of the vector
         * @throws IllegalArgumentException if the specified initial capacity
         *         is negative
         */
        public Vector(int initialCapacity) {    //设置初始容量,不设定固定增量(如果不设定固定增量,则成倍增长)
    	this(initialCapacity, 0);
        }
    
        /**
         * Constructs an empty vector so that its internal data array
         * has size {@code 10} and its standard capacity increment is
         * zero.
         */
        public Vector() {    //不设置初始容量,初始容量为10,不设定固定增量(如果不设定固定增量,则成倍增长)
    	this(10);
        }
    
        /**
         * Constructs a vector containing the elements of the specified
         * collection, in the order they are returned by the collection's
         * iterator.
         *
         * @param c the collection whose elements are to be placed into this
         *       vector
         * @throws NullPointerException if the specified collection is null
         * @since   1.2
         */
        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类的 add(E e)方法的源代码:

       /**
         * Appends the specified element to the end of this Vector.
         *
         * @param e element to be appended to this Vector
         * @return {@code true} (as specified by {@link Collection#add})
         * @since 1.2
         */
        public synchronized boolean add(E e) {    //从这里的synchronized我们可以知道他是线程同步的
    	modCount++;
    	ensureCapacityHelper(elementCount + 1);   //是否需要扩容
    	elementData[elementCount++] = e;   //后放的永远在最后一位
            return true;   // 好像他永远返回true 哦
        }

        /**
         * This implements the unsynchronized semantics of ensureCapacity.
         * Synchronized methods in this class can internally call this
         * method for ensuring capacity without incurring the cost of an
         * extra synchronization.
         *
         * @see #ensureCapacity(int)
         */
        private void ensureCapacityHelper(int minCapacity) {
    	int oldCapacity = elementData.length;
    	if (minCapacity > oldCapacity) {    //最新的值如果超出现有容量 扩容
    	    Object[] oldData = elementData;
    	    int newCapacity = (capacityIncrement > 0) ?
    		(oldCapacity + capacityIncrement) : (oldCapacity * 2);  //如果固定增量不为0则增长固定增量,否则成倍增长
    
        	    if (newCapacity < minCapacity) {   //新容量还小,这个可能性应该不大
    		newCapacity = minCapacity;
    	    }
                elementData = Arrays.copyOf(elementData, newCapacity);   // 改变数组的大小,这个方法可以记一下
    	}
        }
    

    下面我们再看一下 Vector类的 remove(Object o)方法的源代码:

     /**
         * Removes the first occurrence of the specified element in this Vector
         * If the Vector does not contain the element, it is unchanged.  More
         * formally, removes the element with the lowest index i such that
         * {@code (o==null ? get(i)==null : o.equals(get(i)))} (if such
         * an element exists).
         *
         * @param o element to be removed from this Vector, if present
         * @return true if the Vector contained the specified element
         * @since 1.2
         */
        public boolean remove(Object o) {
            return removeElement(o);      //他是调用的removeElement
        }
      
     /**
         * Removes the first (lowest-indexed) occurrence of the argument
         * from this vector. If the object is found in this vector, each
         * component in the vector with an index greater or equal to the
         * object's index is shifted downward to have an index one smaller
         * than the value it had previously.
         *
         * <p>This method is identical in functionality to the
         * {@link #remove(Object)} method (which is part of the
         * {@link List} interface).
         *
         * @param   obj   the component to be removed
         * @return  {@code true} if the argument was a component of this
         *          vector; {@code false} otherwise.
         */
        public synchronized boolean removeElement(Object obj) {
    	modCount++;
    	int i = indexOf(obj);         //查找obj第一次出现的位置,(Vector是允许重复值的)
    	if (i >= 0) {
    	    removeElementAt(i);        
    	    return true;
    	}
    	return false;
        }
    
     /**
         * Deletes the component at the specified index. Each component in
         * this vector with an index greater or equal to the specified
         * {@code index} is shifted downward to have an index one
         * smaller than the value it had previously. The size of this vector
         * is decreased by {@code 1}.
         *
         * <p>The index must be a value greater than or equal to {@code 0}
         * and less than the current size of the vector. 
         *
         * <p>This method is identical in functionality to the {@link #remove(int)}
         * method (which is part of the {@link List} interface).  Note that the
         * {@code remove} method returns the old value that was stored at the
         * specified position.
         *
         * @param      index   the index of the object to remove
         * @throws ArrayIndexOutOfBoundsException if the index is out of range
         *	       ({@code index < 0 || index >= size()})
         */
        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;  // 数组中index以后的元素个数
    	if (j > 0) {
    	    System.arraycopy(elementData, index + 1, elementData, index, j);   // 数组中index以后的元素,整体前移,(这个方法挺有用的!!)
    	}
    	elementCount--;
    	elementData[elementCount] = null; /* to let gc do its work */
        }

    从上面的代码我们可以看出 Vector每次只删除最靠前的那个相符的变量。

    下面我们再看一下 Vector类的 equals(Object o)方法的源代码:

        /**
         * Compares the specified Object with this Vector for equality.  Returns
         * true if and only if the specified Object is also a List, both Lists
         * have the same size, and all corresponding pairs of elements in the two
         * Lists are <em>equal</em>.  (Two elements {@code e1} and
         * {@code e2} are <em>equal</em> if {@code (e1==null ? e2==null :
         * e1.equals(e2))}.)  In other words, two Lists are defined to be
         * equal if they contain the same elements in the same order.
         *
         * @param o the Object to be compared for equality with this Vector
         * @return true if the specified Object is equal to this Vector
         */
        public synchronized boolean equals(Object o) {
            return super.equals(o);   //他是调用的父类AbstractList的equals
        }
    
    
        /**
         * Compares the specified object with this list for equality.  Returns
         * {@code true} if and only if the specified object is also a list, both
         * lists have the same size, and all corresponding pairs of elements in
         * the two lists are <i>equal</i>.  (Two elements {@code e1} and
         * {@code e2} are <i>equal</i> if {@code (e1==null ? e2==null :
         * e1.equals(e2))}.)  In other words, two lists are defined to be
         * equal if they contain the same elements in the same order.<p>
         *
         * This implementation first checks if the specified object is this
         * list. If so, it returns {@code true}; if not, it checks if the
         * specified object is a list. If not, it returns {@code false}; if so,
         * it iterates over both lists, comparing corresponding pairs of elements.
         * If any comparison returns {@code false}, this method returns
         * {@code false}.  If either iterator runs out of elements before the
         * other it returns {@code false} (as the lists are of unequal length);
         * otherwise it returns {@code true} when the iterations complete.
         *
         * @param o the object to be compared for equality with this list
         * @return {@code true} if the specified object is equal to this list
         */
        public boolean equals(Object o) {
    	if (o == this)
    	    return true;
    	if (!(o instanceof List))
    	    return false;
    
    	ListIterator<E> e1 = listIterator();
    	ListIterator e2 = ((List) o).listIterator();
    	while(e1.hasNext() && e2.hasNext()) {
    	    E o1 = e1.next();
    	    Object o2 = e2.next();
    	    if (!(o1==null ? o2==null : o1.equals(o2)))   //判断了三次
    	                 //这个方法挺不错的,应该比if(!(null==o1&&null==o2)||(null!=o1&&o1.equals(o2)))(大于等于三次判断)
    		return false;
    	}
    	return !(e1.hasNext() || e2.hasNext());  //长度是否一致
        }

    下面我们再看一下 Vector类的 hashCode()方法的源代码:

        /**
         * Returns the hash code value for this Vector.
         */
        public synchronized int hashCode() {
            return super.hashCode();   //他也是调用的父类AbstractList的hashCode
        }
    
    /**
         * Returns the hash code value for this list.
         *
         * <p>This implementation uses exactly the code that is used to define the
         * list hash function in the documentation for the {@link List#hashCode}
         * method.
         *
         * @return the hash code value for this list
         */
        public int hashCode() {
    	int hashCode = 1;
    	Iterator<E> i = iterator();
    	while (i.hasNext()) {
    	    E obj = i.next();
    	    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
    	       // 在这里用obj,比用i.next()效率高一倍(一直没明白他这为什么用31)
    	}
    	return hashCode;
        }



  • 相关阅读:
    每天一个linux命令(21):chgrp,chown,chmod
    设计模式之单例模式
    每天一个linux命令(20):find命令之exec
    每天一个linux命令(19):find 命令概览
    每天一个linux命令(18):locate 命令
    每天一个linux命令(17):whereis 命令
    【6折抢】戴尔i7新品Latitude高性能商用本
    Spring Cloud Gateway VS Zuul 比较,怎么选择?
    Zookeeper怎么实现分布式锁?
    数据库怎么分库分表,垂直?水平?
  • 原文地址:https://www.cnblogs.com/daichangya/p/12960037.html
Copyright © 2020-2023  润新知