zoukankan      html  css  js  c++  java
  • JDK的一个关于stack的小bug

    在一个项目中,使用了一个java.util.Stack,总所周知,栈是先入后出的,那么遍历其中元素的时候,也应该按照这个顺序遍历才对,但是实际情况确不是,以下是测试代码。

    Stack stack = new Stack();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    for (Object i : stack) {
        System.out.println(i);
    }

    输出顺序是1,2,3,并不是期望的3,2,1。

    原因

    这其实是一个JDK中的bug,http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4475301 里有很详细的说明了,大意就是Stack继承了java.util.Vector,所以用的Vector中的iterator,所以在遍历元素的时候会按照FIFO的顺序遍历元素。原文如下:

    It was an incorrect design decision to have Stack extend Vector ("is-a" rather than "has-a"). We sympathize with the submitter but cannot fix this because
    of compatibility.

    解决办法

    1. 不要用for循环,如下这种方式遍历Stack,注意这样遍历完一次,stack就空了。

    while (!stack.isEmpty()) {
          Object o = stack.pop();
          System.out.println(o);
    }

    2. 使用Deque示例,示例代码如下:

    Deque<Integer> stack2 = new ArrayDeque<Integer>();
        stack2.push(1);
        stack2.push(2);
        stack2.push(3);
        for (Integer i : stack2) {
            System.out.println(i);
        }

    后继

    写了这么久的代码,第一次碰到JDK的BUG,特此纪念一下。

  • 相关阅读:
    shell语句for循环
    ls命令详解
    计算机相关概念总结(3)
    计算机相关概念总结(2)
    计算机相关概念总结(1)
    devops的概念
    jenkins无法连接gitlab
    Jenkins创建镜像后无法推送到harbor的问题
    Jenkins+gitlab+maven持续集成
    jenkins打完包在哪里
  • 原文地址:https://www.cnblogs.com/javanerd/p/6646307.html
Copyright © 2011-2022 走看看