【发布时间】: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 = q1temp 和 q1 引用对象 A 之后,q2 对象 B。在q1 = q2temp 之后仍然引用 A,q1 和 q2 引用 B。在q2 = temptemp 和 q2 引用 A 之后,q1 引用 B。 -
@DietmarHöhmann 谢谢,明白了!