【问题标题】:java does for loop COPY the object?java做for循环复制对象吗?
【发布时间】:2016-01-28 01:22:21
【问题描述】:

这是我的代码

public static String change(String word, char gone, char here) {
    char[] chars = word.toCharArray();
    for (char c : chars) {
        if (c == gone) {
            c = here;
        }
    }
    return new String(chars);
}

我是这样称呼它的:

System.out.println(change("supper", 'p', 'o'));

结果是 supper 我试图解释发生了什么......

chars 变量是一个引用数组对象的变量,其中包含字符串对象word 的字符。那么我想到的唯一解释是,在for语句中,java实际上复制了chars数组。对吗?

有些用户说我的代码中有警告,

但你去吧,没有警告

【问题讨论】:

  • 你用什么编辑器,你需要让它为你格式化你的代码。
  • @weston 抱歉,现在我没有编辑器,正在使用终端:(
  • @weston 请不要介意,代码现在已格式化
  • 这很重要。 IDE 为您做的不仅仅是格式化您的代码。
  • 使用chars[i] = here代替局部变量c应该没问题;尽量避免在这个简单的循环中使用迭代器,因为在迭代时更改值会抛出ConcurrentModificationException@Pankaj-saboo 为您提供了答案。

标签: java arrays string for-loop


【解决方案1】:
c = here;

更新字符的值,而不是数组。如果您使用编辑器,它会告诉您未使用分配的值。

像上面的 IntelliJ 这样的编辑器是免费的,所以你没有借口。

【讨论】:

  • 其实我刚刚又在eclipse中做了代码,现在我收到消息assigned value is not used,代码编译没有错误或警告
  • 是的,这是来自IDE的提示,而不是编译器,说操作不会有任何效果。这不是编译器警告或错误。
  • 好的,你的意思是说“我收到no消息”? Eclipse 不是最好的 IMO,我更喜欢 ItelliJ。
【解决方案2】:

c 变量只是对数组元素的复制引用。

原因是增强的 for 循环使用了Iterator,为了获取下一个元素,它调用了Iterator.next() 方法,该方法为原始集合元素提供了一个副本。

为了让它工作,你必须直接将新值设置到数组中:

public static String change(String word, char gone, char here) {
    char[] chars = word.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == gone) {
            chars[i] = here;
        }
    }
    return new String(chars);
}

【讨论】:

    【解决方案3】:

    在 for 循环中,您检查了是否对每个字符进行了字符化并更改了值,但更改的变量不用于更改再次“字符”。您每次都更改了变量 c 的值,但从未使用过,所以您得到了“晚餐”。因此,如果您想更改“晚餐”,请使用以下代码

    public static String change(String word, char gone, char here) {
    char[] chars = word.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == gone) {
            chars[i] = here;
        }
    }
    return new String(chars);
    }
    

    【讨论】:

      【解决方案4】:

      您所做的只是更改局部变量 c 而不是 char 数组中的元素

      【讨论】:

        【解决方案5】:

        它不起作用,因为

        for (char c : chars)
        

        在这里,您正在创建一个新变量 c,其中包含您当前正在迭代的字符的 COPY

        您可以做的是使用 c 风格的 for 循环,遍历每个数组元素并替换数组中的元素,例如:

        for (int i = 0; i < chars.length; i++) {
            if (char[i] == gone) {
                char[i] == here;
            }        
        }
        

        甚至更好:跳过循环并使用字符串replace 方法。

        【讨论】:

          【解决方案6】:

          不,java 不会在 For 循环中复制对象,但在此示例中您没有使用对象。 “char”是原始变量,因此您始终会收到原始变量的副本。

          【讨论】:

            猜你喜欢
            • 2015-01-27
            • 2014-07-27
            • 1970-01-01
            • 1970-01-01
            • 2021-11-26
            • 2015-03-18
            • 1970-01-01
            • 1970-01-01
            • 2021-06-02
            相关资源
            最近更新 更多