是否存在未同步的Java Stack的替代品?

时间:2011-02-16 09:46:40

标签: java data-structures stack

我有一个使用Stack数据结构的大型代码库(由我编写)。这是为了方便使用,我有时使用它作为Stack或其他时间使用Vector / List。

经过绩效考核后,我们决定不再为同步安全支付额外费用。我现在需要用非同步的结构替换这个结构(在代码中很多次提到它。)

我很高兴发现Apache集合包含ArrayStack,这正是我想要的(与Java堆栈相同但非同步)。然而,这不是现代Java 5代码(这是我使用的)的泛型。我不打算将我的代码转换为Java 1.4

那么Java Stack是否还有其他Java 5兼容替代品,还是我需要自己编写?

更新

我使用LinkedList和调整的“pop”/“push”方法。

2 个答案:

答案 0 :(得分:8)

当你说“符合Java 5”时 - ArrayDeque<T>在Java 6之前没有到达,但听起来就像你所追求的那样(当然在适当时使用Deque<T>接口)。您可以在需要时将其用作堆栈,或者将其用作更合适的队列......基本上只需调用适当的方法。

答案 1 :(得分:1)

在您的特殊情况下(实际上仅在这种情况下),我只需将从开源Java SE实现中复制并粘贴到您自己的包中,并删除所有已同步关键字。您可能想要添加extends java.util.Stack。现在,您只需要更改代码中的导入声明。

我确实知道,通常复制代码并不是一个好主意,但这就是为什么这不适用于这种情况:

  • 如果Stack的pop()push()语义非常适合当前代码,那么仅仅因为性能考虑因素而不会改变。双端队列或链表的语义是不同的(它们允许从两侧添加/删除)。
  • java.util.Stack的同步开销无法通过子类化(调用super方法)或委派等其他技术删除。
  • 最好复制经过良好测试的代码(只要许可证允许),而不是从头开始重写。

一般来说,使用java.util.Stack就好像它是一个接口,而不是在代码中使用new Stack(),而是通过使用工厂来实例化它会好得多。