• Java集合框架之Vector浅析


    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

  • 相关阅读:
    开发环境搭建
    添加约束设置方式
    ubuntu和windows双系统启动顺序的修改
    函数指针,指针函数,数组指针,指针数组 区分
    boost
    centos7 64位如何配置网络
    MySQL数据库(主键、索引、外键、触发器...)
    几种常见字符集与字符编码
    ODBC、OLEDB应用详解
    C#事件以及EventHandler、EventArgs
  • 原文地址:https://www.cnblogs.com/albertrui/p/8331551.html
Copyright © 2020-2023  润新知