Java8——Vector源码详解

Vector

Vector很多方法都和ArrayList一样,只是多加了synchronized保证了线程的安全。

Vector比ArrayList多了一个属性

protected int capacityIncrement;

这个属性是在扩容的时候用到的,表示每次扩容只扩容capacityIncrement个空间,该属性可以通过构造方法赋值。

构造方法

public Vector(int initialCapacity, int capacityIncrement) 
{
 	 super();
 if (initialCapacity < 0)
	 throw new IllegalArgumentException("Illegal Capacit
y: "+initialCapacity);
	 this.elementData = new Object[initialCapacity];
	 this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
	 this(initialCapacity, 0);
}
public Vector() {
	 this(10);
}

从构造方法中,我们可以看出 Vector 的默认大小也是 10,而且它在初始化的时候就已经创建了数组了,这点跟 ArrayList 不一样。

grow方法

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);
}

从 grow 方法中我们可以发现,newCapacity 默认情况下是两倍的 oldCapacity,而当指定了 capacityIncrement 的值之后,newCapacity 变成了oldCapacity+capacityIncrement。

总结

1、Vector创建时默认大小为10
2、Vector每次扩容但都是以当前数组的2倍扩容,当指定了capacityIncrement后,每次扩容仅在原有基础上增加capacityIncrement个空间。
3、Vector和ArrayList的add、get、size方法时间复杂度都为 O(1),remove方法的时间复杂度为O(n)
4、ArrayList是线程不安全的,Vector是线程安全的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值