【问题标题】:Pass by Value (Queue) in Java gives an unexpected outputJava中的按值传递(队列)给出了意外的输出
【发布时间】:2012-04-08 21:16:51
【问题描述】:

我有一个非常小的程序:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-11
          • 2013-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-21
          • 2016-11-01
          相关资源
          最近更新 更多