Java中的堆栈溢出与集合中的堆栈实现

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

  • 从实现中我可以看到堆栈的大小可以增长。 这是否意味着StackOverflowError永远不会发生,并最终堆栈达到一个大小,并发生OutOfMemoryError
  • 从Google搜索中我发现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以来,它们被DequeArrayList所取代。 请注意, Stack的API文档说:

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

    请注意, StackOverflowError扩展Error ,而不是ExceptionRuntimeException 。 只有在JVM中存在内部错误时才会抛出错误 - 它们通常不会被Java类抛出。

    只有当方法调用堆栈溢出时,才会抛出StackOverflowError ; 它与java.util.Stack没有任何关系。

    正如你可以在StackOverflowError的API文档中看到的那样:

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


    StackOverflowErrorjava.util.Stack无关。 只要有空闲内存,或者OutOfMemoryErrorjava.util.Stack就会增长。

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

    链接地址: http://www.djcxy.com/p/76145.html

    上一篇: Stack Overflow in Java with the Stack implementation in Collections

    下一篇: C++: std::vector with space reserving for both ends