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. JAVA项目从运维部署到项目开发(六. Jenkins之静态页面)

    用Git托管静态页面代码,通过Jenkins部署静态页面,是再方便不过的了.本文将介绍如何通过Jenkins部署最新的静态页面代码. 一.Jenkins的配置 1.设置项目名称.参数(环境.分支)等 ...

  2. LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer

    给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. A linked list is given such that each no ...

  3. C# Winfrom 自定义控件——带图片的TextBox

    效果: 描述: 本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样: 但这样做,输入框在获取焦点时候,会把图片挡住就像这样: 输入完成之后图片就会显示完整 ...

  4. Codeforces Round #527 (Div. 3) 总结 A B C D1 D2 F

    传送门 A 贪心的取 每个字母n/k次 令r=n%k 让前r个字母各取一次 #include <bits/stdc++.h> using namespace std; typedef lo ...

  5. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  6. 从boosting谈起

    Boosting 将一些表现效果一般(可能仅仅优于随机猜测)的模型通过特定方法进行组合来获得一个表现效果较好的模型.抽象地说,模型的训练过程是对一任意可导目标函数的优化过程. Adaptive boo ...

  7. java多线程基础(一)--sleep和wait的区别

    sleep和wait的区别有: 1.这两个方法来自不同的类分别是Thread和Object: 2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得线程可以使用同步控制块或者方法: 3.w ...

  8. Python递归函数,二分查找算法

    目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...

  9. VS调试时修改代码

    最近碰到一个问题,就是vs在调试模式下无法修改代码之后再继续,这种严重影响工作效率的问题怎么能忍,所以决心把这个坑填满.网上搜了大堆有头无尾有尾无头的答案,我一个一个试了几乎都没啥用.最后通过不断的测 ...

  10. Oracle - SPM固定执行计划(一)

    一.前言 生产中偶尔会碰到一些sql,有多种执行计划,其中部分情况是统计信息过旧造成的,重新收集下统计信息就行了.但是有些时候重新收集统计信息也解决不了问题,而开发又在嗷嗷叫,没时间让你去慢慢分析原因 ...