2

コード:

    Stack<Integer> firstStack = new Stack<Integer>();
    Stack<Integer> secondStack = firstStack;

    firstStack.push(1);
    firstStack.push(2);

    secondStack.pop();
    System.out.println(firstStack.pop());

私の質問は、firstStackがスタックの最後のアイテムを参照し、secondStackもこのアイテムを参照する場合、secondStackからポップすると、firstStackは(前の)最後のアイテム(2)を参照し続ける必要があるということです。firstStackの参照が最初のアイテムにも変更されるのはなぜですか?(最初の項目とは:1)

4

4 に答える 4

7

firstStackとは両方ともsecondStack、スタックの最後のオブジェクトではなく、スタック自体を参照します。

あなたがするとき

Stack<Integer> secondStack = firstStack;

あなたが言っているのは:を参照しているスタックオブジェクトを取り、同じオブジェクトを参照firstStackさせてください。secondStackスタックのコピーなどは行われません。

したがって、からポップするとsecondStack、からもポップしfirstStackます。

于 2012-12-04T09:14:40.490 に答える
1

実際、JavaのスタックはVectorクラスを使用して実装されています。

Vectorクラスには次の属性があります(Vectorクラスの実装を確認することでクロスチェックできます)

   protected Object elementData[];
   protected int elementCount;
   protected int capacityIncrement;

したがって、内部的にはデータを配列に格納し、他の2つのクラス属性を使用して増分とカウントを追跡します。したがって、内部的には、firstStacksecondStackの参照は、同じelementData、elementCount、およびcapacityIncrement属性を指します。したがって、一貫した結果が得られます。

于 2012-12-04T09:35:33.580 に答える
0

いいえ。これは、同じを参照してStack objectいる1つと2つの参照です。これを参照する操作は、両方が同じオブジェクトを参照しているため、同じオブジェクトに影響します。firstStack and secondStackStack Object

Stack<Integer> secondStack = firstStack;

これは新しいオブジェクトの作成ではなく、secondStack参照しているものfirstStackを参照します。

于 2012-12-04T09:18:07.803 に答える
0

firstStacksecondStackは実際のStackオブジェクトへの参照にすぎないため、これらのいずれかでポップ/プッシュを実行しても、同じStackオブジェクトを更新しています。

于 2012-12-04T09:18:36.723 に答える