基于java构造方法Vector创建对象源码分析

 更新时间:2021年09月09日 17:38:58   作者:叫我王员外就行  
这篇文章主要介绍了java构造函数中对Vector源码及原理的分析,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家早日升职加薪

(注意:本文基于JDK1.8) 

前言

Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法

构造方法Vector()分析

    public Vector() {
        this(10);
    }

用于创建Vector对象的默认构造方法,此构造方法的内部会将数字10传入到1个参数的构造方法中,数字10代表的是Vector对象持有的底层数组对象的容量

构造方法Vector(int)分析

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

创建Vector对象时可以指定底层数组的容量,传入的int参数表示数组容量,该构造方法的内部会将传入的initialCapacity和一个数字0,又传入到2个参数的构造方法中,这个数字0代表什么呢?继续往下看……

构造方法Vecotor(int,int)分析

    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

创建Vector对象的构造方法,可以指定数组默认容量、指定数组的增量值,传入的参数initialCapacity表示数组默认容量,传入的参数capacityIncrement即表示增量

1、首先调用基类的无参构造方法(子类必须至少调用一个基类的构造方法)

2、检查数组的初始化容量值

如果initialCapacity小于0,则抛出一个IllegalArgumentException对象,IllegalArgumentException对象接受一个字符串对象,这个字符串对象会告知我们发生异常的原因

3、创建一个Object数组对象(容量为initialCapacity值),由Vector对象持有的实例变量elementData负责保存该对象的引用,这个elementData保存的数组对象,就是Vector实现存储元素的底层数组对象

4、为Vector对象持有的实例变量capacityIncrement进行赋值,为其赋的值是传入的局部变量capacityIncrement

这个capacityIncrement有什么用途呢?原来这个值表示数组扩充容量时的增量,比如现有数组的容量为10,如果扩充增量为5,则下次扩充的容量为15

构造方法Vector(Collection)分析

    public Vector(Collection<? extends E> c) {
        elementData = c.toArray();
        elementCount = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

用于创建Vector对象的构造方法,传入的Collection对象持有的元素类型必须是类型参数E或者类型参数E的子类,说明必须与当前Vector对象持有的元素类型保持一致

1、首先将Collection对象转换为数组对象,toArray()方法返回的Object数组对象由Vector对象持有的elementData负责保存

2、取出elementData持有的数组对象的长度赋值给Vector对象持有的elementCount

3、当elementData对象的类型不是Object数组对象,则通过Arrays.copyof方法做一次复制与转换,仍然把转换后的Object数组对象由Vector对象持有的elementData负责保存

重要字段介绍(不含基类中定义的字段)

3个实例变量,创建对象时进行初始化

capacityIncrement:表示Vector对象持有的数组进行扩容时的增量

elementCount:表示Vector对象持有实际元素总数

elementData:表示Vector对象持有的数组对象,该数组实际负责持有元素

2个静态变量,类加载时进行初始化

MAX_ARRAY_SIZE:整型常量,存储了int最大值-8的一个值

serialVersionUID:long类型常量,用于Vector对象序列化。在不同的JDK版本中区分是否为同一个Vector类

以上就是对于java中Vector源码原理分析的详细内容,更多关于java中Vector源码分析的资料请关注脚本之家其它相关文章!

相关文章

  • Java的常用包

    Java的常用包

    本文主要对Java的常用包进行一一介绍。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 深入探究Java线程的创建与构造方法

    深入探究Java线程的创建与构造方法

    这篇文章主要给大家分享的是java线程的创建以及构造方法,想了解具体方式的小伙伴可以参考下面文章内容,希望对你有所帮助
    2022-04-04
  • Myeclipse工程发布时端口占用问题的解决方法

    Myeclipse工程发布时端口占用问题的解决方法

    这篇文章主要介绍了Myeclipse工程发布时端口占用问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 基于SpringBoot制作一个PDF切图小工具

    基于SpringBoot制作一个PDF切图小工具

    这篇文章主要为大家详细介绍了如何基于SpringBoot制作一个PDF切图小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 详解Spring的StringUtils踩坑记录

    详解Spring的StringUtils踩坑记录

    这篇文章主要介绍了详解Spring的StringUtils踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 深入分析Comparable与Comparator及Clonable三个Java接口

    深入分析Comparable与Comparator及Clonable三个Java接口

    接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义,这篇文章主要为大家详细介绍了Java的Comparable,Comparator和Cloneable的接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-05-05
  • Java开发必会的Linux命令

    Java开发必会的Linux命令

    这篇文章主要介绍了Java开发必会的Linux命令,帮助大家更好地进行java开发,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • java之使用多线程代替for循环(解决主线程提前结束问题)

    java之使用多线程代替for循环(解决主线程提前结束问题)

    这篇文章主要介绍了java之使用多线程代替for循环(解决主线程提前结束问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java实现周期性执行(定时任务)

    java实现周期性执行(定时任务)

    这篇文章主要为大家详细介绍了java实现周期性执行定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • FeignClient实现接口调用方式(不同参数形式)

    FeignClient实现接口调用方式(不同参数形式)

    这篇文章主要介绍了FeignClient实现接口调用方式(不同参数形式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论