Java集合工具类之List - Vector & Stack
?
3. List3.1 VectorVector是基本数据结构一个可变数组,数组的元素可以是任意对象,当Vector初始创建时,会创建一个一定容量(Capacity)的(默认为10)数组对象,当添加的对象超过数组的容量时,Vector在内部会重新创建一个新的数组,再把原数组元素拷贝到新的数组里面,这样就完成了动态数组的功能。Vector的构造器有三种
initialCapacity是数组的初始化长度,capacityIncrement是当数组长度超过原长度时,数组长度增长的步长,capacityIncrement为0时,此种情况当数组长度超过原长度峰值时,此时数组长度变为原来的2倍。当数组长度变化,原有的数据和新的数组对象是通过copy来完成的。
Vector默认构造器的数组的长度是10
?
?
核心方法:
/**
???? *
???? * @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);
??? }
??? }
1) Vector使用时,最好能够预期需要存放元素的个数,这样可以避免数组长度频繁的改变而引起数据的copy带来的开销,同时会引起内存大小的增加。
2)使用Vector需要知道Vector是线程安全的。因此,在使用时,最好是考虑这个对象会不会因为多个线程访问该Vector对象,如果确认只有单个线程访问,则可以用ArrayList来代替Vector。
?
?
有Vector可以轻松改造成Stack,栈的特点是先进后出,对于一个栈来说,主要方法包括,push(Ee), pop, peek,empty和search(Ee).
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;
?? ?}
}