繁体   English   中英

Java中的Stack Overflow和Collections-Java中的Stack实现

[英]Stack Overflow in Java with the Stack implementation in Collections-Java

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

  1. 从实现中可以看到,堆栈的大小可以增加。 这是否意味着永远不会发生StackOverflowError并且最终Stack达到大小并且发生OutOfMemoryError
  2. 从谷歌搜索中,我发现不赞成使用Vector类,因为它可以同步每个操作,正如Jon Skeet在此处指出的那样: Java Vector是否被弃用?

那么,在这之后,在现实生活中我将使用该Java类吗? 我不想在每个操作上都进行同步,并且不想在一系列操作上进行同步。 有人可以提供现实生活中的情况/示例吗?

首先,您不应该使用java.util.Stack ,就像您不应该使用Vector -它们都是遗留集合类,自Java 1.2版以来,它们已由DequeArrayList取代。 请注意, Stack的API文档说:

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

请注意, StackOverflowError扩展了Error ,而不是ExceptionRuntimeException 仅在JVM中发生内部错误时才引发错误-Java类通常不会引发错误。

仅当方法调用堆栈溢出时,才引发StackOverflowError 它与java.util.Stack没有任何关系。

如您在StackOverflowError的API文档中所看到的:

由于应用程序递归过深而在堆栈溢出时抛出。

堆栈,即java.util.Stack的数据结构,可以增长。 但是,Java中的方法调用堆栈不能。 因此,它可能会溢出,从而调用StackOverflowError 这种情况主要发生在处理递归时,但是如果您不太谨慎的话,也可能发生在其他地方。

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

我从未听说有人无意中溢出了JVM的堆栈,除非他们正在递归上工作。

不要使用Vector 那里有更好的课程。 您也可以只使用ArrayList保持其访问同步

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM