此代码片段如何交换队列内容 (Java)?

How is this code snippet swapping Queue contents (Java)?

这是我写的代码:

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?也就是说,不应该对 q1 的更改也反映在 temp 上,因为 Queue 是 Java 中的 non-primitive/reference 数据类型?

队列确实是非原始或引用数据类型。

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

您执行以下操作

  • 您将 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 而不是值来更改引用。

希望这对您有所帮助。