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,特此纪念一下。

 

posted @   JavaNerd  阅读(324)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示