这个参考变量发生了什么?

时间:2014-08-03 03:34:37

标签: 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的内存位置,AKA是反向数组吗?

2 个答案:

答案 0 :(得分:1)

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

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;
  }
}

这也适用于此。

答案 1 :(得分:0)

java中的方法参数是局部范围,因此虽然变量是对传入的列表的引用,但保存引用的变量对于反向方法是本地的,重新分配对temp的引用仅在本地范围内。

更好的实现会交换last和first,然后是last-1,first + 1等。这样你就可以修改传递的数组,也不需要第二个临时数组,只需要数组类型的单个临时变量。