簡體   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