UT7 Ответов: 2

Мне нужно пояснить, почему в этом коде используется новое ключевое слово


Здравствуйте все, пожалуйста, почему ключевое слово "new" используется при возврате нового массива в вопросе leetcode № 1 (twoSum).

Вопрос - Учитывая массив целых чисел, верните индексы двух чисел таким образом, чтобы они складывались в определенную цель.

Вы можете предположить, что каждый вход будет иметь ровно одно решение, и вы не можете использовать один и тот же элемент дважды.

Пример:

Даны числа = [2, 7, 11, 15], цель = 9,

Потому что nums[0] + nums[1] = 2 + 7 = 9,
возврат [0, 1].

Решение Грубой Силы -
public class TwoSum {

    public static void main(String[] args) {

        int[] nums = {2, 5, 9, 7};

        twoSum(nums, 9);  
    }

    public static int[] twoSum(int[] nums, int target) {

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    System.out.println("fisrtIndex is " + i + " secondIndex is  " + j);
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{};
      }
	}

Мой вопрос заключается в том, почему мы должны использовать ключевое слово "new" при возврате нового целочисленного массива здесь(
return new int[]{i, j};
) когда класс TwoSum не расширяет класс Arrays в java?

Как получилось, что мы можем создать новый экземпляр массива, не расширяя массивы классов в java?
Int in (return new int[] {i, j}) показывает тип возвращаемого значения, но зачем использовать ключевое слово "new"?
Я надеюсь, что мой вопрос ясен, спасибо за любую помощь.

Что я уже пробовал:

public static int[] twoSum(int[] nums, int target) {

    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] == target) {
                System.out.println("fisrtIndex is " + i + " secondIndex is  " + j);
                return new int[]{i, j};
            }
        }
    }
    return new int[]{};
  }

2 Ответов

Рейтинг:
16

Garth J Lancaster

Ответ "короткой формы" на вопрос "почему" находится здесь

int[] nums = {2, 5, 9, 7};
объявляется целочисленный массив, выделяется память и инициализируется 4 целочисленными элементами, как показано на рисунке, 2,5,7,9 .. вы "могли бы" переписать twoSum, чтобы объявить пустой массив, например
int[] tmpNums = new int[2];
который объявляет целочисленный массив и выделяет память для двух целых чисел, то
tmpNums[0] = i;
tmpNums[1] = j;
return tmpNums;
.. но twoSum как таковой не объявляет массив "заранее", с помощью которого можно вернуть требуемые элементы, поэтому для возврата массива он должен использовать " new " для создания нового массива с необходимым выделением памяти, прежде чем он может быть назначен и возвращен


UT7

@Garth, спасибо за ваш ответ, очень ясно, спасибо. Но какова будет ссылка на новый массив в памяти?

CPallini

5.

UT7

@Garth пожалуйста, не могли бы вы уточнить, если tmpNums-это адрес для нового объекта массива в памяти, то назначается ли этот адрес (tmpNums) автоматически JVM? Спасибо, что уделили мне время.

Garth J Lancaster

Я думаю, вы можете сказать "автоматически назначенный" - в том смысле, что вам редко/не нужно беспокоиться о деталях - конечно, под одеялом это немного сложнее
1) когда JVM запускается, он запрашивает у операционной системы "блок" памяти (размер которого может быть изменен/оптимизирован)
2) любые запросы к "новому", например, обслуживаются из этого блока JVM
... поэтому, если у вас не кончается память, вы обычно не слишком заботитесь об этом, это просто "случается".

UT7

Ладно, большое спасибо.

Рейтинг:
0

Richard MacCutchan

То new операторы создают новый объект или фундаментальный тип, в данном случае массив целых чисел. Затем ссылка на массив возвращается вызывающей подпрограмме. В вашем образце вы имеете:

public static void main(String[] args) {
    int[] nums = {2, 5, 9, 7};
    twoSum(nums, 9);  
}

Который ничего не делает, так как призыв к twoSums не захватывает возвращаемый массив. Правильный код был бы:
int[] moreNums = twoSum(nums, 9);
// code to deal with the returned array


UT7

@Richard MacCutchan, спасибо.
Вызов метода twoSum состоял в том, чтобы распечатать индексы - System.out.println("fisrtIndex is" + i + "secondIndex is" + j); но я понимаю вашу точку зрения, спасибо за ваше время.

Richard MacCutchan

Тогда почему он создает новый массив, который возвращает вызывающему объекту?

UT7

о, вопрос о leetcode просил, чтобы мы возвращали массив int с индексами, но я хотел видеть выходные данные(индексы), поэтому я добавил оператор print и вызвал метод twoSum из основного метода.

Richard MacCutchan

Ну, вы возвращаете его из функции, но вам нужно захватить его в основном, как я предлагаю выше.

UT7

Хорошо, отметил. Спасибо.