对于List接口这里还介绍一个它的实现类Vector,Vector 类可以实现可增长的对象数组。

  Vector可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删除操作。

  Vector实现List接口,继承AbstractList类,所以我们可以将其看做队列,支持相关的添加、删除、修改、遍历等功能。

  Vector实现RandmoAccess接口,即提供了随机访问功能,提供提供快速访问功能。在Vector我们可以直接访问元素。

  Vector 实现了Cloneable接口,支持clone()方法,可以被克隆。

  

  Vector提供了四个构造函数:

  /**

  * 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。

  */

  public Vector() {

    this(10);

  }

  /**

  * 构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。

  */

  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);

    }

  }

  /**

  * 使用指定的初始容量和等于零的容量增量构造一个空向量。

  */

  public Vector(int initialCapacity) {

    this(initialCapacity, 0);

  }

  /**

  * 使用指定的初始容量和容量增量构造一个空的向量。

  */

  public Vector(int initialCapacity, int capacityIncrement) {

    super();

    if (initialCapacity < 0) {

      throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);

    }

    this.elementData = new Object[initialCapacity];

    this.capacityIncrement = capacityIncrement;

  }

  在成员变量方面,Vector提供了elementData , elementCount, capacityIncrement三个成员变量。其中

  elementData :"Object[]类型的数组",它保存了Vector中的元素。按照Vector的设计elementData为一个动态数组,可以随着元素的增加而动态的增长,其具体的增加方式后面提到(ensureCapacity方法)。如果在初始化Vector时没有指定容器大小,则使用默认大小为10.

  elementCount:Vector 对象中的有效组件数。

  capacityIncrement:向量的大小大于其容量时,容量自动增加的量。如果在创建Vector时,指定了capacityIncrement的大小,则,每次当Vector中动态数组容量增加时,增加的大小都是capacityIncrement。如果容量的增量小于等于零,则每次需要增大容量时,向量的容量将增大一倍。

  同时Vector是线程安全的!

  对于源码的解析,在这里只就增加(add)删除(remove)两个方法进行讲解。

  2.1增加:add(E e):将指定元素添加到此向量的末尾。

  这个方法相对而言比较简单,具体过程就是先确认容器的大小,看是否需要进行扩容操作,然后将E元素添加到此向量的末尾。

  public synchronized boolean add(E e) {

    modCount++;

    ensureCapacityHelper(elementCount + 1);

    //确认容器大小,如果操作容量不够则扩容操作

    elementData[elementCount++] = e;

    //将e元素添加至末尾

    return true;

  }

  对于Vector整个的扩容过程,就是根据capacityIncrement确认扩容大小的,若capacityIncrement <= 0 则扩大一倍,否则扩大至capacityIncrement 。当然这个容量的最大范围为Integer.MAX_VALUE即,2^32 - 1,所以Vector并不是可以无限扩充的。

  private void ensureCapacityHelper(int minCapacity) {

    if (minCapacity - elementData.length > 0) {

      grow(minCapacity);

    }

  }

  /**

  * 进行扩容操作 * 如果此向量的当前容量小于minCapacity,则通过将其内部数组替换为一个较大的数组俩增加其容量。

  * 新数据数组的大小将为原来的大小 + capacityIncrement,

  * 除非 capacityIncrement 的值小于等于零,在后一种情况下,新的容量将为原来容量的两倍,不过,

  *如果此大小仍然小于 minCapacity,则新容量将为 minCapacity。

  */

  private void grow(int minCapacity) {

    int oldCapacity = elementData.length; //当前容器大小

    /* * 新容器大小

    * 若容量增量系数(capacityIncrement) > 0,则将容器大小增加到capacityIncrement

    * 否则将容量增加一倍

    */

    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);

  }

  /**

  * 判断是否超出最大范围

  * MAX_ARRAY_SIZE:private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

  */

  private static int hugeCapacity(int minCapacity) {

    if (minCapacity < 0) {

      throw new OutOfMemoryError();

    }

    return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;

  }

  2.2、remove(Object o)

  /**

  * 从Vector容器中移除指定元素E

  */

  public boolean remove(Object o) {

    return removeElement(o);

  }

  public synchronized boolean removeElement(Object obj) {

    modCount++;

    int i = indexOf(obj); //计算obj在Vector容器中位置

    if (i >= 0) {

      removeElementAt(i); //移除

      return true;

    }

    return false;

  }

  public synchronized void removeElementAt(int index) {

    modCount++; //修改次数+1

    if (index >= elementCount) {//删除位置大于容器有效大小

      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);

    } else if (index < 0) {//位置小于 < 0//位置小于 < 0

      throw new ArrayIndexOutOfBoundsException(index);

    }

    int j = elementCount - index - 1;

    if (j > 0) {

      /**

      *从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

      *也就是数组元素从j位置往前移

      */

      System.arraycopy(elementData, index + 1, elementData, index, j);

    }

    elementCount--;//容器中有效组件个数 - 1//容器中有效组件个数 - 1

    elementData[elementCount] = null;//将向量的末尾位置设置为null //将向量的末尾位置设置为null

  }

  因为Vector底层是使用数组实现的,所以它的操作都是对数组进行操作,只不过其是可以随着元素的增加而动态的改变容量大小,其实现方法是是使用

Arrays.copyOf方法将旧数据拷贝到一个新的大容量数组中。Vector的整个内部实现都比较简单,这里就不在重述了。

  Vector支持4种遍历方式。

  3.1、随机访问

  因为Vector实现了RandmoAccess接口,可以通过下标来进行随机访问。

  

  3.2、迭代器

  

  3.2、for循环

  

  3.4、Enumeration循环

  Vector vec = new Vector<>();

  Enumeration enu = vec.elements();

  while (enu.hasMoreElements()) {

    value = (Integer)enu.nextElement();

  }

 以上内容均来自http://www.cnblogs.com/chenssy/博客,此博客为本人学习笔记

29.vector的更多相关文章

  1. vector 内部方法大全 学习(初学者的参考资料)

    1    vector构造函数:也就是如何对一个vector对象进行初始化 ////////////////////////////代码//////////////////////////////// ...

  2. STL总结之vector

    STL中vector是通常作为数组使用,不过它更像一个动态数组,在实际项目开发中大量使用. 优点:存储空间连续,可以使用下标访问,时间复杂度O(1). 缺点:不适合从中间删除和添加元素. C++标准规 ...

  3. C++ 学习笔记之——STL 库 vector

    vector 是一种顺序容器,可以看作是可以改变大小的数组. 就像数组一样,vector 占用连续的内存地址来存储元素,因此可以像数组一样用偏移量来随机访问,但是它的大小可以动态改变,容器会自动处理内 ...

  4. 【C++】vector容器的用法

    检测vector容器是否为空: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 us ...

  5. 4-Spark高级数据分析-第四章 用决策树算法预测森林植被

    预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...

  6. for_each使用方法详解[转]

    for_each使用方法详解[转] Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL)曾經討論過for_each(),不過當時功力尚淺,只談 ...

  7. DCM TUTORIAL – AN INTRODUCTION TO ORIENTATION KINEMATICS (REV 0.1)

    原英文地址:dcm_tutorial 感觉这篇文章还是很有学习价值的,所以就抽出了一些时间对本文进行的翻译.下面这个好多人用的算法就是一种DCM 滤波器. //==================== ...

  8. [转]DCM Tutorial – An Introduction to Orientation Kinematics

    原地址http://www.starlino.com/dcm_tutorial.html Introduction This article is a continuation of my IMU G ...

  9. 对于fmri的hrf血液动力学响应函数的一个很直观的解释-by 西南大学xulei教授

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all;clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

随机推荐

  1. c#Socket Tcp服务端编程

    创建一个socket服务类,绑定监听端口, 然后创建一个线程listen连接的客户端, 把监听到的客户端加入dictionary里面,以便于管理, 同时创建receive线程,循环接收数据加入list ...

  2. Node.js的内存问题

    v8堆内存限制默认是1GB,所以可能成为瓶颈. 但是Buffer的内存不受限制,而且可以开多个Nodejs实例然后通过代理进行负载均衡,不过不知道这样效果怎么样呢? 但是基本上应该内存的话不会成为单实 ...

  3. Arrays和String单元测试-20175218

    Arrays和String单元测试 一.题目 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arra ...

  4. huawei USG防火墙子接口技术的应用案例

    网络拓扑: 在中小企业的办公网络的设计中,通常为了安全考虑,需要将不同部门之间的互访的流量经过防火墙中转,同时结合vpn stance将业务进行隔离,在本例中,使用两台USG防火墙做HA作为整个办公网 ...

  5. mac相关功能

    打开和关闭索引功能 打开:sudo mdutil -a -i on 关闭:sudo mdutil -a -i off 关闭后则无法搜

  6. Asp.net core中实现自动更新的Option

    Asp.net core可以监视json.xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper.consul获取最新的配置信息, 需要自己实现. 阅读了 Asp. ...

  7. Vue 获取元素样式 元素高度

    看到这个问题我第一时间想的竟然是JS 不知道你是怎么想的 不过昨天有一个小哥哥 问我一个Vue的 哈哈哈 get了 我当时问他为什么不用JS获取 他说 这个性能更高 那我们来看看这个高性能的获取元素高 ...

  8. 简单的StringBuffer实现

    package com.letv.test.base; import java.util.Arrays; public class StringBuffer { private char[] valu ...

  9. JavaScript数据类型,构造函数

    JavaScript 的数据类型分为两类:原始类型和对象类型. JavaScript中的原始类型包括数字.字符串和布尔值 JavaScript中有两种特殊的原始值:null和undefined. Ja ...

  10. Go的并发调度原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言:也正是Go语言的并发特性,吸引了全球无数的开发者.   并发(concurrency)和并行(parallellism) 并发 ...