当前位置: 首页 > 面试题库 >

Java for按值或按引用循环

令狐翰
2023-03-14
问题内容

我在我的代码中发现了一个问题。首先是代码:

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] blablubb = { "a", "b", "c" };

        for(String s : blablubb) {
            s = "over";
        }
        printArray(blablubb);


        for (int i = 0; i < blablubb.length; i++) {
            blablubb[i] = "over";
        }
        printArray(blablubb);

    }

    public static void printArray(String[] arr) {
        for( String s : arr ) {
            System.out.println(s);
        }
    }

}

输出为:

a
b
c
over
over
over

我以为第一个循环也会覆盖数组中的String。因此,无论如何输出都将结束。似乎它创建值的副本,而不是创建引用。我从未意识到这一点。我做错了吗?是否可以选择创建参考?

//编辑:似乎每个人都知道,除了我。我来自C语言,没有对与C完全不同的术语“引用”给予足够的关注。幸运的是,这一次我只花了10分钟就弄清了这一点。


问题答案:

这个:

for (String s : blablubb) {
     s = "over";
}

等于这个:

for (int i = 0; i < blablubb.length; i++) {
     String s = blablubb[i];
     s = "over";
}

这将创建一个临时String,其中包含来自数组的值的副本,并且您仅更改副本。这就是为什么blablubb[]内容保持不变。

如果要更改数组中的值,只需使用第二个选项:

for (int i = 0; i < blablubb.length; i++) {         
    blablubb[i] = "over";
}

而且,顺便说一句,您只需一行即可打印一个数组:

System.out.println(Arrays.toString(blablubb));


 类似资料:
  • 问题内容: 我正在寻找一些关于JavaScript何时按值传递值,何时按引用传递,何时修改传递的项目影响函数外部值以及何时不传递值的良好综合阅读材料。我还对何时通过引用与按值分配给另一个变量以及是否遵循除作为函数参数传递以外的任何其他规则进行分配感兴趣。 我已经进行了很多搜索,找到了很多具体的示例(其中很多都在SO上),可以从这些示例中整理出一些真实的规则,但是我还没有找到一个写得很好的文档来描述

  • 问题内容: 我有一个HashMap: 然后我这样做: 第一次打印1000,第二次打印1000,该值不变。为什么Java按值而不是按引用返回Integer? 问题答案: 该方法返回对存储整数的引用的 副本 。 给存储该副本的变量分配一个新值,指向该值将 不会 更改映射中的引用。 如果可以的话,它会工作,但是由于是一个不可变的类,因此这不是一个选择。 如果要使更改在地图中生效,则必须将余额包装在(可变

  • 问题内容: 让我们举个例子 我想在列表中附加值,但列表的值也已更改。 我想我不知道为什么会这样(python通过引用传递列表)。 我的问题是“如何通过值传递它,以使添加不会更改中的值?” 问题答案:

  • 本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。   按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被

  • 问题内容: PHP变量是通过值还是通过引用传递? 问题答案: 根据PHP文档的价值。 默认情况下,函数参数是按值传递的(因此,如果函数中参数的值发生更改,则不会在函数外部进行更改)。要允许函数修改其参数,必须通过引用将其传递。 有一个参数总是通过引用传递函数,在前面加上符号( & ),以在函数定义的参数名称。

  • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未