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
