Пока я размышлял об использовании памяти различных типов, я начал немного путать с тем, как Java использует память для целых чисел при передаче методу.
Скажем, у меня был следующий код:
public static void main (String[] args){
int i = 4;
addUp(i);
}
public static int addUp(int i){
if(i == 0) return 0;
else return addUp(i - 1);
}
В этом следующем примере мне интересно, правильна ли следующая логика:
- Сначала я сделал память для целого числа я = 4. Затем передаю его методу. Однако, поскольку примитивы не указаны в Java, в addUp (i == 4), я создаю другое целое число я = 4. Затем после этого есть еще один addUp (i == 3), addUp (i == 2), addUp (i == 1), addUp (i == 0), в котором каждый раз, поскольку значение не указано, в памяти выделяется новое значение i.
- Затем для одного значения "int i" я использовал 6 целых значений.
Однако, если бы я всегда проходил его через массив:
public static void main (String[] args){
int[] i = {4};
// int tempI = i[0];
addUp(i);
}
public static int addUp(int[] i){
if(i[0] == 0) return 0;
else return addUp(i[0] = i[0] - 1);
}
- Поскольку я создаю целочисленный массив размера 1, а затем передаю это в addUp, который будет снова передан для addUp (i [0] == 3), addUp (i [0] == 2), addUp (i [0] == 1), addUp (i [0] == 0), мне пришлось использовать только одно целое пространство памяти массива и, следовательно, гораздо более экономически выгодно. Кроме того, если бы я заранее запустил значение int, чтобы сохранить начальное значение я [0], у меня все еще есть свое "оригинальное" значение.
Затем это приводит меня к вопросу: почему люди передают примитивы, такие как int в Java-методах? Разве не намного эффективнее память, чтобы просто передать значения массива этих примитивов? Или это первый пример как-то еще только O (1) памяти?
И в дополнение к этому вопросу, я просто удивляюсь различиям в памяти при использовании int [] и int, особенно для размера 1. Спасибо заранее. Я просто задавался вопросом, насколько эффективна память с Java, и это пришло мне в голову.
Спасибо за ответы! Я просто сейчас быстро задаюсь вопросом, должен ли я "анализировать" большую память о каждом коде, будут ли они оба считаться O (1) или ошибочно предположить?