【问题标题】:How is this code snippet swapping Queue contents (Java)?此代码片段如何交换队列内容(Java)?
【发布时间】:2021-09-13 19:58:00
【问题描述】:

这是我写的代码:

public static void main(String[] args) {

    // Why is this snippet actually swapping? 
    Queue<Integer> q1 = new LinkedList<>();
    Queue<Integer> q2 = new LinkedList<>();
    q1.add(10); q1.add(20); q1.add(30);
    q2.add(11); q2.add(22); q2.add(33);
    System.out.println("q1 before name swap --> " + q1);
    System.out.println("q2 before name swap --> " + q2);
    Queue<Integer> temp = q1;
    q1 = q2;
    q2 = temp;
    System.out.println("q1 after name swap --> " + q1);
    System.out.println("q2 after name swap --> " + q2);
}

这是我得到的输出:

q1 before name swap --> [10, 20, 30]   
q2 before name swap --> [11, 22, 33]   
q1 after name swap --> [11, 22, 33]  
q2 after name swap --> [10, 20, 30]

即使考虑了很长时间,我似乎也无法理解为什么这段代码实际上会交换队列。 temp 不应该也存储 q2 的内容,就像我写的temp = q1 然后q1 = q2 一样?也就是说,由于 Queue 在 Java 中是非原始/引用数据类型,因此对 q1 的更改不应该也反映在 temp 上吗?

【问题讨论】:

  • 假设 q1 引用对象 A,q2 对象 B。然后在 temp = q1 temp 和 q1 引用对象 A 之后,q2 对象 B。在 q1 = q2 temp 之后仍然引用 A,q1 和 q2 引用 B。在q2 = temp temp 和 q2 引用 A 之后,q1 引用 B。
  • @DietmarHöhmann 谢谢,明白了!

标签: java reference queue swap


【解决方案1】:

队列确实是非原始或参考数据类型。

示例中有 3 个队列(q1、q2 和 temp)。

您执行以下操作

  • 您将 q1 分配给 [10, 20, 30],将 q2 分配给 [11, 22, 33]。 q1 和 q2 的值存储在内存中。
  • 然后将 temp 分配给 q1,temp 值现在为 [10, 20, 30]。此时,如果您修改 temp 或 q1,那么它们都会改变。
  • 然后将 q1 分配给 q2,q1 开始指向 q2 的引用,现在 q1 的值为 [11, 22, 33]
  • 然后将 q2 分配给 temp,q2 开始指向 temp 的引用,现在 q2 的值为 [10, 20, 30]

您基本上是在使用 q1=q2 和 q2=temp 而不是值来更改引用。

希望这会有所帮助。

【讨论】:

  • 感谢清晰的解释,我终于明白是怎么回事了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2019-11-19
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多