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 中的所有元素插入到此向量中。 |
|
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, 返回此向量中第一次出现的指定元素的索引,从 index 处正向搜索,如果未找到该元素,则返回 -1。 |
|
void |
insertElementAt(E obj, 将指定对象作为此向量中的组件插入到指定的 index 处。 |
|
boolean |
isEmpty() 测试此向量是否不包含组件。 |
|
E |
lastElement() 返回此向量的最后一个组件。 |
|
int |
lastIndexOf(Object o) 返回此向量中最后一次出现的指定元素的索引;如果此向量不包含该元素,则返回 -1。 |
|
int |
lastIndexOf(Object o, 返回此向量中最后一次出现的指定元素的索引,从 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 |
removeRange(int fromIndex, 从此 List 中移除其索引位于 fromIndex(包括)与 toIndex(不包括)之间的所有元素。 |
|
boolean |
retainAll(Collection<?> c) 在此向量中仅保留包含在指定 Collection 中的元素。 |
|
E |
set(int index, E element) 用指定的元素替换此向量中指定位置处的元素。 |
|
void |
setElementAt(E obj, 将此向量指定 index 处的组件设置为指定的对象。 |
|
void |
setSize(int newSize) 设置此向量的大小。 |
|
int |
size() 返回此向量中的组件数。 |
|
List<E> |
subList(int fromIndex, 返回此 List 的部分视图,元素范围为从 fromIndex(包括)到 toIndex(不包括)。 |
|
Object[] |
toArray() 返回一个数组,包含此向量中以恰当顺序存放的所有元素。 |
|
|
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浅析的更多相关文章
- Java集合框架之TreeMap浅析
Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:
- Java集合框架之HashMap浅析
Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...
- Java集合框架之TreeSet浅析
Java集合框架之TreeSet浅析 一.TreeSet综述: 1.1TreeSet简介: TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧: public ...
- Java集合框架之HashSet浅析
Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
- Java集合框架之ArrayList浅析
Java集合框架之ArrayList浅析 一.ArrayList综述: 位于java.util包下的ArrayList是java集合框架的重要成员,它就是传说中的动态数组,用MSDN中的说法,就是Ar ...
- Java集合框架之Set接口浅析
Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...
- Java集合框架之List接口浅析
Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
随机推荐
- mac 下搭建安装 sass
一.安装系统需要的包 安装Xcode开发工具,它将帮你安装好 Unix 环境需要的开发包 打开 App Store,搜索 Xcode,第一个就是,对了,有4个多G,网速如果不大好,就请先厕所哭会儿吧, ...
- docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成
环境 Centos7.6 安装应用docker,docker-compose (我的Centos是用Hyper-V跑的分了8G的内存,阿里云2G根本跑不起来gitlab) 为了保证我的Centos环境 ...
- java读写文件小心缓存数组
一般我们读写文件的时候都是这么写的,看着没问题哈. public static void main(String[] args) throws Exception { FileInputStr ...
- Java类方法重载与重写
目录 - 方法重载 - 方法重写 @(Java类方法重载与重写) - 方法重载 1.方法名相同 2.参数列表不同 public void person(double height,double wei ...
- .net持续集成sonarqube篇之 sonarqube与jenkins集成(命令模式)
系列目录 Sonarqube结合Jenkins与常见问题 我们引入sonarqube组件的最终目的是要为整个Ci环境服务的,如果不能集成于当前的Jenkins CI,那么我们做的很多关于sonarqu ...
- 在WPF中嵌入WebBrowser可视化页面
无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrow ...
- 【eclipse】No enclosing instance of type A is accessible. Must qualify the allocation with an enclosing instance of type A
用 eclipse 写 Java 代码时出现了这个问题,详细如下: No enclosing instance of type TestParsingLinkedList is accessible. ...
- 传输层的TCP和UDP协议
作者:HerryLo 原文永久链接: https://github.com/AttemptWeb... TCP/IP协议, 你一定常常听到,其中TCP(Transmission Control Pro ...
- Day01:JAVA开发环境
下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,点 ...
- Python机器学习·微教程
Python目前是机器学习领域增长最快速的编程语言之一. 该教程共分为11小节.在这个教程里,你将学会: 如何处理数据集,并构建精确的预测模型 使用Python完成真实的机器学习项目 这是一个非常简洁 ...