Java集合框架之Vector浅析

一、Vector概述:

  位于java.util包下的Vector是Java集合框架的重要一员,虽然没有ArrayList那么的常用,但是我们还要对其做相关学习;

1.1Vector简介

  • Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。
  • Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。
  • Vector实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问。
  • Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。
  • Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
  • Vector有四个不同的构造方法。无参构造方法的容量为默认值10,仅包含容量的构造方法则将容量增长量(从源码中可以看出容量增长量的作用,第二点也会对容量增长量详细说)设置为0。
  • 注意扩充容量的方法ensureCapacityHelper。与ArrayList相同,Vector在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就先看构造方法中传入的容量增长量参数CapacityIncrement是否为0,如果不为0,就设置新的容量为旧容量加上容量增长量,如果为0,就设置新的容量为旧的容量的2倍,如果设置后的新容量还不够,则直接新容量设置为传入的参数(也就是所需的容量),而后同样用Arrays.copyof()方法将元素拷贝到新的数组。
  • Vector中很多方法都加入了synchronized同步语句,来保证线程安全。
  • 同样在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中也允许元素为null。
  • 其他很多地方都与ArrayList实现大同小异,Vector现在已经基本不再使用,只是和ArrayList不同,Vector中的操作是线程安全的。

1.2的构造函数

Vector共有4个构造函数:
// 默认构造函数
Vector() // capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity) // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement) // 创建一个包含collection的Vector
Vector(Collection<? extends E> collection)

1.3Vector数据结构

Vector继承关系:
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractList<E>
↳ java.util.Vector<E> public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

Vector与Collection关系如下图:

Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。

(01) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。

(02) elementCount 是动态数组的实际大小。

(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时,增加的大小都是capacityIncrement。

二、Vector方法摘要:

方法摘要
 boolean add(E e)
          将指定元素添加到此向量的末尾。
 void add(int index, E element)

          在此向量的指定位置插入指定的元素。
 boolean addAll(Collection<? extends E> c)

          将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection
的迭代器所返回的顺序添加这些元素。
 boolean addAll(int index,
Collection<? extends E> c)


          在指定位置将指定 Collection 中的所有元素插入到此向量中。
 void addElement(E obj)

          将指定的组件添加到此向量的末尾,将其大小增加 1。
 int capacity()

          返回此向量的当前容量。
 void clear()

          从此向量中移除所有元素。
 Object clone()

          返回向量的一个副本。
 boolean contains(Object o)

          如果此向量包含指定的元素,则返回 true。
 boolean containsAll(Collection<?> c)

          如果此向量包含指定 Collection 中的所有元素,则返回 true。
 void copyInto(Object[] anArray)

          将此向量的组件复制到指定的数组中。
 E elementAt(int index)

          返回指定索引处的组件。
 Enumeration<E> elements()

          返回此向量的组件的枚举。
 void ensureCapacity(int minCapacity)

          增加此向量的容量(如有必要),以确保其至少能够保存最小容量参数指定的组件数。
 boolean equals(Object o)

          比较指定对象与此向量的相等性。
 E firstElement()

          返回此向量的第一个组件(位于索引 0) 处的项)。
 E get(int index)

          返回向量中指定位置的元素。
 int hashCode()

          返回此向量的哈希码值。
 int indexOf(Object o)

          返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回 -1。
 int indexOf(Object o,
int index)

          返回此向量中第一次出现的指定元素的索引,从 index
处正向搜索,如果未找到该元素,则返回 -1。
 void insertElementAt(E obj,
int index)

          将指定对象作为此向量中的组件插入到指定的 index
处。
 boolean isEmpty()

          测试此向量是否不包含组件。
 E lastElement()

          返回此向量的最后一个组件。
 int lastIndexOf(Object o)

          返回此向量中最后一次出现的指定元素的索引;如果此向量不包含该元素,则返回 -1。
 int lastIndexOf(Object o,
int index)

          返回此向量中最后一次出现的指定元素的索引,从 index
处逆向搜索,如果未找到该元素,则返回 -1。
 E remove(int index)

          移除此向量中指定位置的元素。
 boolean remove(Object o)

          移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。
 boolean removeAll(Collection<?> c)

          从此向量中移除包含在指定 Collection 中的所有元素。
 void removeAllElements()

          从此向量中移除全部组件,并将其大小设置为零。
 boolean removeElement(Object obj)

          从此向量中移除变量的第一个(索引最小的)匹配项。
 void removeElementAt(int index)

          删除指定索引处的组件。
protected
 void
removeRange(int fromIndex,
int toIndex)

          从此 List 中移除其索引位于 fromIndex(包括)与
toIndex(不包括)之间的所有元素。
 boolean retainAll(Collection<?> c)

          在此向量中仅保留包含在指定 Collection 中的元素。
 E set(int index, E element)

          用指定的元素替换此向量中指定位置处的元素。
 void setElementAt(E obj,
int index)

          将此向量指定 index
处的组件设置为指定的对象。
 void setSize(int newSize)

          设置此向量的大小。
 int size()

          返回此向量中的组件数。
 List<E> subList(int fromIndex,
int toIndex)

          返回此 List 的部分视图,元素范围为从 fromIndex(包括)到
toIndex(不包括)。
 Object[] toArray()

          返回一个数组,包含此向量中以恰当顺序存放的所有元素。
<T>
T[]
toArray(T[] a)

          返回一个数组,包含此向量中以恰当顺序存放的所有元素;返回数组的运行时类型为指定数组的类型。
 String toString()

          返回此向量的字符串表示形式,其中包含每个元素的 String 表示形式。
 void trimToSize()

          对此向量的容量进行微调,使其等于向量的当前大小。

参考文章:

  http://blog.csdn.net/hla199106/article/details/47356165

  https://www.cnblogs.com/skywang12345/p/3308833.html

Java集合框架之Vector浅析的更多相关文章

  1. Java集合框架之TreeMap浅析

    Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:

  2. Java集合框架之HashMap浅析

    Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...

  3. Java集合框架之TreeSet浅析

    Java集合框架之TreeSet浅析 一.TreeSet综述: 1.1TreeSet简介: TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧: public ...

  4. Java集合框架之HashSet浅析

    Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...

  5. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

  6. Java集合框架之ArrayList浅析

    Java集合框架之ArrayList浅析 一.ArrayList综述: 位于java.util包下的ArrayList是java集合框架的重要成员,它就是传说中的动态数组,用MSDN中的说法,就是Ar ...

  7. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

  8. Java集合框架之List接口浅析

    Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...

  9. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

随机推荐

  1. Linux 下载文件命令(wget)

    wget是Linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...

  2. 转 java - java反射机制创建对象

    转 https://blog.csdn.net/nch_ren/article/details/78814080 1.创建service实现类 package com.springstudy.refl ...

  3. 第一篇博客 安装open live writer

    第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...

  4. C#文件操作 File(静态类)

      操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 1 2 3 4 5 6 7 8 9 //使用file的静态方法进行复制             File.C ...

  5. hdoj 4715 Difference Between Primes 素数筛选+二分查找

    #include <string.h> #include <stdio.h> const int maxn = 1000006; bool vis[1000006]; int ...

  6. Where is the clone one and how to extract it?

    One cannot be in two places at once. Do you know what's "Dual Apps"? Manufactures like Xia ...

  7. Linux常用的命令及使用方法

    1.请用命令查出ifconfig命令程序的绝对路径 [root@localhost ~]# which ifconfig(ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令) / ...

  8. 疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器

    一.迭代器(Iterator) 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历. 定义:迭代器是一种检查容器内元素 ...

  9. zookeeper基本知识入门(一)

    之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...

  10. 对Java中HashCode方法的深入思考

    前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...