Vector源码解析

(1)构造方法

Vector的构造方法一共有四个,因为四个都比较重要,所以在这里就给出四个

第一个: 创建一个空的Vector,并且指定了Vector的初始容量为10

 第二个:创建一个空的Vector,并且指定了Vector的初始容量

 第三个:创建一个空的Vector,并且指定了Vector的初始容量和扩容时的增长系数

 第四个:根据其他集合来创建一个非空的Vector

 第四个需要解释一下,首先是把其他集合转化为数组,然后复制粘贴到Vector里面。

(2)增加元素

增加元素有两个主要的方法,第一个是在Vector尾部追加,第二个是在指定位置插入元素。

第一个:在Vector尾部追加元素

 我们再进来看一下ensureCapacityHelper(elementCount + 1)是如何实现的。

 现在相当于真正扩容的方法是grow方法,别着急我们再进来看看。

 在这一步我们扩容的时候首先就要排除一些异常的情况,首先就是capacityIncrement(需要增加的数量)是否大于0,如果大于0直接增加这么多。然后发现增加了上面那些还不够那就扩充为实际需要minCapacity的大小。最后发现还不够,就只能扩充到虚拟机能表示的数字最大值了。

第二个:在指定位置增加元素

这个就比较简单了。我们直接看源码就能看明白

(3)删除元素

删除元素时候同样也有两种方法,第一个根据元素值来删除,第二个根据下表来删除元素。

第一个:根据元素值来删除元素

 

 我们发现删除元素其实是调用了removeElement()方法来删除元素的,没关系不要嫌麻烦,进入这个方法内部看一下。

 

 到了这一步,我们又发现,执行删除操作的还不是removeElement()方法,而是removeElementAt(i),我们再进入这个方法看看。

到了这个方法我们其实可以分析一下,要删除元素要移动大量的元素,时间效率肯定是不好的。毕竟Vector是通过数组来实现的,而不是通过链表。

第二个:删除指定位置的元素

删除指定位置的元素就比较简单了,我们到指定的位置进行删除就好了,但是同样需要把后面的元素进行移位。

(3)更改元素

更改元素我们就先看一个吧。这个在大部分场景下一般不用(大部分,根据自己业务来定)。

 

(4)查找元素

查找元素我们给出三个,第一个查询Vector容器中是否包含某个元素,第二个查询第一次出现的指定元素的索引,第三个最后一次出现的指定元素的索引。

第一个:查询Vector容器中是否包含某个元素

 

 第二个:查询第一次出现的指定元素的索引

第三个:查询最后一次出现的指定元素的索引

1)线程安全:

从上面的构造方法还有增删改查的操作其实我们都发现了,都有这么一个synchronized关键字,就是这个关键字为Vector容器提供了一个安全机制,保证了线程安全。

2)构造方法:

Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;使用默认构造函数,默认容量大小是10。

3)增加元素:

当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 大于0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。

4)克隆:

Vector的克隆函数,即是将全部元素克隆到一个数组中。

(5)遍历

不过到这可还没结束,还有重要的一点我们还没说,那就是遍历。其实在我之前的文章介绍ArrayList时候已经提到过了,遍历方式也就那么几种,既然Vector是基于数组实现的,那么遍历方式肯定也是随机访问最快。在这里代码演示几个:

 

三、Vector与其他容器的区别

源码看完了,对于Vector的实现,我相信你也基本上明白其内部实现了,下面就看看他和别的容器的区别,在文章一开始我们就提到了Vector其实基本上和ArrayList一样的,下面对比分下一下:

ArrayList是线程非安全的,这很明显,因为ArrayList中所有的方法都不是同步的,在并发下一定会出现线程安全问题。另一个方法就是Vector,它是ArrayList的线程安全版本,其实现90%和ArrayList都完全一样,区别在于:

1、Vector是线程安全的,ArrayList是线程非安全的

2、Vector可以指定增长因子,如果该增长因子指定了,那么扩容的时候会每次新的数组大小会在原数组的大小基础上加上增长因子;如果不指定增长因子,那么就给原数组大小*2,源代码是这样的:

 

posted on 2022-06-17 22:35  情陌人灬已不在  阅读(273)  评论(0编辑  收藏  举报

导航