1. 概述

上文「JDK源码分析-ArrayList」主要分析了 ArrayList 的实现原理。本文分析 List 接口的另一个实现类:Vector。

Vector 的内部实现与 ArrayList 类似,也可以理解为一个「可变数组」。其继承结构如下(省略部分接口):

PS: 由于 Vector 目前使用较少,且官方也推荐在无线程安全的需求时使用 ArrayList 代替 Vector,这里仅研究其实现原理。
stackoverflow 也有相关的讨论:https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated

2. 代码分析

仍然从其构造器入手进行分析。

2.1 构造器

Vector 对外提供四个构造器(内部可以认为是两个),其一:

protected 

与 ArrayList 类似,Vector 内部也维护了一个 Object 类型的数组(elementData)来存储元素(默认初始容量也是 10)。不同的是:Vector 比 ArrayList 的构造器多了一个参数 capacityIncrement,该变量也导致了二者的扩容方式略有不同,后面进行分析。

其二:入参为集合的构造器

public 

2.2 扩容原理分析

我们仍从其 add() 方法入手进行分析:

public 

注意这里的关键字 synchronized。观察可以发现:Vector 内部许多方法都使用了该关键字,这也是 Vector 实现线程安全的方式,简单粗暴!

其扩容方法实现如下:

/**

从这里可以看出,Vector 与 ArrayList 的扩容方式基本一致,只是新容量的计算方式有所不同,这里分析下其新容量大小:

int 

Vector 计算扩容后的新容量时,根据 capacityIncrement 的值可以分为两种情况:

  1. capacityIncrement > 0:新容量 = 旧容量 + capacityIncrement;
  2. capacityIncrement <= 0:新容量 = 旧容量 * 2。

3. 线程安全性

Vector 是线程安全的,它实现线程安全的方式也很简单粗暴:直接在方法上使用 synchronized 关键字进行同步。

4. 小结

  1. 与 ArrayList 类似,Vector 也可以认为是「可变数组」;
  2. 扩容原理与 ArrayList 基本一致,只是新容量计算方式略有不同:指定增长容量时,新容量为旧容量 + 增长容量;否则扩容为旧容量的 2 倍;
  3. 线程安全的,实现方式简单(synchronized);
  4. 当前使用较少,这里仅学习其实现原理。

c++ vector拷贝构造_JDK源码分析-Vector相关推荐

  1. futuretask使用_JDK源码分析-FutureTask

    1. 概述 FutureTask 是一个可取消的.异步执行任务的类,它的继承结构如下: 它实现了 RunnableFuture 接口,而该接口又继承了 Runnable 接口和 Future 接口,因 ...

  2. Jaca集合(四)Vector集合底层源码分析

    Vector的基本介绍: (1)Vector类的定义说明:我们进入源码界面进行查看: public class Vector<E>extends AbstractList<E> ...

  3. Java集合之Vector源码分析

    概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...

  4. C++ STL: 容器vector源码分析

    文章目录 前言 vector的核心接口 vector push_back实现 vector 的 Allocator vector 的 push_back 总结 前言 vector 是我们C++STL中 ...

  5. java vector实现的接口_java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析...

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  6. SIFT原理与源码分析:DoG尺度空间构造

    <SIFT原理与源码分析>系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548 尺度空间理论 自然界中的物体随着观 ...

  7. SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  8. sheng的学习笔记-Vector源码分析

    概述 Vector底层也是数组,跟ArrayList很像(先看下ArrayList,再看Vector会很轻松),ArrayList可参考下文,并且由于效率低,已经被淘汰了,大概瞅瞅得了 sheng的学 ...

  9. OpenCV2.4.9源码分析——Support Vector Machines

    引言 本文共分为三个部分,第一个部分介绍SVM的原理,我们全面介绍了5中常用的SVM算法:C-SVC.ν-SVC.单类SVM.ε-SVR和ν-SVR,其中C-SVC和ν-SVC不仅介绍了处理两类分类问 ...

最新文章

  1. Google 开发新的开源系统 Fuchsia
  2. 回溯 Rust 2020:正成为最受欢迎的编程语言
  3. 怎样批量调整word 图片大小?
  4. TensorFlow神经网络(四)手写数字识别
  5. 用计算机实现工业自动化,计算机技术在工业自动化控制系统中的应用
  6. 解决Xcode在debug时不在断点处停止的方法<转>
  7. Android 系统开发系列四
  8. Zephyr学习(一)Zephyr介绍
  9. 各地大厂名单(一二线城市知名公司)
  10. 几个大的车载开源平台
  11. Dropping Pixels for Adversarial Robustness
  12. mysql干嘛的_mysql和sql是干什么的?
  13. 产品的分类(民用商用级、工业级、汽车电子级、军工级)
  14. luckysheet实现在线编辑Excel
  15. 看院线电影就用移动电影院V2.0App
  16. 畅购商城项目(面试版)二
  17. Oracle 判断正负数函数 sign
  18. outlook电子邮件解析_在Outlook中按会话对电子邮件进行排序
  19. 详细解析ESP寄存器与EBP寄存器
  20. 经纬度坐标点和距离之间的转换

热门文章

  1. 【译文】领域模型的五个特征
  2. Asp.Net Core 轻松学-正确使用分布式缓存
  3. 第六期.Net开源社群联合分享--除了情结和价格,Azure最适合什么场景?等你来讲趟坑的实战经验!
  4. php html 转xml,用PHP生成XML文档(转义字符)
  5. [转]IntelliJ IDEA 2019.3正式发布,给我们带来哪些新特性?
  6. 【ArcGIS微课1000例】0014:ArcGIS中如何将kml(kmz)文件转shp,并进行投影转换?
  7. 【ArcGIS风暴】ArcGIS Editor for OSM中文教程(2):下载及加载OSM数据
  8. 【Envi风暴】Envi插件大全:多波段拆分工具的巧妙使用
  9. linux之如何复制文件夹所有文件到其它文件夹
  10. linux之怎么使vim永久显示行号