我有一个与Java集合框架中的Stack实现相关的问题。
StackOverflowError
永远不会发生,最终Stack会达到一个大小而OutOfMemoryError
会发生?Vector
类已被弃用,因为它同步了每个操作,如Jon Skeet在此指出:Is Java Vector deprecated? 那么,在这之后我会使用这个Java类吗?我不想在每个操作上进行同步,并且希望在一堆操作上进行同步。有人可以给出真实的生活情况/例子。
答案 0 :(得分:3)
首先,您不应该使用java.util.Stack
,就像您不应该使用Vector
一样 - 它们都是遗留的集合类,它们被Deque
和{{1自Java版本1.2以来。请注意ArrayList
的API文档说明:
Deque接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应优先使用该类。
请注意,Stack
扩展了StackOverflowError
,而不是Error
或Exception
。如果JVM中存在一些内部错误,则仅抛出错误 - 它们通常不会被Java类抛出。
RuntimeException
;它与StackOverflowError
没有任何关系。
正如您在java.util.Stack
的API文档中所看到的那样:
当由于应用程序过于冗长而发生堆栈溢出时抛出。
答案 1 :(得分:2)
堆栈,数据结构,java.util.Stack
,可以增长。但是,Java中的方法调用堆栈不能。因此它可以溢出,调用StackOverflowError
。这主要发生在处理递归时,但如果你不太小心,可能会发生在其他地方。
java.util.Stack
和java方法调用堆栈之间存在重要区别。一个拥有一系列泛型,另一个是JVM固有的。当方法退出以返回上一个方法时使用后者。
我从来没有听说过任何人无意中溢出JVM的堆栈,除非他们正在进行递归。
请勿使用Vector
。那里有更好的课程。您也可以使用ArrayList
和keep its access synchronized。
答案 2 :(得分:1)
StackOverflowError
与java.util.Stack
无关。只要有空闲内存,java.util.Stack
就会增长,或者OutOfMemoryError
被抛出。
在新的应用程序中,无需使用Vector
或Stack
。使用ArrayList
或ArrayDeque
。您很少需要Vector
提供的线程安全性,如果您这样做,请使用Collections.synchronizedList
或LinkedBlockingDeque
。但是,从HotSpot JVM 1.6开始,这不再是问题,例如请参见:http://www.ibm.com/developerworks/java/library/j-jtp10185/