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 引用了 Stack 中的最后一项,而 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有一个和两个引用firstStack and secondStack都指的是相同的Stack Object。尽管对 this 的任何引用,但任何操作都会影响同一个对象,因为两者都引用同一个对象。

Stack<Integer> secondStack = firstStack;

这不是新的对象创建,secondStack将引用firstStack所指的内容。

于 2012-12-04T09:18:07.803 回答
0

firstStack 并且secondStack只是对实际 Stack 对象的引用,因此即使您在其中任何一个上执行 pop/push,您也正在更新同一个 Stack 对象。

于 2012-12-04T09:18:36.723 回答