大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说Java中使用堆栈类的优点和缺点及可替代方案,希望您对编程的造诣更进一步.
堆栈是非常常见和有用的数据结构,在处理许多问题时都很方便。
在这篇文章中,我们将讨论在Java中使用堆栈类的优点和缺点,并将探讨是否有任何替代方案来克服堆栈类的缺点。
照片:Brooke LarkonUnsplash
首先,让我们回顾一下什么是堆栈?
在计算机科学中,堆栈是一种抽象的数据类型,作为一个元素的集合。它支持两个主要的操作:推和弹。推指 的是将一个元素添加到顶部,弹指 的是将一个元素从顶部移除。
这种从顶部添加和删除元素的原则也被称为LIFO(Last In First Out)。
首先,让我们来介绍一下堆栈类的不足之处
1.堆栈是一个类,而不是像其他常见的数据结构一样是一个接口。
接口数据结构的好处是,一个类可以实现多个接口,但不能继承多个类。
因此,如果你想建立一个自定义的堆栈类,而你已经扩展了一些父类,那么你就不能扩展堆栈类。
因此,从面向对象的设计角度来看,接口数据结构提供了更多的灵活性。
2.堆栈类扩展了矢量类
是的,我也很震惊 。
理想情况下,Stack类应该只支持push()、pop()、peek()和empty()等操作。但是由于Stack是一个子类 矢量类的子类,它也有能力通过索引访问、插入 和删除 一个元素。(你可以在这里查看它支持的所有方法)。
这基本上打破了LIFO的定义。
例如,这个代码块工作正常。它打印出12。
import java.util.Stack;
public class StackDemo {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.add(0, 10);
stack.push(12);
System.out.println(stack.get(1));
}
}
3.现在,让我们来谈谈迭代的问题
回顾一下,在这篇文章的开头,我们讨论了Stack数据结构遵循LIFO原则(意思是后进先出)。
因此,如果我们对Stack对象进行迭代,我们会认为它是从上到下的(就像一叠盘子一样),但事实并非如此。
让我们通过一个例子来理解这个问题。
import java.util.Stack;
public class StackDemo {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
for (int item: stack) {
System.out.println(item);
}
}
}
这个代码块的输出是
上述代码块的输出。
但是根据后进先出的原则,它应该是3,2,1吧。
如何克服这些缺点呢?
有一个叫Deque 的接口可以克服上述的大部分缺点。让我们详细地看一下例子。
1.首先,它是一个接口
Deque是一个接口,所以我们可以灵活地创建自定义的Stack类,它可以继承 其他的类,实现 其他的接口,在此基础上还可以实现Deque接口。
2.不允许通过索引访问、插入和删除元素
Deque不允许通过其索引来访问、插入和删除元素。但由于它是一个双端队列,它支持从两端插入和删除。
因此,即使Deque不遵循后进先出的原则,但它显然比Stack类要好,Stack类曾经允许基于索引的插入/删除。
3.Deque在迭代中遵循LIFO顺序
当我们迭代一个Deque实例时,它从上到下迭代,就像堆栈数据结构所期望的那样。
让我们通过一个例子来理解这一点。
import java.util.Stack;
public class StackDemo {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
for (int item: stack) {
System.out.println(item);
}
}
}
这个代码块的输出是。
上述代码块的输出
我们可以看到它是从上到下的。
因此,总的来说,我们可以观察到,使用Deque来实现堆栈数据结构更有意义。
但有一点需要注意的是。让我们来谈谈这个问题。
多线程
由于Stack类是Vector的一个子类,而Vector类是同步的 ,因此即使Stack类也是同步的。
另一方面,Deque接口不是线程安全的。
因此,如果线程安全是一个问题,我们应该坚持使用Stack类,因为它仍然可以完成我们现在所知道的一些注意事项的工作。
我强烈建议你浏览一下上述主题的Java文档。
- docs.oracle.com/javase/8/do…
- docs.oracle.com/javase/8/do…
- docs.oracle.com/javase/7/do…
- docs.oracle.com/javase/7/do…
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36684.html