Java Collection API不一致

时间:2011-11-15 02:51:51

标签: java

首先,我无法找到Stack数据结构的接口。它存在,但我找到的那个扩展了一个我试图避免使用的Vector。所以,如果你真的需要一个堆栈,你会建议我实现我自己的堆栈类,它在内部有一个ArrayDeque,或者你会建议我使用扩展Vector的Stack类吗?我很失望Java中没有一个好的Stack接口。

其次,Queue提供,添加(e),remove()和element()方法。最重要的是,它们还提供offer(e),poll()和peek()方法。前者抛出异常,而后者返回true或false或null。如果您要使用的队列用于非并发案例,您会使用哪一个?

3 个答案:

答案 0 :(得分:3)

回答您的第一个“问题:”Is there a drop-in replacement for Java Stack that is not synchronized?


第二个问题:(我不得不说,但是)RTFD。的严重。

  

public interface Queue<E> extends Collection<E>

     

...这些方法中的每一种都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(null或false,具体取决于操作)。后一种形式的插入操作专门用于容量限制的队列实现;在大多数实现中,插入操作不会失败。

http://download.oracle.com/javase/7/docs/api/java/util/Queue.html

这两种方法都与并发无关。它们只是允许您在两种编程风格之间进行选择(希望您是一致的!):您是否要检查返回值或捕获异常?

答案 1 :(得分:0)

Deque<E> Q = new LinkedList<E>();
Q.add(e);
Q.remove();
Q.element();

Deque<E> S = new LinkedList<E>();
S.push(e);
S.pop();
S.peek();

我想我宁愿在常见场景中使用这些方法。 当我不得不担心运行时的操作成功(例如,并发情况)时,我会去提供(E e,TimeUnit超时)和poll(TimeUnit超时)用法。

答案 2 :(得分:0)

如果JDK集合API不能完全满足您的需求,请尝试Apache Commons Collections API

来自符合您要求的Apache ArrayStack文档:

Stack API的实现,它基于ArrayList而不是Vector,因此不会同步以防止多线程访问。因此,在您不需要担心多线程争用的环境中,实现运行速度更快