【问题标题】:How Java keeps reference to a Stack?Java 如何保持对堆栈的引用?
【发布时间】:2012-11-21 20:56:49
【问题描述】:

代码:

    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)

【问题讨论】:

  • 标准java。你有一个有两个名字的对象。
  • 我知道这一点。我的问题是这如何工作? firstStack 指向的元素如何变化?这怎么可能?
  • 感谢所有答案,但这并不是我真正想要问的。我想我需要问一个更详细的问题来表达自己。
  • 请看:stackoverflow.com/questions/13699861/… 谢谢大家回答问题。

标签: java data-structures stack


【解决方案1】:

firstStacksecondStack 都引用堆栈本身,而不是堆栈中的最后一个对象。

当你这样做时

Stack<Integer> secondStack = firstStack;

你是说:取firstStack 引用的堆栈对象,让secondStack 引用同一个对象。没有完成堆栈的复制或类似操作。

因此,如果您从secondStack 弹出,您也会从firstStack 弹出。

【讨论】:

  • 我知道这一点,并感谢您的明确回答。我的问题是。当我从 secondStack 弹出时,它怎么说“更改 firstStack 引用的内容”?堆栈中的所有元素是否也都引用了 Stack 引用?
  • @KorayTugay:我认为问题是你还没有理解答案。只有一层!
  • @carlosdc 什么是堆栈?只是一个引用了它只包含的第一个元素的对象。当您将另一个元素压入堆栈时,第一个元素现在保存对堆栈中前一个元素的引用,而您的 Stack 引用本身现在保存对新对象的引用。当你推动另一个物体时,......好吧,你明白了。我100%理解答案。我不明白的是,firstStack的引用也发生了变化。问题实际上更多的是关于 Stack 的实现!
  • @KorayTugay Stack 是一个 Java 类。请想象它的名字实际上是Klomp,看看你是否理解得更好。
  • @Marko Topolnik 我对名称没有任何问题。我的问题显然不够清楚。我再问一个问题。
【解决方案2】:

实际上java中的stack是使用Vector类实现的。

Vector 类具有以下属性(您可以通过查看 Vector 类的实现来交叉检查)

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

因此,它在内部将数据存储在一个数组中,并使用其他 2 个类属性来跟踪增量和计数。因此,在内部,您的 firstStacksecondStack 引用指向相同的 elementData、elementCount 和 capacityIncrement 属性。因此,您可以获得一致的结果。

【讨论】:

  • 感谢您理解并回答我的问题。
【解决方案3】:

没有。这里Stack object 是一个和两个引用firstStack and secondStack 都引用相同的Stack Object。尽管对 this 的任何引用,但任何操作都将影响同一个对象,因为两者都引用同一个对象。

Stack<Integer> secondStack = firstStack;

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

【讨论】:

    【解决方案4】:

    firstStacksecondStack 只是对实际 Stack 对象的引用,因此即使您对其中任何一个执行 pop/push,您也会更新同一个 Stack 对象。

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2015-06-12
      相关资源
      最近更新 更多