Java集合源码剖析——基于JDK1.8中Vector的实现原理

简介: Java集合源码剖析——基于JDK1.8中Vector的实现原理

文章目录:


1.Vector中的属性

2.Vector中的方法

2.1 构造方法

2.2 grow方法

2.3 其他方法


1.Vector中的属性


Vector中的属性其实跟ArrayList时差不多的,就比ArrayList多了一个 protected int capacityIncrement;  这个属性是在扩容的时候用到的,它表示每次扩容只扩 capacityIncrement 个空间就足够了。

//存放元素的数组,从这可以发现 Vector 的底层实现就是一个 Object 数组
//与ArrayList是一样的
protected Object[] elementData;
//数组中包含元素的个数
protected int elementCount;
//扩容空间的大小
protected int capacityIncrement;
//数组的最大上限
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

·       Vector集合底层采用的是Object类型的数组 Object[]

·       Vector集合中大部分方法都带有synchronized关键字,所以是线程安全的,但是效率较低。

·       Vector集合初始化容量是10,扩容机制默认是当前数组大小的2倍;其他情况为当前数组大小 + 指定扩容大小。

·       Vector集合中存储元素的特点:有序可重复,元素带有下标,从0开始,以1递增。

2.Vector中的方法


Vector中的方法其实大多数跟ArrayList是一样的,不同的就是某些方法相比于ArrayList添加了synchronized关键字,实现了线程安全。

所以这里有些方法就不再说了,主要说一下Vector构造方法、扩容的grow方法。


2.1 构造方法

 源码中可以看出,Vector的默认初始大小和ArrayList一样都是10,但是Vector在初始化的时候,通过下面三个构造方法的调用,就已经创建好了指定长度的Object[] 数组。

反观ArrayList的构造方法:👇👇👇

  public ArrayList() {
     this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
 }

在初始化时并未创建指定大小的数组,只是为我们创建了一个空数组而已。

在初始化创建数组这块,ArrayListVector还是不太一样的。

public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}
public Vector() {
    this(10);
}

2.2 grow方法

grow 方法中我们可以发现,当我们初始化创建Vector数组时,capacityIncrement变量的值肯定为0,所以newCapacity 默认情况下等于 oldCapacity + oldCapacity ,也就是是两倍的 oldCapacity;而当指定了 capacityIncrement 的值之后,newCapacity 变成了 oldCapacity + capacityIncrement

等于说,默认情况下,Vector的扩容机制是当前数组大小的2倍;当指定了扩容大小之后,扩容机制变为当前数组大小 + 指定扩容大小。

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

2.3 其他方法

其他也有很多常用的方法,例如:getaddsetremove等等,这些方法和ArrayList没啥两样,就是方法前面加上了synchronized关键字,实现了线程安全。

关于这些方法的源码分析,可以参考这篇文章:ArrayList实现原理(源码剖析)

相关文章
|
2天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
3天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
9 0
|
3天前
|
Java
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
|
3天前
|
Java API
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
|
3天前
|
Java
【JAVA进阶篇教学】第二篇:JDK8中Lambda表达式
【JAVA进阶篇教学】第二篇:JDK8中Lambda表达式
|
3天前
|
Java API
【JAVA进阶篇教学】第一篇:JDK8介绍
【JAVA进阶篇教学】第一篇:JDK8介绍
|
4天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
16 0
|
4天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
4天前
|
Java 云计算
Java智能区域医院云HIS系统SaaS源码
云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和谐的基层医患关系。
18 2
|
4天前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
13 3