zoukankan      html  css  js  c++  java
  • 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;
        }



  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/daichangya/p/12960037.html
Copyright © 2011-2022 走看看