Search code examples
javaarraysclonepass-by-value

Modify an array passed as a method-parameter


Suppose I have an int-array and I want to modify it. I know that I cannot assign a new array to array passed as parameter:

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 1
}
public static void method(int[] n)
{
    n = new int[]{2};
}

while I can modify it:

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 2
}
public static void method(int[] n)
{
    n[0] = 2;
}

Then, I tried to assign an arbitrary array to the array passed as parameter using clone():

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 1 ?!
}
public static void method(int[] n)
{
    int[] temp = new int[]{2};
    n = temp.clone();
}

Now, I wonder why it prints 1 in last example while I'm just copying the array with clone() which it's just copying the value not the reference. Could you please explain that for me?


EDIT: Is there a way to copy an array to object without changing the reference? I mean to make last example printing 2.


Solution

  • Your examples 1 and 3 are virtually the same in context of the question - you are trying to assign a new value to n (which is a reference to an array passed by value).

    The fact that you cloned temp array doesn't matter - all it did was create a copy of temp and then assign it to n.

    In order to copy values into array passed into your method method you might want to look at:System.arraycopy

    It all, of course, depends on the sizes of your n array and the one you create inside method method.

    Assuming they both have the same length, for example, you would do it like that:

    public static void main(String[] args)
    {
        int[] temp_array = {1};
        method(temp_array);
        System.out.println(temp_array[0]);
    }
    public static void method(int[] n)
    {
        int[] temp = new int[]{2};
        System.arraycopy(temp, 0, n, 0, n.length); 
        // or System.arraycopy(temp, 0, n, 0, temp.length) - 
        // since we assumed that n and temp are of the same length
    }