Collection容器家族(Vector讲解及Stack源码详解)
Vector讲解
Vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
(01) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
但由于它底层数据结构是数组、查询快、增删满、线程不安全,所以不经常使用,通常使用ArrayList代替它。
Stack类详解
一、Stack继承的父类、接口及概述
Stack类,作为java对栈结构的实现,具有先进后出、后进先出的特点。它的实现方式是基于Vector集合类实现的,Stack类自己本身有5个栈的常用方法(压栈、出栈、查看栈顶元素、判断栈是否为空、查找栈内指定元素),除了这几个方法外,他还可以使用其父类Vector类的公共方法。但是对于一个栈,基本的的压栈出栈查找元素就足够了。
二、方法详解
1.进栈方法 push(E item)
/**
* 功能:进栈
* 实现:调用父类Vector的addElement方法在数组尾部添加元素
*/
public E push(E item) {
addElement(item);
return item;
}
2.出栈 pop()
/**
* 功能:出栈
* 实现:调用父类的removeElementAt移除并返回数组尾部的元素
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
3.查看栈顶元素 peek()
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
4.判断栈是否为空 isEmpty()
public boolean empty() {
return size() == 0;
}
5.查找栈内元素 search(Object obj)
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
Stack类的方法就这5个,他的所有实现功能都是基于Vector类的方法。
三、基本使用Demo
@Test
public void test1() {
Stack<String> stack = new Stack<>();
stack.push("hello");
stack.push("world");
stack.push("java");
System.out.println("empty:" + stack.empty());
System.out.println("peek:" + stack.peek());
System.out.println("peek:" + stack.search("world"));
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}