使用Collections-Java中的Stack实现在Java中进行Stack Overflow

时间:2013-04-25 05:23:03

标签: java algorithm collections

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

  1. 我可以从实现中看到Stack的大小可以增长。这是否意味着StackOverflowError永远不会发生,最终Stack会达到一个大小而OutOfMemoryError会发生?
  2. 从谷歌搜索我发现Vector类已被弃用,因为它同步了每个操作,如Jon Skeet在此指出:Is Java Vector deprecated?
  3. 那么,在这之后我会使用这个Java类吗?我不想在每个操作上进行同步,并且希望在一堆操作上进行同步。有人可以给出真实的生活情况/例子。

3 个答案:

答案 0 :(得分:3)

首先,您不应该使用java.util.Stack,就像您不应该使用Vector一样 - 它们都是遗留的集合类,它们被Deque和{{1自Java版本1.2以来。请注意ArrayList的API文档说明:

  

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

请注意,Stack扩展了StackOverflowError,而不是ErrorException。如果JVM中存在一些内部错误,则仅抛出错误 - 它们通常不会被Java类抛出。

仅当方法调用堆栈溢出时才抛出

RuntimeException;它与StackOverflowError没有任何关系。

正如您在java.util.Stack的API文档中所看到的那样:

  

当由于应用程序过于冗长而发生堆栈溢出时抛出。

答案 1 :(得分:2)

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

java.util.Stack和java方法调用堆栈之间存在重要区别。一个拥有一系列泛型,另一个是JVM固有的。当方法退出以返回上一个方法时使用后者。

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

请勿使用Vector。那里有更好的课程。您也可以使用ArrayListkeep its access synchronized

答案 2 :(得分:1)

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

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