Vector源码解析
Vector
构造函数
protected Object[] elementData;//用于存储对象
public Vector() {
this(10);//初始化 Vector容量为10
}
public Vector(int initialCapacity) {
// 初始化容量=10,容量增长=0
this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
super();
// 初始化容量小于0,直接抛出异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
// 初始化
this.elementData = new Object[initialCapacity];//new一个固定容量(长度)的数组,并赋值给elementData
this.capacityIncrement = capacityIncrement;//容量增长0赋值给capacityIncrement
}
add
protected transient int modCount = 0;
protected int elementCount;
public synchronized boolean add(E e) {
modCount++;// 修改次数+1
ensureCapacityHelper(elementCount + 1);//确保容量支持添加新元素,传入扩展后应该的最小长度
elementData[elementCount++] = e;
return true;
}
ensureCapacityHelper 确保容量支持添加新元素方法
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
// 由add中代码可知,minCapacity=elementCount+1,这个if是一定能进的
if (minCapacity - elementData.length > 0)
grow(minCapacity);//传入elementCount扩展后应该的最小长度,此时elementCount并未被修改
}
grow
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;// 获取 当前elementData中的元素个数
// 计算 新elementData的长度(新长度),增长量(capacityIncrement)大于0,取增长量,否则取旧长度
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
// newCapacity < minCapacity 新长度 小于 扩展后应该的最小长度 证明新长度扩容不足,将扩展后应该的最小长度赋值给新长度
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// newCapacity > minCapacity 新长度 大于 扩展后应该的最小长度 证明新长度扩容足够,但是超出容量限制未知,所以调用了hugeCapacity用于防止超限
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);//生成一个新数组,并把此数组赋给elementData
}
// hugeCapacity目的是:防止扩容超出限制
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
Arrays.copyOf
public static <T> T[] copyOf(T[] original, int newLength) { // 返回一个新数组,这个数组拷贝了original中的元素,并且长度为newLength return (T[]) copyOf(original, newLength, original.getClass()); }
remove
public synchronized E remove(int index) {
modCount++;// 修改次数+1
if (index >= elementCount)
// 判断下标是否大于等于Vector的元素总量,大于等于证明越界了,抛出越界异常
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);// 根据下标获取对象
int numMoved = elementCount - index - 1;// 计算“待移除的元素”后面的元素数量
if (numMoved > 0)
//在原数组上操作,移除待删除元素。System.arraycopy是一个本地方法
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--elementCount] = null; // Let gc do its work
return oldValue;// 返回被删除的对象
}
System.arraycopy
public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
由源码可知Vector
和ArrayList
的实现方式是一样的——基于数组实现,不同点是Vector
是线程安全的,因为它的方法加了synchronized
关键字
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/articles/18177442
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现