Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的

Vector 是线程安全的,在大多数方法上存在synchronized关键字

//Vector存放的元素,初始化默认长度为10
protected Object[] elementData; //元素个数
protected int elementCount; //每次扩容大小,默认为0
protected int capacityIncrement; //构造函数,无指定初始化大小和无扩容大小
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;
} //构造函数,Collection集合
public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
//确保扩容的最小容量
public synchronized void ensureCapacity(int minCapacity) {
if (minCapacity > 0) {
modCount++;
ensureCapacityHelper(minCapacity);
}
} private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
} //扩容
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//当扩容大小为0的时候,扩容为原来的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);
} private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
  • ensureCapacity(int minCapacity)方法确保Vector的最小长度,当扩容2倍小于minCapacity时,扩容到minCapacity大小,minCapacity不能小于0
  • 最大长度为2的31次方-1

设置大小

public synchronized void setSize(int newSize) {
modCount++;
if (newSize > elementCount) {
ensureCapacityHelper(newSize);
} else {
for (int i = newSize ; i < elementCount ; i++) {
elementData[i] = null;
}
}
elementCount = newSize;
}
  • 超过大小的被设置为Null
public synchronized void copyInto(Object[] anArray) {
System.arraycopy(elementData, 0, anArray, 0, elementCount);
} public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
} public synchronized int indexOf(Object o, int index) {
if (o == null) {
for (int i = index ; i < elementCount ; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = index ; i < elementCount ; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

是否为空

public synchronized boolean isEmpty() {
return elementCount == 0;
}

设置索引上的元素

public synchronized void setElementAt(E obj, int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
elementData[index] = obj;
}

添加元素

 public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
  • 扩容

插入元素

public synchronized void insertElementAt(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++;
}
  • 扩容
  • 数组拷贝向索引后移动
  • 删除为向前移动

删除元素

public synchronized boolean removeElement(Object obj) {
modCount++;
int i = indexOf(obj);
if (i >= 0) {
removeElementAt(i);
return true;
}
return false;
}
  • 只能删除第一个

最新文章

  1. Python or JavaScript 实现多级评论
  2. IIS配置域用户自动登录
  3. Ajax省市区无刷新单表联动查询
  4. lumen Response
  5. RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
  6. 烂泥:更换ESXI5.0管理网卡及管理IP地址
  7. iOS 滑动性能优化
  8. atitit.eclipse 新特性总结3.1--4.3
  9. UVa 10935 Throwing cards away I【队列】
  10. How do I place a group of functions or variables in a specific section?
  11. JavaScript 之 页面跳转及Frame动态加载
  12. .NET生成静态页面例子
  13. HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
  14. EFcore与动态模型
  15. ecshop中的$user对象
  16. shell 变量、参数、数组章节笔记
  17. Python之os模块和sys模块
  18. Linux之ls
  19. swift NSdata 转换 nsstring
  20. office2013安装与卸载

热门文章

  1. 团队作业4——第一次项目冲刺(Alpha版本) Day1
  2. 201521123108 《Java程序设计》第6周学习总结
  3. 201521123055 《Java程序设计》第4周学习总结
  4. 201521123001《Java程序设计》第3周学习总结
  5. 201521123076《java程序设计》第12周学习总结
  6. 201521123115 《Java程序设计》第12周学习总结
  7. 201521123030 《Java程序设计》 第13周学习总结
  8. Python学习笔记010_迭代器_生成器
  9. Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!
  10. 使用tcpdump拦截linux服务端网络数据