0

我有一个与 Java 中的 Collections 框架中的 Stack 实现有关的问题。

  1. 我可以从实现中看到 Stack 的大小可以增长。这是否意味着 aStackOverflowError永远不会发生并且最终 Stack 达到一个大小并OutOfMemoryError发生 an?
  2. 通过谷歌搜索,我发现Vector该类已被弃用,因为它同步了 Jon Skeet 在此处指出的每个操作:Java Vector 是否已弃用?

那么,在此之后是否有任何现实生活场景中我会使用这个 Java 类?我不想在每个操作上同步,而是想在一堆操作上同步。有人可以给出一个真实的生活情况/例子。

4

3 回答 3

3

首先,你不应该使用java.util.Stack,就像你不应该使用一样- 它们都是遗留的集合类,Vector被Java 1.2 版本取代。请注意,它的 API 文档说:DequeArrayListStack

Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用此类。

请注意,StackOverflowError扩展Error,而不是ExceptionRuntimeException。仅当 JVM 中存在一些内部错误时才会引发错误——它们通常不会由 Java 类引发。

StackOverflowError仅在方法调用堆栈溢出时抛出;它与 没有任何关系java.util.Stack

正如您在以下 API 文档中看到的StackOverflowError

当由于应用程序递归太深而发生堆栈溢出时引发。

于 2013-04-25T05:38:14.937 回答
2

堆栈,即数据结构,经过java.util.Stack,可以增长。但是,Java 中的方法调用堆栈不能。因此它可能会溢出,调用StackOverflowError. 这主要发生在处理递归时,但如果您不太小心,可能会发生在其他地方。

这里java.util.Stack和 java 方法调用栈有一个重要的区别。一个拥有一组泛型,另一个是 JVM 固有的。当方法退出以返回前一个方法时使用后者。

我从来没有听说过有人无意中溢出了 JVM 的堆栈,除非他们正在处理递归。

不要使用Vector. 那里有更好的课程。您也可以只使用 anArrayList保持其访问同步

于 2013-04-25T05:30:49.290 回答
1

StackOverflowError无关java.util.Stackjava.util.Stack只要有空闲内存或被OutOfMemoryError抛出,就会增长。

在新应用程序中,无需使用VectorStack。使用ArrayListArrayDeque。您很少需要 提供的线程安全Vector,如果需要,请使用Collections.synchronizedListor LinkedBlockingDeque。但是,从 HotSpot JVM 1.6 开始,这不再是问题,请参见此处的示例:http: //www.ibm.com/developerworks/java/library/j-jtp10185/

于 2013-04-25T06:09:23.603 回答