当前位置: 首页 > news >正文

Vector底层结构和源码分析

Vector的基本介绍

1.Vector类的定义说明

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

2)Vector底层也是一个对象数组,protected Objectl] elementData;

3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

4)在开发中,需要线程同步安全时,考虑使用Vector

通过上面的Vector类我们可以看到Vector实现了很多接口,实现了List接口,还实现了Serializable接口,就代表可串行化,数据可以在网络上传输

Vector源码分析

我们先来看看Vector的扩容机制的结果是什么吧

结论

1.如果使用的是无参构造器,默认是10,第二次就按照两倍进行扩容

2.如果使用的是有参构造器,则就按照我们指定的大小,两倍扩容

源码分析:

//源码分析
//1. new Vector() 底层
/*public Vector() {//即使你没有指定大小会默认给你一个10,最后调用的还是有参构造器this(10);}
    所以即使开始使用的是无参构造器,但是因为默认给了10所以,所以最后走的还是带参数的构造器,也就是这个public Vector(int initialCapacity) {this(initialCapacity, 0);}补充:如果是  Vector vector = new Vector(8); 也就是使用有参构造器使用的方法就是:public Vector(int initialCapacity) {this(initialCapacity, 0);}2. vector.add(i)2.1  //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {//该变量记录集合被修改的次数modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2  //确定是否需要扩容 条件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious code//意识就是 当前的最小容量-你需要的容量 如果 大于- 说明不够用了,就需要进行扩容if (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?//                             capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious code//因为第一次进来的时候,emlementData.length长度是0 所以将0赋给了oldCapacityint oldCapacity = elementData.length;//这里就是两倍扩容最关键的地方,我们在一进来就先把,当前elementData数组的长度赋值给了oldCapacity 然后判断capacityIncrement是否大于0 但是capacityIncrement是0 所以还是返回oldCapacity 这样就相当于两次oldCapacity相加,就实现了两次扩容int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}*/
package com.list_;import java.util.Vector;@SuppressWarnings({"all"})
public class Vector_ {public static void main(String[] args) {//无参构造器//有参数的构造Vector vector = new Vector(8);for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);System.out.println("vector=" + vector);//源码分析//1. new Vector() 底层/*public Vector() {//即使你没有指定大小会默认给你一个10,最后调用的还是有参构造器this(10);}所以即使开始使用的是无参构造器,但是因为默认给了10所以,所以最后走的还是带参数的构造器,也就是这个public Vector(int initialCapacity) {this(initialCapacity, 0);}补充:如果是  Vector vector = new Vector(8); 也就是使用有参构造器使用的方法就是:public Vector(int initialCapacity) {this(initialCapacity, 0);}2. vector.add(i)2.1  //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {//该变量记录集合被修改的次数modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2  //确定是否需要扩容 条件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious code//意识就是 当前的最小容量-你需要的容量 如果 大于- 说明不够用了,就需要进行扩容if (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?//                             capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious code//因为第一次进来的时候,emlementData.length长度是0 所以将0赋给了oldCapacityint oldCapacity = elementData.length;//这里就是两倍扩容最关键的地方,我们在一进来就先把,当前elementData数组的长度赋值给了oldCapacity 然后判断capacityIncrement是否大于0 但是capacityIncrement是0 所以还是返回oldCapacity 这样就相当于两次oldCapacity相加,就实现了两次扩容int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}*/}
}

Vector和ArrayList的比较

底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组jdk1.2不安全,效率高如果有参构造1.5倍,如果是无参第一次10第二次1.5倍扩
Vector可变数组Object[]jdk1.0安全,效率不高如果是无参,默认10,满后就按2倍扩容如果指定大小则每次按2倍扩容
http://www.lryc.cn/news/63327.html

相关文章:

  • 计算卸载论文阅读01-理论梳理
  • Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置
  • 15个使用率超高的Python库,下载量均过亿
  • 所有知识付费都可以用 ChatGPT 再割一次?
  • Python中“is”和“==”的区别(避坑)
  • 20230426----重返学习-vue-router路由
  • Java字节码指令
  • Vue3之setup参数介绍
  • ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
  • 试试这几个冷门但好用的软件吧
  • 【云原生】k8s NetworkPolicy 网络策略是怎么样的
  • 手把手教你用几行代码给winform多个控件(数量无上限)赋值
  • 回炉重造十一------ansible批量安装服务
  • 系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)
  • Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析
  • No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》
  • Go | 一分钟掌握Go | 9 - 通道
  • 【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?
  • BatteryChargingSpecification1.2中文详解
  • 基于Jenkins,docker实现自动化部署(持续交互)【转】
  • 漫谈大数据 - 数据湖认知篇
  • 阿里云国际版ACE与国内版ACE区别
  • Mysql8.0 gis支持
  • 汇编---Nasm
  • NDK OpenGL渲染画面效果
  • 常见的深度学习框架
  • 【设计模式】七大设计原则--------单一职责原则
  • MySQL-中间件mycat(一)
  • ARM寄存器组织
  • 记录一次webdav协议磁盘挂载经验总结