【问题标题】:java array pass by reference does not work? [duplicate]java数组按引用传递不起作用? [复制]
【发布时间】:2011-02-19 09:16:31
【问题描述】:

我认为几乎所有语言,包括 java,都将数组作为引用传递给函数(可修改)。

但不知何故,它在这里不起作用,testArray 仍然是 1,2,3,大小为 3。

很奇怪,当我将 result[i] = 2 更改为 a[1] =2 时,它会起作用。它确实通过引用传递。

这段代码有什么问题?

最后,我得到了a = result; (其中更新了a)。结果是否从堆栈中删除。这就是我仍然使用原始a 的原因吗?

我很困惑。

谢谢!

class Test
{
   public static void main(String[] args)
   {

      int[] testArray = {1,2,3};
      equalize(testArray, 6);

      System.out.println("test Array size :" + testArray.length);
      for(int i = 0; i < testArray.length; i++)
         System.out.println(testArray[i]);
   }

   public static void equalize(int[] a, int biggerSize)
   {
      if(a.length > biggerSize)
         throw new Error("Array size bigger than biggerSize");

      int[] result = new int[biggerSize];
     // System.arraycopy(a, 0, result, 0, a.length);
     // int array default value should be 0
      for(int i = 0; i < biggerSize; i++)
         result[i] = 2;

      a = result;
   }
}

【问题讨论】:

  • 请详细说明你的逻辑。你想扩大你的数组大小吗?目前您的结果数组不会从原始数组中复制任何值。
  • 你见过stackoverflow.com/questions/40480/is-java-pass-by-reference>吗?

标签: java


【解决方案1】:

Java 是按值传递的。这就是您的代码不起作用的原因。一个好的做法是将int[] a 标记为final,这样会导致编译错误(请参阅相应的Checkstyle rule)。

【讨论】:

    【解决方案2】:

    数组是通过引用传递的,但是reference按值传递的。也就是说,您可以更改a 引用的数组,但不能更改a 引用的数组

    【讨论】:

      【解决方案3】:

      a引用的数组可以修改,但是引用本身是传值的。因此,如果您执行a[0] = 1,那么您将更改原始数组。但是,a = result 改变了引用,所以原来的引用没有改变。

      【讨论】:

      • hmmm 有什么想法可以实现我的功能吗?基本上我想将我的数组从 3 调整为 6 :(
      【解决方案4】:

      Java is pass by value,总是这样。

      【讨论】:

      • 我一直在寻找的答案
      【解决方案5】:

      从函数返回参数“a”并分配给主函数中的testArray。当您通过引用传递对象时,引用被复制并提供给函数。因此,该对象现在被 2 个引用引用。通过第二个引用对对象的任何更改都将反映在第一个引用中,因为它是它们两个引用的同一个对象。但是当你改变引用(不是通过引用的对象)时,情况就不同了。您已将第二个引用更改为指向另一个对象(int[] 结果)。因此,通过第二个引用进行的任何更改都只会更改“结果”对象。

      class Test
      {
         public static void main(String[] args)
         {
      
            int[] testArray = {1,2,3};
            testArray = equalize(testArray, 6);
      
            System.out.println("test Array size :" + testArray.length);
            for(int i = 0; i < testArray.length; i++)
               System.out.println(testArray[i]);
         }
      
         public static int[] equalize(int[] a, int biggerSize)
         {
            if(a.length > biggerSize)
               throw new Error("Array size bigger than biggerSize");
      
            int[] result = new int[biggerSize];
           // System.arraycopy(a, 0, result, 0, a.length);
           // int array default value should be 0
            for(int i = 0; i < biggerSize; i++)
               result[i] = 2;
      
            a = result;
            return a;
         }
      }
      

      【讨论】:

      • 是否有可能有 void (或不返回任何东西)?谢谢
      • 新数组在函数内部创建。所以应该退货。 - 推荐的方法。还有一些其他方法,例如在外部初始化结果数组并将其作为第三个参数传递或将第三个参数定义为 Hashmap 并将结果数组放入其中。
      【解决方案6】:

      数组是java中的对象。如果您已使用大小(实际长度)初始化数组,则无法修改它。您可以创建一个具有不同大小的新数组(就像您当前在函数中所做的那样)并将旧数组中的所有值复制到新数组中。在您的情况下,您有 2 个对象和 3 个引用。如果要在调用函数中访问更大的数组,让函数返回更大的数组的引用。

      【讨论】:

        【解决方案7】:

        当您执行 a = result; 对象 a 不再指向 testArray 时,您正在更改其对 的引用结果的地址。这就是它不再对 testArray 产生影响的原因。 您实际上所做的是使 aresult 具有相同的地址,因此无论您在 a 中更改什么,它都会在 中更改>结果也是。

        希望这会有所帮助...

        【讨论】:

          【解决方案8】:
          public class test
          {
              public static void main(String[] args){
                  int[] a = {15, 2, -3};
                  printArray(a);
                  changeArray(a);
                  printArray(a);
              }
              private static void changeArray(int[] a){
                  for(int i = 0; i < a.length; i++){
                      a[i]++;
                  }
              }
          
              private static void printArray(int[] a){
                  for(int i = 0; i < a.length; i++){
                      System.out.print(a[i] + " ");
                  }
                  System.out.println();
              }
          }
          

          -----输出-----

          15 2 -3

          16 3 -2

          【讨论】:

          • 如果解释总是与代码相得益彰
          猜你喜欢
          • 2015-08-26
          • 2013-01-21
          • 2021-11-04
          • 1970-01-01
          • 2013-12-02
          • 2012-03-12
          • 2013-09-15
          • 1970-01-01
          • 2017-12-20
          相关资源
          最近更新 更多