[英]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.