Java集合框架之Vector源码分析

news/2025/2/12 15:06:39/

文章目录

    • 简介
    • 为什么是线程安全的?
    • 扩容
    • 总结

简介

Java集合体系中的一个线性集合,底层原理其实和ArrayList基本一致。关于Vector问到的最多的面试题:ArrayList和Vector又什么区别?

通常的回答:

  • Vector是线程安全的
  • 扩容机制不同,ArrayList通常增长原本容量的0.5倍,vector增长1倍

本篇文章就通过这个面试题,结合Vector的源码验证一下

为什么是线程安全的?

通过翻看Vector的源码,发现Vector对外提供的对集合进行操作的函数都是通过synchronized关键字进行加锁的。这也就是为啥说Vector是线程安全的。

随便看几个函数:

    public synchronized boolean add(E e) {modCount++;add(e, elementData, elementCount);return true;}

    public synchronized boolean removeElement(Object obj) {modCount++;int i = indexOf(obj);if (i >= 0) {removeElementAt(i);return true;}return false;}

    public synchronized E set(int index, E element) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index);elementData[index] = element;return oldValue;}

    public synchronized E get(int index) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);return elementData(index);}

扩容

    private Object[] grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity, /* minimum growth */capacityIncrement > 0 ? capacityIncrement : oldCapacity/* preferred growth */);return elementData = Arrays.copyOf(elementData, newCapacity);}

观察源码可以发现,和ArrayList中的源码只有ArraysSupport.newLength的第三个参数不同,如果在构造Vector的时候没有指定capacityIncrement,则该值被初始化为0,那每一次第三个参数都将被传入oldCapacity

所以如果我所需要的最小增量小于原容量,按照一倍扩容;否则按照申请的大小扩容,但是不能超过SOFT_MAX_ARRAY_LENGTH

这里的细节不再追究,以后遇到再说吧,因为Vector本身也用的很少。

总结

相较于ArrayList,Vector通过对方法进行加锁的方式实现了线程安全,所以性能会有所下降,但是是基于不同场景下的,所以这样比较也没啥意义。

总之,应该在合适的场景下选择合适的数据结构,避免频繁的扩容有利于提升程序的运行时性能。


http://www.ppmy.cn/news/1157869.html

相关文章

c语言从入门到实战——C语言数据类型和变量

C语言数据类型和变量 前言1. 数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&…

linux之shell脚本练习

以下脚本已经是在ubuntu下测试的 demo持续更新中。。。 1、for 循环测试,,,Ping 局域网 #!/bin/bashi1 for i in {1..254} do# 每隔0.3s Ping 一次,每次超时时间3s,Ping的结果直接废弃ping-w 3 -i 0.3 192.168.110.$i…

day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能

1 注册功能 补充(开放文件夹内) 2 前端登录注册页面复制 4 前端注册功能 1 注册功能 # 分析前端:携带数据格式 {mobile:,code:,password}后端:-1 视图类---》注册方法-2 序列化类---》校验,保存(表中字段多,传的少---…

BIM轻量化技术简介

BIM轻量化技术是指在工程建筑的BIM模型建立之后(利用专业的BIM建模软件,比如Autodesk Revit, Bentley MicroStation, DS Catia等),通过对BIM模型的压缩处理等技术手段,让BIM可以在各类WEB浏览器、移动App上被使用的技术…

LeetCode 260. 只出现一次的数字 III:异或

【LetMeFly】260.只出现一次的数字 III 力扣题目链接:https://leetcode.cn/problems/single-number-iii/ 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返…

【环境搭建】linux docker安装nexus3

1、shell输入 docker run -dti \--nethost \--namenexus3 \--privilegedtrue \--restartalways \--ulimit nofile655350 \--ulimit memlock-1 \--memory1G \--memory-swap-1 \-e INSTALL4J_ADD_VM_PARAMS"-Xms512m -Xmx512m -XX:MaxDirectMemorySize1g" \-v /etc/lo…

MyBatisPlus(十九)自动填充

说明 自动填充指的是,当数据被 插入 或者 更新 的时候,会为指定字段进行一些默认的数据填充。 比如,插入时,会自动填充数据的创建时间和更新时间;更新时,会自动填充数据的更新时间。 实现方式 配置处理器…

design compiler之设计环境

design compiler之设计环境 设计环境是什么?设计环境的具体形式操作条件在深亚微米工艺下的一些特殊情况系统接口特性写在最后 设计环境是什么? 在综合之前我们需要定义实际设计所处的环境,从结果导向的角度来讲,设计环境定义的越…