源码学习之Vector

原创 2016年05月30日 15:51:02

Vector源码分析学习

  1. 同样,首先是Vector的定义

    //继承AbstractList抽线类,实现了List、RandomAccess、Cloneable和Serializable接口
    public class Vector<E>
        extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  2. Vector源码开头定义的几个成员变量

    //这个就是实际存储数据的数组,从这个可以看出Vector是数组实现的
    protected Object[] elementData;
    //Vector内有效元素的数量
    protected int elementCount;
    //Vector容量增量,当capacityIncrement>0时,需要扩容时,增加的的是capacityIncrement,否则增加的容量是oldCapacity
    protected int capacityIncrement;
  3. 构造函数,Vector一共提供了三个构造函数。

        //构造函数,initialCapacity初始化容量,capacityIncrement容量增量
        public Vector(int initialCapacity, int capacityIncrement) {
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity];
            this.capacityIncrement = capacityIncrement;
        }
         //构造函数,initialCapacity初始化容量,capacityIncrement设置为0
        public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }
         //构造函数,initialCapacity设置为10,capacityIncrement设置为0
        public Vector() {
            this(10);
        }
         //构造函数,从另外一个集合初始化Vector
        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);
        }
  4. Vector扩容机制

      //保证容量
        public synchronized void ensureCapacity(int minCapacity) {
            if (minCapacity > 0) {
                modCount++;
                ensureCapacityHelper(minCapacity);
            }
        }
      //保证容量,如果minCapacity大于Vector的容量,那么需要扩容
        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;
    
        private void grow(int minCapacity) {
            // overflow-conscious code
            //如果capacityIncrement大于0的时候,扩容capacityIncrement,否则扩容oldCapacity
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                             capacityIncrement : oldCapacity);
            //如果新容量不能满足最小容量要求,那么新容量设置成minCapacity
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
          //如果新容量大于MAX_ARRAY_SIZE,那么新容量设置成Integer.MAX_VALUE
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    
        private static int hugeCapacity(int minCapacity) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
        }
  5. Vector常用操作

     //返回Vector的size()
        public synchronized int size() {
            return elementCount;
        }
     //判断Vector是否是空
        public synchronized boolean isEmpty() {
            return elementCount == 0;
        }
     //判断是否包含o元素
     public boolean contains(Object o) {
            return indexOf(o, 0) >= 0;
        }
     //返回第一个出现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;
        }
    //获取index下标的元素值
        public synchronized E get(int index) {
            if (index >= elementCount)
                throw new ArrayIndexOutOfBoundsException(index);
    
            return elementData(index);
        }   
    //设置index,下标的元素值为element
        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
        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的元素
        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源码剖析

vector前导准备源码位置 * C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include源码版本 Copyright (c)...
  • feiniao251314
  • feiniao251314
  • 2016年07月21日 15:01
  • 1394

【C++】std::vector源码浅析

std::vector是stl标准模板库中的一个序列容器,其源码实现有几个特点:(1)C++中include的标准头文件是没有“.h”后缀的,其实这是C++的一层包裹,内部实现还是在“.h”文件中完成...
  • iEearth
  • iEearth
  • 2015年12月03日 15:30
  • 1984

[C++]Vector源码实现

Vector源码实现 vector是STL里最常用的容器,本文尝试着用一种相对简单的方法构建一个vector实现模板,并加上std::allocator。尽可能解释其中函数的意义。 代码实现用一个...
  • stary_yan
  • stary_yan
  • 2016年05月11日 11:43
  • 918

Vector类源码解析

Vector特点: 1.内部通过数组实现 2.通过synchronized同步方法,线程安全,适合多线程 3.由于线程安全,效率不高 4.默认存放10个元素 所在包package java....
  • qunxingvip
  • qunxingvip
  • 2016年07月15日 12:26
  • 633

【Java集合源码剖析】Vector源码剖析

Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。 LinkedList是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实...
  • mmc_maodun
  • mmc_maodun
  • 2014年07月02日 00:03
  • 8293

【源码】Vector、Stack源码解析

注:以下源码基于jdk1.7.0_11 Vector算是一个历史遗留下来的类,现在已基本被ArrayList取代。本文出于学习的目的来分析下这个类。 从图上可以看出...
  • RowandJJ
  • RowandJJ
  • 2014年08月11日 16:09
  • 1514

《STL源码剖析》---stl_vector.h阅读笔记

在STL中,最常用的就是容器,最常用的容器就是vector了。想要了解vector如何动态增长等特性,看一下stl中vector的代码吧!...
  • KangRoger
  • KangRoger
  • 2014年08月12日 16:16
  • 2920

vector容器内部实现机理(源代码和测试代码)

//Vector.h,个人实现的头文件,源文件引用时用#include "Vector" #ifndef VECTOR_INCLUDED #define VECTOR_INCLUDED templat...
  • u013021513
  • u013021513
  • 2014年12月16日 15:07
  • 535

Vector源码学习

一.总体介绍 /** * //总体介绍 * The {@code Vector} class implements a growable array of * objects. Like an...
  • u010915032
  • u010915032
  • 2016年07月24日 17:45
  • 175

STL::vector的源码学习

最近准备把stl
  • hhh3h
  • hhh3h
  • 2014年11月04日 06:43
  • 375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:源码学习之Vector
举报原因:
原因补充:

(最多只允许输入30个字)