Java-массивы всегда равны - PullRequest
       18

Java-массивы всегда равны

0 голосов
/ 15 января 2012

У меня есть двумерный массив №2.Я устанавливаю его равным number2copy с number2copy = number2 Затем я вызываю метод Zeroed, передавая ему 2d массив ToBeZeroed.Этот метод заполняет массив нулями, и я знаю, что он работает.Возвращает ToBeZeroed, полный нулей.Но когда я ставлю число 2 = ToBeZeroed;Number2copy также заполнен нулями.Как я могу разбить эти вещи, чтобы изменение одного не привело к изменению другого?Они не связаны между собой, поэтому их нужно обрабатывать отдельно

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Java это не C ++.Вы копируете ссылку на массив, относящийся к первому измерению, а не объект массива и подобъекты массива.Вам необходимо использовать number2copy = (int[][])deepCopy(number2);, который будет выполнять копирование глубокого массива в соответствии с вашими потребностями, включая копии массивов второго измерения, содержащихся в нем.Замените int[][] на используемый тип данных 2D-массива, о котором вы нам не сказали :) Кроме того, чтобы проверить, равен ли один объект другому, == проверит ссылку на первый массив измерений 2D-массива, которыйэто, вероятно, не то, что вы хотите.Для глубокой проверки используйте Arrays.deepEquals(number2, number2copy);, которая должна работать нормально.

Исходный код глубокой копии:

public static Object deepCopy(Object src)
{
    int srcLength = Array.getLength(src);
    Class srcComponentType = src.getClass().getComponentType();

    Object dest = Array.newInstance(srcComponentType, srcLength);

    if (srcComponentType.isArray())
    {
        for (int i = 0; i < Array.getLength(src); i++)
            Array.set(dest, i, deepCopy(Array.get(src, i)));
    }
    else
    {
        System.arraycopy(src, 0, dest, 0, srcLength);
    }

    return dest;
}

См. здесь для краткого объяснения.

Редактировать: Я только что заметил, что он сказал 2D-массив, поэтому изменил ответ соответствующим образом:)

1 голос
/ 15 января 2012

Я установил его равным number2copy с number2copy = number2

На этом этапе и с этого момента (если вы не назначите другое значение для любой из этих ссылок) number2copy иnumber2 указывает на тот же массив .Когда вы изменяете массив по одной ссылке, изменения видны через другую.

Как я могу разбить эти вещи, чтобы изменение одной не вызвало изменения другой?Это несвязанные массивы, поэтому их нужно обрабатывать отдельно

Ну, если они не связаны между собой, вы не должны делать number2copy = number2 ..., потому что это делает их одним массивом.


Если вы хотите обнулить двумерный массив, вам нужно сделать что-то вроде этого:

for (int i = 0; i < toBeZeroed.length; i++) {
    for (int j = 0; j < toBeZeroed[i].length; j++) {
        toBeZeroed[i][j] = 0;
    }
}

Если вы хотите скопировать двумерный массив в другой, вам нужносделать что-то вроде этого:

for (int i = 0; i < from.length; i++) {
    for (int j = 0; j < from[i].length; j++) {
        to[i][j] = from[i][j];
    }
}

(Предполагается, что массивы from и to имеют одинаковые размеры, нет нулевых подмассивов и т. д.)

Возможно, вывозможность найти стороннюю библиотеку, которая обнуляет / копирует массивы так, как вам нужно.Тем не менее, пока вы учитесь, вам будет полезно реализовать их вручную, чтобы помочь вам получить четкую мысленную модель работы Java;например, присвоение ссылки, что на самом деле представляет собой двумерный массив и т.д ...


Остерегайтесь использования clone для копирования двумерного (или более) массива:

  • Он создает новый объект массива, в который вы, похоже, хотите скопировать значения из одного существующего массива в другой существующий массив.

  • Он выполняет только поверхностное копирование;т. е. новый массив будет использовать подмассивы оригинала, и вы окажетесь в ситуации, которую вы в настоящее время пытаетесь избежать, когда изменение одного массива влияет на другой.

0 голосов
/ 15 января 2012

Массивы в Java имеют значение Object с и, следовательно, имеют ссылочную семантику . То есть, операция присваивания x = y; псевдонимы и оба x и y теперь ссылаются на один и тот же фактический объект.

(Противоположностью этому является семантика значения , в результате чего значение y возвращает , скопированное в отличительное значение x; примитивные типы, такие как int, имеют значение семантика.)

Вам нужно будет создать явный массив new и скопировать данные поверх.


Различие между значением и ссылочной семантикой является одним из наиболее важных аспектов системы типов Java.

...