首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java.util.Stack的Iterator中有bug吗?

Java.util.Stack的Iterator中有bug吗?
EN

Stack Overflow用户
提问于 2013-06-07 20:52:31
回答 8查看 11.7K关注 0票数 45

今天,我试图推入java.util.Stack类,然后使用Iterator迭代(不使用pop)遍历这些项。我本来想要LIFO的,但很惊讶。

这是我试过的密码。

代码语言:javascript
复制
import java.util.*;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        RobStack<Integer> rstack = new RobStack<Integer>(); // Correct Implementation
        Stack<Integer> jstack = new Stack<Integer>(); // Default Java Implementation
        rstack.push(0); jstack.push(0);
        rstack.push(1); jstack.push(1);
        rstack.push(2); jstack.push(2);
        rstack.push(3); jstack.push(3);

        System.out.print("Algo Stack: ");
        for (int i : rstack)
            System.out.print(i + " ");
        System.out.print("\nJava Stack: ");
        for (int i : jstack)
            System.out.print(i + " ");
    }

}

上述程序的输出如下:

代码语言:javascript
复制
Algo Stack: 3 2 1 0 
Java Stack: 0 1 2 3 

在上面的代码中,jstack使用默认的Java实现,而rstack对他的算法类使用Robert Sedgewick提供的实施。我发现罗伯特教授的实现很好,但是java.util.Stack实现失败了。

它是bug还是design

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-06-07 20:58:24

错误ID 4475301 : RFE: java.util.Stack.iterator()以错误的方式迭代。这种行为是由(坏的)设计造成的。Java的内置Stack迭代器方法是从其他类继承的,因此它们的行为不像您所期望的那样。

票数 34
EN

Stack Overflow用户

发布于 2014-12-15 19:33:06

你应该用Deque而不是Stack。

代码语言:javascript
复制
Deque<Integer> stack = new ArrayDeque<Integer>();

见Oracle Doc

票数 13
EN

Stack Overflow用户

发布于 2013-06-07 21:01:30

从原则上讲,您不应该在Stack上迭代,而应该只从顶部推或从顶部弹出。至于实际的实现,大多数语言,包括Java,都使用另一个collection type来实现Stack。从严格的要求来看,它应该允许恒定时间的push, top and pop操作。

任何附加的特性(或本例中的bug )都应该被忽略,而不是依赖于编码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16992758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档