java基础提升之Vector

        上一篇中咱们介绍了ArrayList。其实在ArrayList的源码注释中就明确的指出了ArrayList这个类大体的等于Vector除了ArrayList是不一样步的。那么如今趁热打铁,咱们开始学习一下Vector。 java

结构分析

RandomAccess

        这个Vector一样也实现了RandomAccess这个标记类,同ArrayList同样,表明可以高效的实现随机访问。数组

存储结构

同上篇同样,咱们也是先来看看Vector的属性 安全

能够看到,属性相比ArrayList的少了,那如今咱们来看看这几个东西是干啥的。dom

  1. elementData: 这个elementData的做用跟ArrayList中的同样,都是用来存储元素的,这个数组的长度也就是这个Vector的容量。
  2. elementCount: 这个和ArrayList中的size差很少都是用来记录存储元素的数量的,好比如今Vector中有2个元素,这个elemetnCount=2;
  3. capacityIncrement: 这个属性就有点意思了,咱们能够发现ArrayList中没有跟这个相似的东西,其实在我我的认为这也是一个Vector与ArrayList之间的一个不一样点。 那这个属性是用来干啥的呢? 从名字咱们能够猜出大概,容量增量,其实就是扩容的时候用来定义扩容多少的,咱们会在下面扩容的内容中详细解说。

很简单,属性就上面那三个。咱们能够发现Vector的底层存储结构就是一个数组性能

基本方法

        对于Vector的基本方法,不作太多介绍,其实就是对数组的操做,主要,对于数组的移位操做使用的System.arraycopy来完成,还有一个特色相比较ArrayList来讲就是他的许多方法都有一个关键字synchronized。这就是为何说Vector是同步的缘由。咱们看一下下面的图来体会一下: 学习

subList

咱们重点说一下subList方法,同时也是对ArrayList的一个补充。spa

subList返回的List是基于这个Vector或者ArrayList的的,也就是说,对subList返回的List进行的操做的结果最后会反映到源Vector或ArrayList上的,咱们用代码来体会一下:线程

public class TestMain {
    public static void main(String[] args){
        System.out.println("===============ArrayList=================");
        List<String> list = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5"));
        List<String> subList = list.subList(0,2);
        subList.add("我是subList插入的");
        list.forEach(value ->System.out.print(value+" ,") );
        System.out.println();
        System.out.println("===============Vector==================");
        Vector<String> vector = new Vector<>(Arrays.asList("1", "2", "3", "4", "5"));
        List<String> subVector = vector.subList(0,2);
        subVector.add("我是subVector插入的");
        vector.forEach(value ->System.out.print(value+" ,"));
    }
}
复制代码

运行结果以下:3d

扩容机制

有上一节的铺垫,咱们不作太多无用的的查看,直接看扩容的核心代码:code

这就是Vector扩容的核心代码,看到与ArrayList的大同小异,不过这里确实多了一个这个东西,

在计算新的容量的时候,看了capacityIncrement的值是否是大于0,这个就是咱们所说Vector与ArrayList扩容的不一样处了,Vector能够自定义增加系数,控制须要扩容时增加的容量大小。当没有指定时默认增加为原来的两倍,与ArrayList同样,因为数组不能动态增大,因此是使用Arrays.copyOf从新生成了一个数组。

总结

  1. Vector内部使用数组存储元素,因为在方法时加了synchronized,因此性能比ArrayList低,可是是线程安全的。
  2. Vector扩容机制与ArrayList有些不一样,不一样之处在于Vector能够指定增加系数capacityIncrement,当不指定这个增加系数或者capacityIncrement为0的状况下默认扩容为原来的两倍。
相关文章
相关标签/搜索