在Java中传递值(队列)会产生意外的输出

时间:2012-04-08 21:16:51

标签: java queue pass-by-reference pass-by-value

我有一个非常小的程序:

    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实例的引用?有人可以澄清为什么我没有得到我预期的输出。

3 个答案:

答案 0 :(得分:4)

所有类型都是通过Java中的值传递的。但是,您传递的不是对象,而是对象的引用。这意味着在传递引用时不会创建整个队列的副本,而只会创建引用的副本。新创建的引用仍然属于同一个对象,因此当您执行queue.add()时,元素将添加到实际对象中。另一方面,重新分配函数queue = new LinkedLIst<String>()中的引用对调用函数中的引用没有影响。

答案 1 :(得分:1)

通过Java引用传递对象。只有基元类型按值传递。

答案 2 :(得分:0)

你没有传递队列的副本,你正在传递自己的队列。因此,当它被修改时,更改不仅限于自定义调用,而是影响所有内容。