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

目录
  • 前言
  • 构造方法Vector()分析
  • 构造方法Vector(int)分析
  • 构造方法Vecotor(int,int)分析
  • 构造方法Vector(Collection)分析
  • 重要字段介绍(不含基类中定义的字段)

(注意:本文基于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源码分析的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java 构造器原理及用法解析

    导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直接的. 当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例.Java 中与构造器 constructor有关的最常见问题之一是:它们是什么,它们的作用是什么? 简而言之:构造器是在 Java 中创建新对象object时执行的操作.当 Java 应用程序创建一个你编写的类的实例时,它将检

  • 简单了解JAVA构造方法

    怎么写 java构造方法必须满足以下语法规则: (1) 方法名必须与类名相同. (2)不要声明返回类型. (3)不能被static.final.synchronized.abstract和native修饰.构造方法不能被子类继承,所以用final和abstract修饰没有意义. 构造方法用于初始化一个新建的对象,所以用static修饰没有意义.多个线程不会同时创建内存地址相同的同一个对象,因此用synchronized修饰没有必要. 此外,Java语言不支持native类型的构造方法. 例: p

  • Java8方法引用及构造方法引用原理实例解析

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言Java也可以写出优雅的函数式调用,学习的过程并不复杂,当你学会了Java8中函数式编程的新特性,你一定会对他爱不释手的.下面介绍一下基于Lambda表达式简写的两种引用.避免再次看到这种代码时的尴尬

  • 浅谈 java中ArrayList、Vector、LinkedList的区别联系

    以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木有办法啊委屈 现在得去说说这三者之间的区别与联系了:这三者都是实现了List接口,都拥有List接口里面定义的方法,并且同时拥有Collection接口的方法: ArrayList:采用的是数组的方式进行存储数据的,查询和修改速度快,但是增加和删除速度慢:线程是不同步 LinkedList:采用的是链

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

    目录 前言 构造方法Vector()分析 构造方法Vector(int)分析 构造方法Vecotor(int,int)分析 构造方法Vector(Collection)分析 重要字段介绍(不含基类中定义的字段) (注意:本文基于JDK1.8) 前言 Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法 构造方法Vector()分析 public Vector() { this(10); } 用于创建Vector对象的默认

  • 基于java构造方法Vevtor添加元素源码分析

    目录 前言 add(E)方法分析 add(int,E)方法分析 insertElementAt()方法分析 addElement()方法分析 addAll()方法分析 addAll(int,Collection)方法分析 ListItr中的add()方法分析 总结 (注意:本文基于JDK1.8) 前言 算上迭代器的add()方法,Vector中一共有7个添加元素的方法,5个添加单个元素的方法,2个添加多个元素的方法,接下来就一起分析它们的实现--Vector是一个线程安全的容器类,它的添加功能是

  • 基于java构造方法Vector查找元素源码分析

    目录 前言 get(int)方法分析 contains(Object)方法分析 containsAll()方法分析 indexOf(Object)方法分析 indexOf(Object,index)方法分析 lastIndexOf(Object)方法分析 elementAt(int)方法分析 firstElement()方法分析 lastElement()方法分析 elementData(int)方法分析 总结 (注意:本文基于JDK1.8) 前言 元素在存储到内存中,当我们需要使用在内存中存储

  • 基于java构造方法Vector修改元素源码分析

    目录 前言 set(int,E)方法分析 setElementAt(E,int)方法分析 总结 (注意:本文基于JDK1.8) 前言 增删改查,修改元素,Vector提供了3个方法,包括迭代器中的一个,不过本文只分析Vector自身的两个修改元素的方法,迭代器中的方法将单独分析 set(int,E)方法分析 public synchronized E set(int index, E element) { if (index >= elementCount) throw new ArrayInd

  • 基于java构造方法Vector删除元素源码分析

    目录 前言 remove(int)方法分析 remove(Object)方法分析 removeElement(Object)方法分析 removeElementAt(int)方法分析 removeIf()方法分析 removeAllElement()方法分析 removeAll(Collection)方法分析 父类中的removeAll(Collection)方法分析 retainAll(Collection)方法分析 总结 (注意:本文基于JDK1.8) 前言 包括迭代器中的remove()方

  • 基于java构造方法Vector遍历元素源码分析

    (注意:本文基于JDK1.8) 前言 任何一个容器类对象用于持有元素后,总是需要遍历元素的,即挨个去访问每个元素1次,而遍历元素,除了常规的依赖于数组对象的下标之外,更常用的是封装好的迭代器,今天就来学习Vector中的迭代器是如何设计的,与迭代器相关的方法有: iterator() listIterator() listIterator(int index) 3个Vector中的定义的方法,均会返回一个迭代器对象--简单说说这3个方法的来历 iterator()方法的来历 iterator()

  • Java编程中ArrayList源码分析

    之前看过一句话,说的特别好.有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平. 是的,大家都实现一个功能,不同的人有不同的设计思路,有的人用一万行代码,有的人用五千行.有的人代码运行需要的几十秒,有的人只需要的几秒..下面进入正题了. 本文的主要内容: · 详细注释了ArrayList的实现,基于JDK 1.8 . ·迭代器SubList部分未详细解释,会放到其他源码解读里面.此处重点关注ArrayList本身实现. ·没有采用标准的注释,并适当调整了代码的缩进以方便介

  • JAVA 枚举单例模式及源码分析的实例详解

    JAVA 枚举单例模式及源码分析的实例详解 单例模式的实现有很多种,网上也分析了如今实现单利模式最好用枚举,好处不外乎三点: 1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击但是貌似没有一篇文章解释ENUM单例如何实现了上述三点,请高手解释一下这三点: 关于第一点线程安全,从反编译后的类源码中可以看出也是通过类加载机制保证的,应该是这样吧(解决) 关于第二点序列化问题,有一篇文章说枚举类自己实现了readResolve()方法,所以抗序列化,这个方法是当前类自己实现的(解决) 关于

  • java 中RandomAccess接口源码分析

    java 中RandomAccess接口源码分析 RandomAccess是一个接口,位于java.util包中. 这个接口的作用注释写的很清楚了: /** * Marker interface used by <tt>List</tt> implementations to indicate that * they support fast (generally constant time) random access. The primary * purpose of this

  • Java线程变量ThreadLocal源码分析

    1.ThreadLocal 线程变量,和当前线程绑定的,只保存当前线程的变量,对于其他线程是隔离的,是访问不到里面的数据的. 2.在Looper中使用到了ThreadLocal,创建了一个Looper是保存到了ThreadLocal中. //这里用到了泛型,ThreadLocal中只保存Looper对象. static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); private static

随机推荐