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