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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券