我有一个使用Stack数据结构的大型代码库(由我编写)。这是为了方便使用,我有时使用它作为Stack或其他时间使用Vector / List。
经过绩效考核后,我们决定不再为同步安全支付额外费用。我现在需要用非同步的结构替换这个结构(在代码中很多次提到它。)
我很高兴发现Apache集合包含ArrayStack,这正是我想要的(与Java堆栈相同但非同步)。然而,这不是现代Java 5代码(这是我使用的)的泛型。我不打算将我的代码转换为Java 1.4
那么Java Stack是否还有其他Java 5兼容替代品,还是我需要自己编写?
更新
我使用LinkedList和调整的“pop”/“push”方法。
答案 0 :(得分:8)
当你说“符合Java 5”时 - ArrayDeque<T>
在Java 6之前没有到达,但听起来就像你所追求的那样(当然在适当时使用Deque<T>
接口)。您可以在需要时将其用作堆栈,或者将其用作更合适的队列......基本上只需调用适当的方法。
答案 1 :(得分:1)
在您的特殊情况下(实际上仅在这种情况下),我只需将从开源Java SE实现中复制并粘贴到您自己的包中,并删除所有已同步关键字。您可能想要添加extends java.util.Stack
。现在,您只需要更改代码中的导入声明。
我确实知道,通常复制代码并不是一个好主意,但这就是为什么这不适用于这种情况:
pop()
和push()
语义非常适合当前代码,那么仅仅因为性能考虑因素而不会改变。双端队列或链表的语义是不同的(它们允许从两侧添加/删除)。java.util.Stack
的同步开销无法通过子类化(调用super
方法)或委派等其他技术删除。一般来说,使用java.util.Stack
就好像它是一个接口,而不是在代码中使用new Stack()
,而是通过使用工厂来实例化它会好得多。