3. List
3.1 Vector
1 . Vector 的数据结构和工作原理
Vector 是基本数据结构一个可变数组,数组的元素可以是任意对象,当 Vector 初始创建时,会创建一个一定容量(Capacity)的(默认为 10 )数组对象,当添加的对象超过数组的容量时, Vector 在内部会重新创建一个新的数组,再把原数组元素拷贝到新的数组里面,这样就完成了动态数组的功能。 Vector 的构造器有三种
1) public Vector(int initialCapacity, int capacityIncrement)
initialCapacity 是数组的初始化长度, capacityIncrement 是当数组长度超过原长度时,数组长度增长的步长, capacityIncrement 为 0 时,此种情况当数组长度超过原长度峰值时,此时数组长度变为原来的 2 倍。当数组长度变化,原有的数据和新的数组对象是通过 copy 来完成的。
2) public Vector(int initialCapacity)
3) public Vector()
Vector 默认构造器的数组的长度是 10
核心方法:
/**
* 核心方法之一:保证数组的容量,如果没有指定容量的增长的步长,则将原数组容量扩 * 大成原来的两倍,如果指定则按照增长的步长增加容量,并且取 minCapacity 和 *newCapacity 计算出来的最大值进行取值。计算出来的最终容量将作为新数组对象的尺 * 寸,并将原来数组的元素 copy 到新数组里面来。
*
* @see #ensureCapacity(int)
*/
private void ensureCapacityHelper( int minCapacity) {
int oldCapacity = elementData . length ;
if (minCapacity > oldCapacity) {
Object[] oldData = elementData ;
int newCapacity = ( capacityIncrement > 0) ?
(oldCapacity + capacityIncrement ) : (oldCapacity * 2);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf ( elementData , newCapacity);
}
}
2.Vector 使用时需要注意的问题
1) Vector 使用时,最好能够预期需要存放元素的个数,这样可以避免数组长度频繁的改变而引起数据的 copy 带来的开销,同时会引起内存大小的增加。
2 )使用 Vector 需要知道 Vector 是线程安全的。因此,在使用时,最好是考虑这个对象会不会因为多个线程访问该 Vector 对象,如果确认只有单个线程访问,则可以用 ArrayList 来代替 Vector 。
3. Stack
有 Vector 可以轻松改造成 Stack ,栈的特点是先进后出,对于一个栈来说,主要方法包括, push(E e), pop, peek,empty 和 search(E e).
public class Stack <E> extends Vector<E> {
public Stack(){
super (10);
}
public void push(E e){
this .add(e);
}
public E pop(){
return this .remove( this .size()-1);
}
public boolean empty(){
return this .size()==0;
}
public int search(E e){
for (int i = 0; i < this.size(); i++) {
if(this.elementAt(i).equals(e)){
return i;
}else{
continue;
}
}
return -1;
}
}