java - 这个引用变量发生了什么?

标签 java

public class Reverse {

public static void main(String[] args) {
    String [] simpsons = {"Homer", "Flanders", "Apu"};
    reverse(simpsons);
    System.out.println(simpsons[0] + " " + simpsons[1] + " "
            + " " + simpsons[2]);


} //End main

public static void reverse(String[] list)
{
    String[] temp = new String[list.length];
    for (int i =0; i<list.length; i++)
    {
        temp[i] = list[list.length-i-1];
    }
    //System.arraycopy(temp, 0 , list, 0, list.length);
    list = temp;;
}

}    

我刚刚开始学习Java,这个问题让我很困惑。正如你所看到的,我已经用注释掉的 arraycopy 方法解决了这个问题。我只是很困惑为什么 list = temp 仍然返回原始的非反转数组。我相信我从概念上理解引用只是内存中的位置,但 list = temp 不会将传入的数组分配给 temp 的内存位置(又称反转数组)吗?

最佳答案

因为你无法在被调用方法中更新调用者的引用(更改是本地的)并且数组是不可变的。只需返回新的引用并在调用者中更新它即可。

public static String[] reverse(String[] list) {
  String[] temp = new String[list.length];
  for (int i = 0; i < list.length; i++) {
    temp[i] = list[list.length - i - 1];
  }
  return temp;
}

然后在main()

simpsons = reverse(simpsons);

当我运行它时,我得到了预期的输出

Apu Flanders  Homer

或者,经过进一步考虑,您可以高效地 reverse() 数组就位 -

public static void reverse(String[] list) {
  for (int i = 0; i < list.length / 2; i++) {
    String t = list[list.length - i - 1];
    list[list.length - i - 1] = list[i];
    list[i] = t;
  }
}

这也适用于这里。

关于java - 这个引用变量发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25101383/

相关文章:

java - 在 For 循环中添加特定选择的数字以计算出总乘数 Java

java - 当n个人围成一圈时寻找幸存者

java - LDAP 中基于角色的安全实现

java - 我怎样才能在 scala 中使用 apache 数学?

java - 在java中定义方法

java - 无法在 Android 中使用自定义相机将捕获的图像保存在文件夹中

java - 使用 java 从本地主机在远程 hdfs 上创建目录

java - 正则表达式匹配除图像名称和扩展名之外的所有内容

java - 从 JAX-WS 生成的代码访问 Web 服务时如何指定主机和端口?

c# - 如何在C# winforms控件上嵌入Java控件?