2013-04-25 174 views
0

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

  1. 我可以从实现中看到栈的大小可以增长。这是否意味着StackOverflowError永远不会发生,并最终堆栈达到一个尺寸,并发生OutOfMemoryError
  2. 从谷歌上搜索我发现Vector类废弃了,因为它同步,每一个操作乔恩斯基特在此间指出,Is Java Vector deprecated?

所以,在此之后有没有真实的生活场景,我会用这个Java类?我不想在每一个操作上同步,并且想要在一堆操作上同步。有人可以给出一个真实的生活情况/例子。

+2

当调用堆栈变得太大并且没有其他原因时,会引发'StackOverflowError'。被称为Stack的数据结构是不同的。 – Patashu 2013-04-25 05:26:58

+0

一个stackoverflow肯定会发生。至于矢量的用例,我很难想到一个 – kolossus 2013-04-25 05:27:00

+1

注意java.util.Stack'的API文档说:“一个更完整和一致的LIFO堆栈操作集由Deque接口提供和它的实现,应该优先使用这个类。“ – Jesper 2013-04-25 05:30:54

回答

2

堆栈,数据结构,经过java.util.Stack,可以增长。但是,Java中的方法调用堆栈不能。它因此可以溢出,调用StackOverflowError。这主要发生在处理递归时,但如果你不太小心,可能发生在其他地方。

java.util.Stack和java方法调用堆栈之间有一个重要的区别。一个拥有一组泛型,另一个是JVM固有的。当方法退出时返回到前一个方法时使用后者。

我从来没有听说过任何人无意中溢出了JVM的堆栈,除非他们正在处理递归。请使用Vector。那里有更好的课程。您也可以使用ArrayListkeep its access synchronized

+1

也许最好解释一下调用堆栈与java.util.Stack没有任何关系,并且StackOverflowError与java.util.Stack没有任何关系。 – Jesper 2013-04-25 05:32:59

+0

@Jesper Job完成了。 – Zyerah 2013-04-25 05:35:39

+0

在调用堆栈和堆栈数据结构之间发生混淆。 – Madusudanan 2013-04-25 05:51:03

3

首先,你不应该使用java.util.Stack,就像你不应该使用Vector - 它们是由DequeArrayList自从Java 1.2版本替换这两个传统的集合类。需要注意的是Stack的API文档说:

更完整和一致的LIFO堆栈操作是由双端队列接口和它的实现,应优先使用这个类提供。

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

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

如你的StackOverflowError API文档中看到:

时发生堆栈溢出,因为应用程序递归太深而引发。

+0

谢谢你帮我解决问题。希望我能把两个答案都标记为已接受的答案。 – Madusudanan 2013-04-25 06:01:37

1

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

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