Vector源码分析
Vector与ArrayList底层实现基本类似,底层都是用数组实现的,最大的不同是Vector是线程安全的。ArrayList源码分析请参考ArrayList源码分析
一、源码分析
基于jdk1.7源码
属性
protected Object[] elementData;//用来存储元素
protected int elementCount;//元素数量
protected int capacityIncrement;//扩容增量,扩容时增加的容量大小。
Vector多了一个capacityIncrement属性。当Vector需要扩容时,增加的容量大小就是该值。
而ArrayList扩容时是扩充到原容量的1.5倍。
构造器
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
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);
}
跟ArrayList一样,创建Vector时可以指定初始容量initalCapacity,如果不指定则默认初始容量为10。
Vector也可以在创建时指定扩容增量,如果不指定则为0。
add方法
public synchronized boolean add(E e) {
modCount++;
//确定是否还有容量
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
实现与ArrayList差不多,最大区别是该方法进行了同步。继续往下跟代码。
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//扩容。指定了扩容增量,则增加该值。没指定,则扩容到原来的两倍
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);
}
整个过程基本与ArrayList一样,但是不同点是Vecotor扩容增加的容量大小。
如果Vector初始化时指定了扩容增量,则增加的容量值就是指定的扩容增量,否则,增加1倍容量,也就是扩容到原来的2倍。
get方法
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return elementData(index);
}
很简单,与ArrayList一样,也是先进行边界检查,再根据下标获取元素。
remove方法
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 work
return oldValue;
}
跟ArrayList实现差不多,不再赘述。
二、Vector和ArrayList的比较
1.扩容
Vector在创建时能够指定扩容增量,如果指定了该增量,当自动扩容时增加的容量就是该增量值。如果创建时没指定增量(或该值<=0),则扩容1倍,即容量变为原来的2倍。
ArrayList并没有提供能指定增量的构造方法,扩容0.5倍,即容量变为原来的1.5倍(具体参考ArrayList源码分析)
2.线程安全和效率
Vector的修改方法都是线程安全的,然而java.util.concurrent包中对容器提供了线程安全的实现版本,非线程安全时,可以用ArrayList来代替Vector,需要线程安全时可以使用Collections.synchronizedList(new ArrayList())和CopyOnWriteArrayList来替代,也就是说Vector被淘汰了。
ArrayList并不是线程安全的,因此相对来说,ArrayList比Vector效率要高一些。
Vector源码分析的更多相关文章
- Stack和Vector源码分析
Stack和Vector源码分析 Stack和Vector源码分析stack源码分析1.Stack是什么2.Stack的结构图3.Stack继承关系4.Stack的主要方法5.Stack源码Vecto ...
- Vector源码分析和实例应用
1.Vector介绍 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector ...
- Java集合之Vector源码分析
概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...
- ArrayList、LinkedList和Vector源码分析
ArrayList.LinkedList和Vector源码分析 ArrayList ArrayList是一个底层使用数组来存储对象,但不是线程安全的集合类 ArrayList的类结构关系 public ...
- [Java]Vector源码分析
第1部分 Vector介绍 Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长.继承于AbstractList,实现了List, RandomAccess, Clone ...
- ArrayList和LinkedList和Vector源码分析
ArrayList源码: private static final int DEFAULT_CAPACITY = 10;//默认长度 /** * Shared empty array instance ...
- Stack&Vector源码分析 jdk1.6
参照:http://www.cnblogs.com/tstd/p/5104099.html Stack(Fitst In Last Out) 1.定义 public class Stack<E& ...
- Vector和Stack源码分析/List集合的总结
序言 这篇文章算是在这list接口下的集合的最后一篇了,前面ArrayList.LinkedList都已经讲解完了,剩下就Vector和Vector的子类Stack啦.继续努力.一步一个脚印, --W ...
- 源码分析(5)-ArrayList、Vector和LinkedList(JDK1.8)
一.概述 1.线程安全:ArrayList和LinkedList非线程安全的.Vector线程安全的. 2.底层数据结构:ArrayList和Vector底层数据结构是数组:LinkedList双向链 ...
随机推荐
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
- Elixir 单元测试
概述 elixir 中自带了单元测试框架 ExUnit ,其中提供单元测试的一系列,主要包含以下模块: ExUnit: 单元测试框架 ExUnit.Assertions: 断言 ExUnit.Case ...
- 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新
科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...
- human pose estimation
2D Pose estimation主要面临的困难:遮挡.复杂背景.光照.真实世界的复杂姿态.人的尺度不一.拍摄角度不固定等. 单人姿态估计 传统方法:基于Pictorial Structures, ...
- postgreSQL 应用case when的例子
selectname,md5(indvl_id_nbr) as indvl_id_nbr,case when char_length(indvl_id_nbr)=18 or char_length(i ...
- Java基础知识点(一)
前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新...... 1.Java的访问权限 Java中有四种访问权限:默认访问权限.public.p ...
- centos7下安装docker(22.docker swarm-----service)
运行service 执行以下命令: docker service create --name web-server httpd 通过docker service ls查看swarm中的service ...
- SpringCloudStream实战
Spring Cloud Stream是一个用于构建消息驱动的微服务应用程序的框架.Spring Cloud Stream构建于Spring Boot之上,用于创建独立的生产级Spring应用程序,并 ...
- 测试一下robotgo自动化操作,顺便解决了原来的mingw版本中只有gcc,没有g++的问题
参考:https://gitee.com/veni0/robotgo#examples 但是编译不成功 找到这个:https://gitee.com/veni0/robotgo#examples ( ...
- java 基础响应体定义 - 通用
package com.teewon.viewservice.entitiy.base; import java.io.Serializable; import java.util.List; pub ...