Java 中的 Vector 类
Vector 类实现了一个可增长的对象数组。Vector 类属于传统类,但现在与集合完全兼容。它被发现在 java.util 包中,并实现了 List 接口,因此我们可以使用所有 List 接口的方法,如下所示:
- Vector 实现了一个动态数组,这意味着它可以根据需要增长或缩小。和数组一样,它包含可以使用整数索引访问的组件。
- 它们非常类似于 ArrayList ,但 Vector 是同步的,并且具有一些集合框架中不存在的传统方法。
- 它还保持了插入顺序,就像 ArrayList 一样。但是,在非线程环境下很少使用它,因为它是同步的,因此在添加、搜索、删除和更新其元素时性能较差。
- Vector 类返回的迭代器是故障快速的。在并发修改的情况下,它会失败并抛出 ConcurrentModificationException 。
语法:
这里, E 是元素的类型。
- 它扩展了 AbstractList ,并实现了 List 接口。
- 它实现了 Serializable、Cloneable、Iterable
、Collection 、List 、RandomAccess 接口。 - 直接已知的子类是 Stack 。
关于 vector 容量的增量的重要点如下:
如果指定了增量,Vector 将按照它在每个分配周期中进行扩展。但如果未指定增量,则在每个分配周期中将 vector 容量加倍。Vector 定义了三个受保护的数据成员:
- int capacityIncreament: 包含增量值。
- int elementCount: 存储在其中的 vector 中当前的元素数量。
- Object elementData[]: 存储向量的数组。
Vector 声明中的常见错误如下:
- 如果定义的 vector 的初始大小为负,则 Vector 抛出 IllegalArgumentException 。
- 如果指定的集合为 null,则抛出 NullPointerException 。
构造函数
1. Vector(): 创建一个默认的 vector,其初始容量为 10。
2. Vector(int size): 创建一个其初始容量由 size 指定的向量。
3. Vector(int size, int incr): 创建一个其初始容量由 size 指定的向量,并且增量由 incr 指定。它指定每次向量被向上调整大小时要分配的元素数。
4. Vector(Collection c): 创建包含集合 c 的元素的向量。
Vector 类中的方法
方法 | 描述 |
---|---|
add(E e) | 将指定的元素添加到此Vector的末尾。 |
add(int index, E element) | 在此Vector中指定位置插入指定的元素。 |
addAll(Collection c) | 将指定Collection中的所有元素以它们被指定Collection的Iterator返回的顺序追加到此Vector的末尾。 addAll(int index, Collection c) | 将指定Collection中的所有元素插入到此Vector中指定的位置。 addElement(E obj) | 将指定的组件添加到此向量的末尾,其大小增加1。 capacity() | 返回此向量的当前容量。 clear() | 从此Vector中删除所有元素。 clone() | 返回此vector的一个克隆。 contains(Object o) | 如果此vector包含指定的元素,则返回true。 containsAll(Collection c) |
如果此Vector包含指定Collection中的所有元素,则返回true。 |
copyInto(Object[] anArray) | 将此Vector的组件复制到指定的数组中。 |
elementAt(int index) | 返回指定索引处的元素。 |
elements() | 返回此向量的组件的枚举。 |
ensureCapacity(int minCapacity) | 如果需要,增加此Vector的容量,以确保它至少可以容纳由最小容量参数指定的组件数。 |
equals(Object o) | 将指定的对象与此向量进行比较,以获得相等性。 |
firstElement() | 返回此向量的第一个组件(索引为0的项)。 |
forEach(Consumer action) | 对Iterable的每个元素执行给定的操作,直到所有元素都被处理完或操作抛出异常为止。 get(int index) | 返回此Vector中指定位置的元素。 hashCode() | 返回此Vector的哈希码值。 indexOf(Object o) | 返回此vector中指定元素的第一次出现的索引,如果此vector不包含元素,则返回-1。 indexOf(Object o, int index) | 返回在索引处向前搜索的指定元素在此vector中第一次出现的索引,如果未找到元素,则返回-1。 insertElementAt(E obj, int index) | 在指定索引处将指定的对象作为此Vector的一个组件插入。 isEmpty() | 测试此Vector是否没有组件。 iterator() | 以正确顺序返回此列表中的元素的迭代器。 lastElement() | 返回向量的最后一个组件。 lastIndexOf(Object o) | 返回此vector中指定元素的最后一次出现的索引,如果未找到元素,则返回-1。 lastIndexOf(Object o, int index) | 返回在从指定索引处向后搜索的元素的最后一次出现的索引,如果未找到元素,则返回-1。 remove(int index) | 删除此Vector中指定位置处的元素。 remove(Object o) | 删除此Vector中指定元素的第一个出现位置。 removeAll(Collection c) |
删除此Vector中包含在指定Collection中的所有元素。 |
removeElement(Object obj) | 从Vector中删除指定的组件。 |
removeElementAt(int index) | 删除此Vector中指定位置处的组件。 |
removeIf(Predicate filter) | 从此列表中删除满足给定谓词的所有元素。 retainAll(Collection c) |
保留此Vector中仅包含在指定Collection中的元素。 |
set(int index, E element) | 将此Vector中指定位置的元素设置为指定的元素。 |
setElementAt(E obj, int index) | 将位于指定索引处的向量组件设置为指定的对象。 |
setSize(int newSize) | 设置此Vector的大小。 |
size() | 返回此向量中的组件数。 |
sort(Comparator c) | 根据指定的Comparator对此列表进行排序。 spliterator() | 创建一个元素分隔器,可以遍历列表中的元素。 subList(int fromIndex, int toIndex) | 返回此列表中指定的fromIndex(含)和toIndex(不含)之间的部分视图。 toArray() | 将此Vector中的组件作为对象数组返回。 toArray(T[] a) | 将此Vector中的组件复制到指定的数组中。 toString() | 返回此Vector的字符串表示形式。 trimToSize() | 对此Vector的容量进行截断,使其等于向量的当前大小。 lastIndexOf(Object o, int index) | 返回此向量中指定元素最后一个出现的索引,从索引开始向后搜索,如果找不到元素,则返回-1。 listIterator() | 返回按正确顺序遍历此列表中所有元素的列表迭代器。 listIterator(int index) | 返回按正确顺序遍历此列表中所有元素的列表迭代器,从列表中指定的位置开始。 remove(int index) | 在此向量中删除指定位置的元素。 remove(Object o) | 从此向量中删除指定元素的第一个出现位置。 如果向量不包含该元素,则不做更改。 removeAll(Collection c) |
从此向量中删除包含在指定集合中的所有元素。 |
removeAllElements() | 删除此向量中的所有元素,并将其大小设置为零。 |
removeElement(Object obj) | 删除此向量中第一个(最低索引的)出现的参数。 |
removeElementAt(int index) | 删除指定索引处的组件。 |
removeIf(Predicate filter) | 删除满足给定谓词的此集合的所有元素。 removeRange(int fromIndex, int toIndex) | 删除此列表中索引在fromIndex(包括)和toIndex(排除)之间的所有元素。 replaceAll(UnaryOperator retainAll(Collection c) |
仅保留此向量中包含在指定集合中的元素。 |
set(int index, E element) | 将此向量中指定位置的元素替换为指定的元素。 |
setElementAt(E obj, int index) | 将此向量中指定索引的组件设置为指定的对象。 |
setSize(int newSize) | 设置此向量的大小。 |
size() | 返回此向量中的组件数。 |
sort(Comparator<? super E> c) | 根据指定比较器引起的顺序对此列表进行排序。 |
spliterator() | 创建一个后期绑定和快速失败的Spliterator,该Spliterator遍历此列表中的元素。 |
subList(int fromIndex, int toIndex) | 返回此列表在fromIndex(包括)和toIndex(排除)之间的部分的视图。 | toArray() | 以正确顺序包含此向量中所有元素的数组返回。 |
toArray(T[] a) | 以正确顺序包含此向量中所有元素的数组返回;返回数组的运行时类型是指定数组的类型。 |
toString() | 返回此向量的字符串表示形式,包含每个元素的字符串表示形式。 |
trimToSize() | 将此向量的容量调整为向量的当前大小。 |
首先让我们讨论和实现如何创建和使用一个 Vector,在探讨这个类的方法之前。
例子:
输出
注意:
- 如果未指定向量增量,则其容量将在每个增量周期中加倍。
- 向量的容量不能低于其大小,可以等于它。
在 Java 中执行 Vector 类的各种操作
让我们讨论 Vector 类的各种操作,如下所示:
- 添加元素
- 更新元素
- 删除元素
- 遍历元素
操作 1: 添加元素
为了在 Vector 中添加元素,我们使用 add() 方法。此方法针对不同参数基于多个重载进行多个操作。它们如下所示:
- add(Object): 此方法用于在 Vector 的末尾添加元素。
- add(int index, Object): 此方法用于在 Vector 中的特定索引处添加元素。
例子:
输出:
操作 2: 更新元素
添加元素后,如果我们希望更改元素,可以使用set()方法来实现。由于向量是有索引的,所以我们想要更改的元素是以元素的索引为参考的。因此,这个方法接受一个索引和要插入到该索引的更新元素。
例子
输出结果
操作3:删除元素
为了从向量中删除元素,我们可以使用remove()方法。根据不同的参数,此方法被重载以执行多个操作。它们是:
- remove(Object) :此方法用于从Vector中删除一个对象。如果存在多个这样的对象,则将删除第一个出现的对象。
- remove(int index) :由于向量是有索引的,这个方法接受一个整数值,仅删除向量中特定索引处存在的元素。在删除元素后,所有元素向左移动以填充空间,并更新对象的索引。
例子
输出结果:
操作4: 迭代向量
有多种方法可以遍历向量。最著名的方法是使用基本的for循环结合get()方法获取特定索引处的元素和高级for循环
例子
输出
在Java中,Vector类是Java集合框架的一部分,它提供了List接口的动态数组实现。Vector在Java的最初版本中添加(Java 1.0),并提供一些用于操作向量元素的方法,包括添加、插入和删除元素。
下面是一个简单的示例,演示如何在Java中使用向量:
输出
请注意,Vector类是同步的,这意味着多个线程可以访问同一个向量而不会引起问题。然而,这种同步会导致性能下降,因此如果您不需要在多个线程之间共享向量,则通常最好使用不同步的替代类,例如ArrayList。
Java中使用Vector的优点:
- 同步:如前所述,Vector是同步的,因此在多线程环境中使用它是安全的。
- 动态大小:向量的大小可以动态地增长或缩小,因此无需担心设置初始大小以容纳所有元素。
- 遗留支持:Vector自Java诞生以来一直是Java的一部分,并且仍在得到支持,因此如果您需要使用使用Vector的旧Java代码,它是一个不错的选择。
Java中使用Vector的缺点:
- 性能:Vector中的同步可能导致性能比其他集合类(例如ArrayList)慢。
- 遗留代码:尽管仍支持Vector,但较新的Java代码通常使用更现代的集合类编写,因此可能很难找到Vector的示例和支持。
- 不必要的开销:如果您不需要Vector的同步功能,使用它会为您的代码增加不必要的开销。