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实现原理(源码剖析)

相关文章
|
4月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
91 2
|
28天前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
2月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
89 1
|
2月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
83 1
|
3月前
|
缓存 Java Maven
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
如何解决Java项目中因JDK版本不匹配导致的编译错误,包括修改`pom.xml`文件、调整项目结构、设置Maven和JDK版本,以及清理缓存和重启IDEA。
66 1
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
44 0
[Java]代理模式
|
3月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
83 10
|
4月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
3月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
32 1
|
3月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
43 1