我什么时候应该使用java.util.Stack vs My Own Implementation? [关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我什么时候应该使用java.util.Stack vs My Own Implementation? [关闭]相关的知识,希望对你有一定的参考价值。
所以我很困惑,需要一个建议。在Java中,我可以实现自己的Stack,或者我可以使用java.util提供的Stack。
手册:
public class stack {
private int maxSize; //max size of stack
private char[] stackArray;
private int top; //index poistion of last element
public stack(int size){
this.maxSize=size;
this.stackArray=new char[maxSize];
this.top=-1; //
}
public void push(char j){
if (isFull()) {
System.out.println("SORRY I CANT PUSH MORE");
}else{
top++;
stackArray[top]=j;
}
}
public char pop(){
if(isEmpty()){
System.out.println("Sorry I cant pop more!");
return '0';
}else{
int oldTop=top;
top--;
return stackArray[oldTop];
}
}
public char peek(){
if(!isEmpty()) {
return stackArray[top];
}
}
public boolean isEmpty(){
return (top==-1);
}
public boolean isFull(){
return (maxSize-1 == top);
}
第二种方式是Java库。
Stack<String> stacky = new Stack<>();
队列的实现具有相同的情况。而且,我不知道在哪种情况下使用哪种情况。
一般来说,您永远不应该使用您自己在Java运行时库中已有的东西的实现,因为该代码的测试方式比您的代码可能被测试的方式更多。
另外,一般来说,你永远不应该使用传统的java.util.Stack
类,因为它是synchronized
。正如Stack
的javadoc所说:
Deque
接口及其实现提供了更完整和一致的LIFO堆栈操作集,应优先使用此类。例如:Deque<Integer> stack = new ArrayDeque<Integer>();
无论如何,对于您的问题“在Java中实现堆栈的方式有多少?”,Java运行时库中有5个堆栈实现:
Stack
- 遗产,不推荐ArrayDeque
- 通常是单线程使用的最佳选择ConcurrentLinkedDeque
- 通常是多线程使用的最佳选择LinkedBlockingDeque
- 如果你需要堆栈的大小限制LinkedList
- 如果堆栈可以变大,并且您希望在收缩时回收空间
当然,任何List
实现都可以用作堆栈,但没有方便的方法,例如对于ArrayList
,你想用list.add(list.size(), e)
将元素推到“堆栈”上。
在生产代码中,您始终可以使用Java库中提供的实现。自己实现它的唯一原因是出于教育目的(了解数据结构内部如何工作)。
作为Java一部分的实现(如java.util.Stack
,java.util.ArrayList
等)经过了充分测试,并且已知可以很好地工作,并且可以轻松地包含在任何项目中。另一方面,您自己的实现更有可能包含错误,并且代码将不具有可移植性,因为它可能使用非标准功能。
以上是关于我什么时候应该使用java.util.Stack vs My Own Implementation? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章