List源码解析之Vector 源码分析
Vector简介
和ArrayList一样,Vector也是基于数组实现的,是动态数组,容量可自动增长。
与ArrayList不同的是,它有好多方法都加入了synchronized
修饰,所以是线程安全的,可用于多线程环境。
Vector没有实现Serializable接口,不支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问。
属性和构造函数
protected Object[] elementData; // 存放数据的数组 protected int elementCount; // 元素个数 protected int capacityIncrement; // 容量增量 // 构造一个指定容量和增量的Vector public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; } // 构造一个指定容量,增量为 0 的Vector public Vector(int initialCapacity) { this(initialCapacity, 0); } // 构造一个容量为10,增量为 0 的Vector public Vector() { this(10); }
存储
synchronized boolean add(E e)
多了synchronized 修饰。
// 末尾插入元素,注意有synchronized修饰 publicsynchronizedbooleanadd(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
add(int index, E element)
// 指定位置插入 publicvoidadd(int index, E element) { insertElementAt(element, index); } // 具体实现查看源码... publicsynchronizedvoidinsertElementAt(E obj, int index) { modCount++; if (index > elementCount) { throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount); } ensureCapacityHelper(elementCount + 1); System.arraycopy(elementData, index, elementData, index + 1, elementCount - index); elementData[index] = obj; elementCount++; }
set(int index, E element)
// 用指定的元素替代此列表中指定位置上的元素,并返回以前位于该位置上的元素 publicsynchronized E set(int index, E element) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; }
读取
get(int index)
同ArrayList
// 返回此列表中指定位置上的元素 public E get(int index) { rangeCheck(index); return elementData(index); }
删除
remove(int index)
// 删除指定位置元素 publicsynchronized 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; }
remove(Object o)
// 移除此列表中首次出现的指定元素(如果存在)。 publicbooleanremove(Object o) { return removeElement(o); } publicsynchronizedbooleanremoveElement(Object obj) { modCount++; int i = indexOf(obj); if (i >= 0) { removeElementAt(i); return true; } return false; } publicsynchronizedvoidremoveElementAt(int index) { modCount++; if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } else if (index < 0) { throw new ArrayIndexOutOfBoundsException(index); } int j = elementCount - index - 1; if (j > 0) { System.arraycopy(elementData, index + 1, elementData, index, j); } elementCount--; elementData[elementCount] = null; /* to let gc do its work */ }
容量调整
和ArrayList类似,多了synchronized修饰。
相关推荐
JayFighting 2020-06-28
Chenliaoyuan 2020-06-11
星辰大海的路上 2020-06-10
myveer 2020-06-01
willluckysmile 2020-05-03
容数据服务集结号 2020-04-22
shayuchaor 2020-04-20
fengyun 2020-04-17
htofly 2020-03-27
MrFuWen 2020-02-22
yuanye0 2019-12-09
laohyx 2019-11-03
shenxiuwen 2019-10-31
lixinghui0 2011-05-02
nimeijian 2019-10-21
hacker0ne 2018-09-30
agjllxchjy 2013-01-17