0

Java の Collections フレームワークの Stack 実装に関連する質問があります。

  1. 実装から、スタックのサイズが大きくなることがわかります。StackOverflowErrorこれは、 a が発生することはなく、最終的にスタックがサイズに達して a が発生することを意味しOutOfMemoryErrorますか?
  2. Vectorグーグルから、Jon Skeetがここで指摘したように、すべての操作を同期するため、クラスが非推奨であることがわかりました: Is Java Vector deprecated?

では、この後、この Java クラスを使用する実際のシナリオはありますか? すべての操作で同期するのではなく、一連の操作で同期したい。誰かが実際の状況/例を挙げてもらえますか?

4

3 に答える 3

3

まず第一に、 を使用すべきではないjava.util.Stackのと同じように、 を使用すべきではありません。これらは両方ともJava バージョン 1.2 以降にVector置き換えられたレガシー コレクション クラスです。の API ドキュメントには次のように記載されていることに注意してください。DequeArrayListStack

Deque インターフェイスとその実装によって、より完全で一貫性のある LIFO スタック操作のセットが提供されます。これは、このクラスより優先して使用する必要があります。

orではなく、 StackOverflowErrorextendsであることに注意してください。エラーは、JVM に何らかの内部エラーがある場合にのみスローされます。通常、Java クラスによってスローされることはありません。ErrorExceptionRuntimeException

StackOverflowErrorメソッド呼び出しスタックがオーバーフローした場合にのみスローされます。とは何の関係もありませんjava.util.Stack

のAPIドキュメントでわかるようにStackOverflowError

アプリケーションの再帰が深すぎるためにスタック オーバーフローが発生した場合にスローされます。

于 2013-04-25T05:38:14.937 に答える
2

を通るデータ構造であるスタックは、java.util.Stack大きくなる可能性があります。ただし、Java のメソッド呼び出しスタックはできません。したがって、オーバーフローして a を呼び出す可能性がありStackOverflowErrorます。これは主に再帰を処理するときに発生しますが、注意しないと他の場所でも発生する可能性があります。

ここで、java.util.Stackと Java メソッド コール スタックの間に重要な違いがあります。1 つはジェネリックの配列を保持し、もう 1 つは JVM 固有のものです。後者は、メソッドが終了して前のメソッドに戻るときに使用されます。

再帰に取り組んでいる場合を除き、意図せずに JVM のスタックをオーバーフローさせたという話は聞いたことがありません。

使用しないでくださいVector。もっと良いクラスは他にもあります。を使用して、そのアクセスを同期させておくArrayListこともできます。

于 2013-04-25T05:30:49.290 に答える