我有一个非常小的程序:
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
queue.add("one");
queue.add("two");
queue.add("tree");
printQueue(queue);
customizeQueue(queue);
printQueue(queue);
}
private static void customizeQueue(Queue<String> queue) {
queue.add("four");
queue.add("five");
printQueue(queue);
}
private static void printQueue(Queue<String> queue) {
for(String s: queue){
System.out.print(s + " ");
}
System.out.println();
}
我期待输出:
one two tree
one two tree four five
one two tree
但是我得到了:
one two tree
one two tree four five
one two tree four five
我不确定为什么会这样。我是否传递了LinkedList实例的引用?有人可以澄清为什么我没有得到我预期的输出。
答案 0 :(得分:4)
所有类型都是通过Java中的值传递的。但是,您传递的不是对象,而是对象的引用。这意味着在传递引用时不会创建整个队列的副本,而只会创建引用的副本。新创建的引用仍然属于同一个对象,因此当您执行queue.add()
时,元素将添加到实际对象中。另一方面,重新分配函数queue = new LinkedLIst<String>()
中的引用对调用函数中的引用没有影响。
答案 1 :(得分:1)
通过Java引用传递对象。只有基元类型按值传递。
答案 2 :(得分:0)
你没有传递队列的副本,你正在传递自己的队列。因此,当它被修改时,更改不仅限于自定义调用,而是影响所有内容。