Vector和ArrayList是List的两个典型的实现,底层都是基于一个动态的,允许再分配的Object数组。数组默认长度为10。可以使用ensureCapacity()方法来增加数组长度。详见java API。
Vector是线程安全的,无序程序保证该集合的同步性,而ArrayList是线程不安全的,必须在程序中保证集合的同步性。Vector的效率相对较低。一般不会使用Vector了。
Vector有一个子类Stack,用来模拟栈(LIFO),主要由以下几个关键的方法:
peek() 返回栈的第一个元素,但是该元素不出栈
pop() 返回栈的第一个元素,该元素出栈
push(Object item) 将一个元素压入栈
public class VectorDemo {
public static void main(String[] args){
Stack s= new Stack();
s.push("a");
s.push("b");
s.push("c");
System.out.println(s);
System.out.println("the first element of the stack is:"+s.peek());
System.out.println(s);
System.out.println(s.pop());
System.out.println("the content of the stack after pop:"+s);
}
}
输出:
[a, b, c]
the first element of the stack is:c
[a, b, c]
c
the content of the stack after pop:[a, b]
由于Stack是Vector的子类, 所以效率比较低。如果要模拟栈,可以使用LinkedList来进行模拟。
LinkedList实现了Deque接口,可以被当做双端队列使用,也可以被当做栈来使用。
需要记住的几个重要方法:
addFirst(Object e) offerFirst(Object e) 将指定元素插入到双端队列的开头
addLast(Object e) offerLast(Object e)将指定元素插入到双端队列末尾
getFirst() peekFirst() 获取但不删除双端队列的第一个元素
getLast() peekLast() 获取但不删除双端队列的最后一个元素
pollFirst()获取并删除第一个元素
pollLast() 获取并删除最后一个元素
pop() 删除栈的第一个元素
push()将一个元素添加到栈顶。
下面通过一个例子来说明:
public class LinkedListDemo {
public static void main(String[] args){
LinkedList ll = new LinkedList();
ll.offer("a");
ll.push("b");
ll.offerFirst("c");
for(int i=0; i<ll.size(); i++){
System.out.println(ll.get(i));
}
System.out.println(ll);
System.out.println("访问但不删除栈的第一个元素:"+ll.peekFirst());
System.out.println("访问但不删除栈的最后一个元素"+ll.peekLast());
System.out.println("弹出栈顶元素"+ll.pop());
System.out.println("栈内内容为:"+ll);
System.out.println("弹出栈的最后一个元素"+ll.pollLast());
System.out.println("栈内内容为:"+ll);
}
}
输出结果为:
c
b
a
[c, b, a]
访问但不删除栈的第一个元素:c
访问但不删除栈的最后一个元素a
弹出栈顶元素c
栈内内容为:[b, a]
弹出栈的最后一个元素a
栈内内容为:[b]