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

相关文章
|
3月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
269 100
|
3月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
302 101
|
2月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
108 7
|
3月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
3月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
1367 1
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
378 0
|
3月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
547 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
483 0

热门文章

最新文章