Порядок, в котором аргументы передаются в метод (Java) - PullRequest
0 голосов
/ 22 апреля 2011

Определен ли порядок, в котором аргументы передаются в метод (в Java)? Например, в сегменте кода

Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment))

Что используется для проверки, упорядочен ли массив в порядке возрастания. Могу ли я гарантировать, что исходный массив передается перед вызовом метода сортировки?

EDIT: Похоже, здесь есть какое-то недопонимание. Получает ли метод equals копию ascendingSegment перед его сортировкой, или сортировка вызывается первой, до того, как передан первый аргумент? Учитывая массив, такой как {1, 5, 2, 4}, метод equals получит {1, 5, 2, 4} и {1, 2, 4, 5} в качестве аргументов или две копии {1, 2, 4, 5}?

Ответы [ 3 ]

6 голосов
/ 22 апреля 2011

Если вы пройдете через него с помощью отладчика и пройдете через него, вы увидите, что все аргументы вычисляются, затем вызывается функция.

Я бы также сказал, что попытка сделать то, что вы опубликовалиплохая практика.При тестировании объекта вы не должны выполнять никаких действий с этим объектом, которые могли бы изменить его.После этого вызова метода вы не сможете отобразить порядок списка перед тестом.

Редактировать: Arrays.sort() не возвращает значение,это сортирует на месте.Поэтому вы не можете использовать это так.Вы должны использовать Arrays.copyOf(), чтобы сделать копию массива, отсортировать копию, а затем сравнить два массива.

1 голос
/ 22 апреля 2011

Во-первых, ваш пример не скомпилируется, потому что Arrays.sort(...) ничего не возвращает.

Во-вторых, если (гипотетически) Arrays.sort(...) что-то вернуло, то это будет зависеть от того, что он вернул.

  • Если (гипотетический) Arrays.sort(...) вернул отсортированную копию исходного массива, то

        Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment));
    

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

  • Если (гипотетический) Arrays.sort(...) вернул исходный массив после выполнения сортировки на месте, то

        Arrays.equals(ascendingSegment, Arrays.sort(ascendingSegment));
    

    будет эквивалентно этому:

        Arrays.sort(ascendingSegment);
        Arrays.equals(ascendingSegment, ascendingSegment);
    

Примечание:

  1. Параметры вызова Java передаются по значению, хотя значение передается дляТип ссылки (т. е. объект или массив) является ссылкой.Это означает, что когда передается аргумент массива, вы фактически передаете ссылку на массив, и вызываемый метод получает исходный массив, а не копию.
  2. Выражения аргументов для вызова процедуры оцениваются слева направо.
1 голос
/ 22 апреля 2011

Java следует Передача по значению .

Передача по значению означает, что при вызове метода копия значения каждого фактического параметра передается в метод,Вы можете изменить эту копию внутри метода, но это не повлияет на фактический параметр.

Итак, в вашем примере ваш массив будет сначала отсортирован, а затем передан методу Array.equals.

Ваша путаница может быть из-за того, что вы думаете с точки зрения Передача по ссылке .Вот вопрос, объясняющий, почему Java Передача по значению : Является ли Java "передачей по ссылке" или "передачей по значению"?

...