[英]Stack Overflow in Java with the Stack implementation in Collections-Java
我有一个与Java的Collections框架中的Stack实现有关的问题。
StackOverflowError
并且最终Stack达到大小并且发生OutOfMemoryError
? Vector
类,因为它可以同步每个操作,正如Jon Skeet在此处指出的那样: Java Vector是否被弃用? 那么,在这之后,在现实生活中我将使用该Java类吗? 我不想在每个操作上都进行同步,并且不想在一系列操作上进行同步。 有人可以提供现实生活中的情况/示例吗?
首先,您不应该使用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文档中所看到的:
由于应用程序递归过深而在堆栈溢出时抛出。
堆栈,即java.util.Stack
的数据结构,可以增长。 但是,Java中的方法调用堆栈不能。 因此,它可能会溢出,从而调用StackOverflowError
。 这种情况主要发生在处理递归时,但是如果您不太谨慎的话,也可能发生在其他地方。
这里在java.util.Stack
和java方法调用堆栈之间有重要的区别。 一个拥有一系列泛型,而另一个则是JVM固有的。 当方法退出以返回上一个方法时使用后者。
我从未听说有人无意中溢出了JVM的堆栈,除非他们正在递归上工作。
不要使用Vector
。 那里有更好的课程。 您也可以只使用ArrayList
并保持其访问同步 。
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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.