链表专题(待更新)
栈专题
Java中用来表达栈的功能(push/pop/peek
),更适用的是使用双端队列接口Deque,并用实现类ArrayDeque/LinkedList
来进行初始化。
Deque<Integer> stack = new ArrayDeque<>();
stack.addFirst(E); // 在ArrayDeque双端队列的末尾插入指定的内容
stack.peekFirst(); // 返回ArrayDeque双端队列的第一个元素
stack.pollFirst(); // 返回并删除ArrayDeque双端队列的第一个元素
/*迭代遍历ArrayDeque*/
/*使用iterator(),返回可用于遍历ArrayDeque双端队列的迭代器.
descendingIterator()可用于以相反顺序遍历ArrayDeque双端队列*/
Iterator<String> iterate = animals.iterator();
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
用ArrayDeque还是LinkedList?
ArrayDeque源码注释中有一句话:
This class is likely to be faster than {@link Stack} when used as a stack,
and faster than {@link LinkedList} when used as a queue.
即ArrayDeque用作栈时比Stack快,用作队列的时候也会比LinkedList快!但是这二者差别通常可以忽略。
为什么不推荐使用Stack类?
Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。
原因:从性能上来说应该使用Deque代替Stack。 此外,Stack 还犯了面向对象设计的错误:将组合关系当成了继承关系。
- Java中Stack类从Vector类继承,底层是用数组实现的线程安全的栈,很多方法都用了synchronized修饰,因此Stack和Vector都是线程安全的。
- 而多数情况下并不需要做到线程安全,因此没有必要使用Stack。毕竟保证线程安全需要上锁,有额外的系统开销。
- 另外,像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,因此如果用Stack类效率不太行。