2013-04-25 226 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/