Java集合:关于 Vector 的内容盘点

2022-12-01 20:39:40 浏览数 (1)

Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢。 ~ 本篇内容包括:Vector 概述、Vector 的使用(构造方法&常用方法)、ArrayList 与 Vector 的区别以及 Stack 栈的相关知识点!


文章目录
  • 一、Vector 概述
  • 二、Vector 的使用
    • 1、构造函数
    • 2、常用方法

  • 三、其他知识点
    • 1、ArrayList 与 Vector 的区别
    • 2、关于 Stack 栈

一、Vector 概述

Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList慢。

Vector 的思路和 ArrayList 基本是相同的,底层是数组保存元素,Vector 默认的容量是10,有一个增量系数,如果指定,那么每次都会增加一个系数的大小,否则就扩大一倍。

Vector 扩容的时候,其实就是数组的复制,其实还是比较耗时间的,所以,我们使用的时候应该尽量避免比较消耗时间的扩容操作。

Vector 和 ArrayList 最大的不同,是它是线程安全的,几乎每一个方法都加上了 Synchronize 关键字,所以它的效率相对也比较低一点。ArrayList 如果需要线程安全,可以使用 Collections.synchronizedList(new ArrayList(...)); 方法,获取一个线程安全的 List。


二、Vector 的使用

1、构造函数

方法名

方法说明

public Vector()

此构造函数用于创建空向量,以使其内部数据数组的大小为10,其标准容量增量为零

public Vector(int initialCapacity)

此构造函数用于创建具有指定初始容量且容量增量等于零的空向量

public Vector(int initialCapacity, int capacityIncrement)

此构造函数用于创建具有指定初始容量和容量增量的空向量

public Vector(Collection<? extends E> c)

此构造函数用于按照集合的迭代器返回的顺序创建包含指定集合元素的向量

2、常用方法

方法名

方法说明

boolean add(E o)

此方法将指定的元素追加到此Vector的末尾

void add(int index, E element)

此方法将指定的元素插入此Vector中的指定位置

boolean addAll(Collection<? extends E> c)

此方法将指定Collection中的所有元素追加到此Vector的末尾

boolean addAll(int index, Collection<? extends E> c)

此方法将指定Collection中的所有元素插入到此Vector中的指定位置

void addElement(E obj)

此方法将指定的组件添加到此向量的末尾,将其大小增加1

int capacity()

此方法返回此向量的当前容量

void clear()

此方法从此向量中删除所有元素

Object clone()

此方法返回此向量的克隆

boolean contains(Object elem)

如果此向量包含指定的元素,则此方法返回true

boolean containsAll(Collection<?> c)

如果此Vector包含指定Collection中的所有元素,则此方法返回true

void copyInto(Object[] anArray)

此方法将此向量的组件复制到指定的数组中

E elementAt(int index)

此方法返回指定索引处的组件

Enumeration<E> elements()

此方法返回此向量的组件的枚举。

void ensureCapacity(int minCapacity)

此方法可增加此向量的容量,以确保它至少可以保存最小容量参数指定的组件数

boolean equals(Object o)

此方法将指定的Object与此Vector进行比较以获得相等性

E firstElement()

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

E get(int index)

返回向量中指定位置的元素

int indexOf(Object elem)

搜索给定参数的第一个匹配项,使用 equals 方法测试相等性

int indexOf(Object elem, int index)

搜索给定参数的第一个匹配项,从 index 处开始搜索,并使用 equals 方法测试其相等性

void insertElementAt(E obj, int index)

将指定对象作为此向量中的组件插入到指定的 index 处

boolean isEmpty()

测试此向量是否不包含组件

E lastElement()

返回此向量的最后一个组件

int lastIndexOf(Object elem)

返回指定的对象在此向量中最后一个匹配项的索引

int lastIndexOf(Object elem, int index)

向后搜索指定的对象,从指定的索引处开始搜索,并返回一个索引

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

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


三、其他知识点

1、ArrayList 与 Vector 的区别

Vector 和 ArrayList 一样,都继承自 List,在大多方法的实现上,Vector 较 ArrayList,就是多了一个 synchronized关键字

  1. Vector 是线程安全的,ArrayList 不是线程安全的
  2. ArrayList 在底层数组不够用时在原来的基础上扩展0.5倍,Vector 是扩展1倍

无一例外,只要是关键性的操作,Vector 的方法前面都加了 synchronized 关键字,来保证线程的安全性。当执行 synchronized 修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用 ArrayList,需要做处理)。

和 ArrayList&Vector 一样,同样的类似关系的类还有 HashMap&HashTable,StringBuilder&StringBuffer,后者都是前者线程安全版本的实现实现。

2、关于 Stack 栈

栈(Stack) 是一种 后进先出(LIFO:Last In First Out) 的数据结构。

在 Java 中 Stack 类 extends Vector 栈容器,扩充了五个方法: push()peek()pop()empty()search(),栈中的方法遵循后进先出 main 方法需要等所有方法执行完弹出后才会弹出,方法的递归每一层都要等下一层结束/弹出才能结束/弹出。

此外,由于 Stack 是继承自 Vector 的,而 Vector 是线程安全的,所以 Stack 也是线程安全的。然而正因为 Stack 继承自 Vector,Stack 类已经不被官方推荐使用!!

官方推荐使用 LinkedList 来构建栈!!

0 人点赞