List集合之Vector
目录
- `Vector` 类
- `Vector` 源码
- `Vector` 变量
- `Vector` 的初始化
- `Vector` 的 `add()` 方法
- `Vector` 的 `removeElement()` 方法
- `Vector` 的 `get()` 方法
- `Vector` 的 `set()` 方法
- `Vector` 的扩容
- `Vector` 小结
Vector
类
相比很多同学在刚接触 Java
集合的时候,线程安全的 List
用的一定是 Vector
。但是现在用到的线程安全的 List
一般都会用 CopyOnWriteArrayList
,很少有人再去用 Vector
了,至于为什么,文章中会具体说到。接下来,我们先来简单分析一下 Vector
的源码
Vector
源码
Vector
和 ArrayList
的底层实现是一样的,都是由数组实现的
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
,扩容容量为 0
的 Vector
集合
Vector
的 add()
方法
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;
}
Vector
的 removeElement()
方法
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;
}
Vector
的 get()
方法
public synchronized E get(int index) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);return elementData(index);
}
Vector
的 set()
方法
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相关推荐
- Java基础(19)数据结构概述、ArrayList集合、Vector集合、LinkedList集合、集合框架练习
1. 数据结构概述 1. 数据结构的概述:数据结构就是数据存储的方式 2. 常见数据结构:栈,队列,数组,链表,二叉树,哈希表 3. 栈和队列 (1)栈:先进后出,后进先出 (2)队列:先进先出,后进 ...
- Java 集合 之 Vector
http://www.verejava.com/?id=17159974203844 import java.util.ArrayList; import java.util.Enumeration; ...
- Java集合之Vector源码分析
概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...
- 【集合】Vector 是线程安全的?
1.美图 2.概述 今天遇到一个问题,让我怀疑Vector是否是线程安全的 [Flink]报错 KryoException ConcurrentModificationException StackO ...
- Java 集合系列06: Vector深入解析
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概论 这是接着以前的文章分享的,这里给出以前的文章的连接,供小伙伴们回顾 ...
- Java集合系列:Vector解析
本文转自:http://www.cnblogs.com/skywang12345/p/3308833.html 目录 摘要 第1部分 Vector介绍 第2部分 Vector数据结构 第3部分 Vec ...
- Java 集合系列:Vector源码深入解析
概论 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Ve ...
- java集合之列表:ArrayList、Vector、LinkedList
1 package com.jdk7.chapter4; 2 3 import java.util.ArrayList; 4 import java.util.LinkedList; 5 import ...
- 集合--ArrayList类、Vector类、LinkedList类、List集合练习
ArrayList类 import java.util.Objects; /*ArrayList类概述底层数据结构是数组,查询快,增删慢线程不安全,效率高 */ public class Studen ...
- Java集合 Vector的底层详解
Java集合的 Vector底层讲解 Vector作为List的另外一个典型的实现类,完全支持List的全部功能,Vector的实现其实和ArrayList的底层实现很类似,都是封装了一个Object ...
最新文章
- react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...
- leetcode算法题--从尾到头打印链表
- ubuntu安装nvidia显卡驱动+cuda9.0+cudnn7.0+查看cuda版本+安装tensorrt+python查看gpu显存
- 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
- Leetcode 124.二叉树中的最大路径和
- idea中有些类明明在jar包里有,但是却搜不到
- 2022 SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台
- testbench文件显示波形_如何编写testbench的总结(非常实用的总结)
- 【shel】-if表达式
- Android 启动优化说明、黑白屏处理
- Android进阶之路 - 仿京东地址选择器使用指南
- [转载] linux程序后台挂起demo——nohup
- ELK系列(四)、Logstash读取nginx日志写入ES中
- 机器学习十大算法之贝叶斯算法
- CSS给元素添加边框(样式、颜色、宽度)
- OpenCV实战(16)——角点检测详解
- 腾讯云、阿里云和百度云的优劣势各是什么?
- java namevaluepair_java-如何将NameValuePair中的URL参数添加到HttpPost请求中
- Android 四大组件通信核心
- freopen重定向函数
热门文章
- 阿里云云计算 29 AS的原理
- TensorFlow by Google神经网络深度学习的 Hello World Machine Learning Foundations: Ep #1 - What is ML?
- 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档
- 决策树ID3算法的不足
- 串口屏与6050_MPU6050 STM32控制 六轴传感器,可通过串口屏显示,还可连接匿名上位机 欧拉角 SCM 单片 发 267万源代码下载- www.pudn.com...
- vue 检测ie版本_vue 兼容低版本ie浏览器
- hdu acm1157
- 【ML小结2】信息论
- 语言模型总结(待完善)
- 403. Frog Jump