目录

  • `Vector` 类
  • `Vector` 源码
    • `Vector` 变量
    • `Vector` 的初始化
    • `Vector` 的 `add()` 方法
    • `Vector` 的 `removeElement()` 方法
    • `Vector` 的 `get()` 方法
    • `Vector` 的 `set()` 方法
    • `Vector` 的扩容
  • `Vector` 小结

Vector

相比很多同学在刚接触 Java 集合的时候,线程安全的 List 用的一定是 Vector。但是现在用到的线程安全的 List 一般都会用 CopyOnWriteArrayList,很少有人再去用 Vector 了,至于为什么,文章中会具体说到。接下来,我们先来简单分析一下 Vector 的源码

Vector 源码

VectorArrayList 的底层实现是一样的,都是由数组实现的

Vector 变量

public class Vector<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {// 存放元素的数组 protected Object[] elementData;// 元素个数protected int elementCount;// 扩容自增容量大小protected int capacityIncrement;
}

Vector 的初始化

// 无参构造器
public Vector() {this(10);
}// 指定初始化容量的构造器
public Vector(int initialCapacity) {this(initialCapacity, 0);
}// 指定初始化容量和扩容容量大小的构造器
public Vector(int initialCapacity, int capacityIncrement) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);this.elementData = new Object[initialCapacity];this.capacityIncrement = capacityIncrement;
}

从上面的构造器中可以看出,如果调用无参构造器,则会创建一个初始化容量为 10,扩容容量为 0Vector 集合

Vectoradd() 方法

public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;
}public synchronized void addElement(E obj) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = obj;
}

VectorremoveElement() 方法

public synchronized boolean removeElement(Object obj) {modCount++;int i = indexOf(obj);if (i >= 0) {removeElementAt(i);return true;}return false;
}public synchronized void removeAllElements() {modCount++;for (int i = 0; i < elementCount; i++)elementData[i] = null;elementCount = 0;
}public synchronized E remove(int index) {modCount++;if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index);int numMoved = elementCount - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--elementCount] = null; // Let gc do its workreturn oldValue;
}

Vectorget() 方法

public synchronized E get(int index) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);return elementData(index);
}

Vectorset() 方法

public synchronized E set(int index, E element) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index);elementData[index] = element;return oldValue;
}

Vector 的扩容

Vector 的扩容机制和 ArrayList 的很像

private void grow(int minCapacity) {// 初始化数组的长度,默认为 10int oldCapacity = elementData.length;// 是否指定扩容容量,不指定扩容为原来的2倍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);
}

通过上面的方法,我们可以看出,

  • 如果指定了扩容容量的大小,则扩容的新数组大小为:原来的数组加上扩容容量的大小
  • 如果不指定扩容容量的大小,则扩容的新数组大小为:原来数组大小的 2

这样扩容为原来的 2 倍是很消耗空间的,这也是 Vector 被弃用的原因之一

Vector 小结

  • Vector 是线程安全的 List,底层是数组实现的
  • Vector 的每个方法都进行了加锁,数据操作效率低下
  • Vector 每次扩容的大小都是原来数组大小的 2
  • Vector 实现了 RandomAccess 接口,支持随机读取,因此更加推荐使用 for 循环进行遍历

List集合之Vector相关推荐

  1. Java基础(19)数据结构概述、ArrayList集合、Vector集合、LinkedList集合、集合框架练习

    1. 数据结构概述 1. 数据结构的概述:数据结构就是数据存储的方式 2. 常见数据结构:栈,队列,数组,链表,二叉树,哈希表 3. 栈和队列 (1)栈:先进后出,后进先出 (2)队列:先进先出,后进 ...

  2. Java 集合 之 Vector

    http://www.verejava.com/?id=17159974203844 import java.util.ArrayList; import java.util.Enumeration; ...

  3. Java集合之Vector源码分析

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

  4. 【集合】Vector 是线程安全的?

    1.美图 2.概述 今天遇到一个问题,让我怀疑Vector是否是线程安全的 [Flink]报错 KryoException ConcurrentModificationException StackO ...

  5. Java 集合系列06: Vector深入解析

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概论 这是接着以前的文章分享的,这里给出以前的文章的连接,供小伙伴们回顾 ...

  6. Java集合系列:Vector解析

    本文转自:http://www.cnblogs.com/skywang12345/p/3308833.html 目录 摘要 第1部分 Vector介绍 第2部分 Vector数据结构 第3部分 Vec ...

  7. Java 集合系列:Vector源码深入解析

    概论 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Ve ...

  8. java集合之列表:ArrayList、Vector、LinkedList

    1 package com.jdk7.chapter4; 2 3 import java.util.ArrayList; 4 import java.util.LinkedList; 5 import ...

  9. 集合--ArrayList类、Vector类、LinkedList类、List集合练习

    ArrayList类 import java.util.Objects; /*ArrayList类概述底层数据结构是数组,查询快,增删慢线程不安全,效率高 */ public class Studen ...

  10. Java集合 Vector的底层详解

    Java集合的 Vector底层讲解 Vector作为List的另外一个典型的实现类,完全支持List的全部功能,Vector的实现其实和ArrayList的底层实现很类似,都是封装了一个Object ...

最新文章

  1. react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...
  2. leetcode算法题--从尾到头打印链表
  3. ubuntu安装nvidia显卡驱动+cuda9.0+cudnn7.0+查看cuda版本+安装tensorrt+python查看gpu显存
  4. 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
  5. Leetcode 124.二叉树中的最大路径和
  6. idea中有些类明明在jar包里有,但是却搜不到
  7. 2022 SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台
  8. testbench文件显示波形_如何编写testbench的总结(非常实用的总结)
  9. 【shel】-if表达式
  10. Android 启动优化说明、黑白屏处理
  11. Android进阶之路 - 仿京东地址选择器使用指南
  12. [转载] linux程序后台挂起demo——nohup
  13. ELK系列(四)、Logstash读取nginx日志写入ES中
  14. 机器学习十大算法之贝叶斯算法
  15. CSS给元素添加边框(样式、颜色、宽度)
  16. OpenCV实战(16)——角点检测详解
  17. 腾讯云、阿里云和百度云的优劣势各是什么?
  18. java namevaluepair_java-如何将NameValuePair中的URL参数添加到HttpPost请求中
  19. Android 四大组件通信核心
  20. freopen重定向函数

热门文章

  1. 阿里云云计算 29 AS的原理
  2. TensorFlow by Google神经网络深度学习的 Hello World Machine Learning Foundations: Ep #1 - What is ML?
  3. 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档
  4. 决策树ID3算法的不足
  5. 串口屏与6050_MPU6050 STM32控制 六轴传感器,可通过串口屏显示,还可连接匿名上位机 欧拉角 SCM 单片 发 267万源代码下载- www.pudn.com...
  6. vue 检测ie版本_vue 兼容低版本ie浏览器
  7. hdu acm1157
  8. 【ML小结2】信息论
  9. 语言模型总结(待完善)
  10. 403. Frog Jump