专栏首页吉林乌拉Vector源码解析

Vector源码解析

在之前的文章中本人已经介绍过了ArrayList底层是通过数组的方式实现的,在Java的集合类中,除了ArrayList外,还有一些其它的集合类它们底层也是采用数组的方式实现的,例如Vector集合类。那它们在使用上或者说在底层的实现方式上有何不同的呢?接下来我们将详细来分析一下Vector集合的相关知识。

因为大部分的知识点已经在ArrayList这篇文章中介绍过了,所以这里我们就不在做详细说明了,而是直接来分析Vector的底层源码,来对比一下Vector集合与ArrayList集合在底层有何不同。我们还是和ArrayList集合一样还是先看一下Vector集合的初始化,也就是构造方法。

  • 初始化

虽然上面是3个不同的构造方法,但是我们通过方法的调用关系就可得知,如果我们使用无参的构造方法来创建Vector对象时,那么上述的3个方法都会依次执行。并且我们知道上述方法中最核心的方法也就是给数组初始化的代码就是第3个构造方法。因为我们已经分析过了ArrayList中的源码,所以我们可以很容易得出以下结论:

  • Vector集合和ArrayList一样当集合第一次执行默认初始化时,会将底层数组的大小设置为10
  • Vector集合与ArrayList不同的地方就是ArrayList集合当我们使用无参构造方法创建对象时,并不会为数组执行默认初始化,第一次默认初始化动作发生在ArrayList集合第一次调用add()方法的时候。而在Vector集合中,当我们使用无参构造方法创建对象时,则会立即执行默认初始化。

下面我们分析一下Vector集合的add()方法的实现逻辑。

  • 动态分配

上述的代码貌似我们很眼熟啊有没有,没错上述的代码逻辑,其实和ArrayList源码逻辑几乎一样。唯一的区别就是Vector集合和ArrayList集合的动态分配方式不一样 。在ArrayList那篇文章中,我们已经知道了,当底层数组已经达到最大容量时,会自动创建一个比原数组大1.5倍的数组。那么在上述代码中我们发现,Vector集合的底层扩展规律是会创建一个是原数组2倍的数组来存储元素。这也就是Vector集合与ArrayList集合的区别之一。既然是区别之一,那么就一定还有其它的区别,我们发现在add()方法中添加了synchronized同步关键字,这就说明Vector集合是一个线程安全的集合类,这也是与ArrayList集合的区别之一,因为ArrayList集合并不是一个线程安全的集合类。

  • 注意事项

因为Vector集合底层也是采用数组的方式实现的,所以它的弊端基本和ArrayList集合一样 ,这里就不在做过多的介绍了。但有一点要注意,因为Vector集合是线程安全的集合类,所以我们在开发多线程时,可以直接使用而无需要添加额外的同步的代码,就可保证线程的安全。但是,如果我们开发时不是在多线程环境中运行的,如果我们继续使用Vector集合时,就会造成我们程序的性能降低,这是因为Vector集合底层使用了ynchronized同步关键字,所以每次执行add()方法时,都有频繁的执行获取锁和释放锁操作,这样就会在无形之中,影响程序的性能。所以,我们在日常的开发中,如果不是在多线程环境中使用List集合的话,那么我们推荐使用ArrayList或LinkedList集合,因为它们不是线程安全的集合类,所以也就不会频繁的执行获取锁和释放锁操作,所以相比Vector集合,程序的运行效率较高。

本文分享自微信公众号 - 吉林乌拉(jilinwulacom),作者:吉林乌拉

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LinkedHashSet源码解析

    在上一篇中我们介绍了LinkedHashMap集合的底层实现,并了解了LinkedHashMap底层是通过HashMap集合实现的。所以LinkedHashMa...

    吉林乌拉
  • Stack源码解

    在前两篇我们已经介绍了两种底层是通过数组方式实现的集合类,它们分别是ArrayList集合和Vector集合。在这一篇中我们继续介绍另一种底层也是用数据方式实现...

    吉林乌拉
  • TreeSet源码解析

    在这一篇中我们主要分享一下TreeSet集合的相关知识。在上一篇中我们介绍了HashSet集合的底层实现,并且发现HashSet底层是通过HashMap集合实现...

    吉林乌拉
  • Java集合框架(三)—— List、ArrayList、Vector、Stack

    List接口 List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引。List集合容许使用重复元素,可以通过索引来访问指定位置的集合对象。 ...

    郭耀华
  • Python_实用入门篇_12

    具有某种特定性质的事物的总体,集合里的东西叫作元素。Python中,集合(set)是一个无序不重复元素的序列。

    py3study
  • Java SE | 每日作业卷day15

    自定义一个学生类,给出成员变量name和age,使用HashSet集合存储自定义对象并遍历,遍历集合的时候,在控制台输出学生对象的成员变量值。要求使用两种方式进...

    剑走天涯
  • 2020年了 你还不懂ospf的虚链路吗?

    虚链路(virtual link)是指一条通过一个非骨干区域连接到骨干区域的链路。虚链路主要应用于以下几种目的:

    不吃小白菜
  • 4.93Python数据类型之(8)集合

    py3study
  • 《Redis设计与实现》读书笔记(九) ——Redis集合和有序集合实现原理

    《Redis设计与实现》读书笔记(九) ——Redis集合和有序集合实现原理 (原创内容,转载请注明来源,谢谢) 一、集合 集合的编码方式有intset和has...

    用户1327360
  • NLP入门之形式语言与自动机学习(一)

    第一篇:集合与推理方法 1:我们为什么要学习形式语言与自动机 任何一门科学都有其自身的理论基础,计算机科学也是这样.大家现在看看计算机的技术变化的很快,现在我们...

    云时之间

扫码关注云+社区

领取腾讯云代金券