为什么以下程序打印不同数组的对象?

时间:2016-06-11 06:17:55

标签: java functional-programming

我无法理解屏幕后面发生的内部工作,但我很困惑,因为它在控制台中打印的结果与预期的不同。有没有人可以解释我的问题?

public class Demo {

public int [] sort(int h[])
{
    int temp;
    for(int i=0;i<h.length;i++)
    {
        for (int j=i;j<h.length;j++)
        {
            if(h[i]>h[j])
            {
                temp=h[i];
                h[i]=h[j];
                h[j]=temp;
            }

        }
    }
    return h;
}
public static void main(String args[])
{
    Demo obj =new Demo();
    int a[]={9,2,3,5,32,1,5,3,7};

    int[] sorted=obj.sort(a);

    /*Code to Display Array a*/
    for(int s :a)
    {   
     System.out.print(s+ "  ");
    }

     System.out.println("");


    /*Code to Display Array sorted*/
    for(int k:sorted)
    {   
     System.out.print(k+"  ");
    }
}

  /*
   Expected output
               9  2  3  5  32  1  5  3  7
               1  2  3  3  5   5  7  9  32  

   Actual output 
               1  2  3  3  5  5  7  9  32  
               1  2  3  3  5  5  7  9  32  
 */ 


}

2 个答案:

答案 0 :(得分:0)

sort方法正在处理通过call-by-reference传递给方法的实际输入参数(我知道这在措辞方面不是100%正确 - 请参阅here) 。也就是说,h中数组sort的所有更改也会在调用代码中显示。

如果您不想更改输入参数,则需要复制该对象。在您的情况下,您可以使用System.arrayCopy来执行此操作。

答案 1 :(得分:0)

这是因为当您传递数组对象时,数组int [] h引用相同的内存位置。

将int [] a视为一个对象,它具有表示数组内存地址的字节。现在,当你传递这个数组时,相同的字节被复制到int [] h所以现在,h也指向相同的内存和因此,内存被修改。