JavaRush /Курсы /JAVA 25 SELF /Адресация памяти и переменные

Адресация памяти и переменные

JAVA 25 SELF
2 уровень , 4 лекция
Открыта

1. Устройство памяти

У каждого компьютера есть оперативная память. Что же это такое, какими свойствами обладает и, самое главное, какая нам от этого польза?

Каждая программа (в том числе и программы, написанные на Java) перед выполнением загружается в оперативную память. В оперативной памяти находится код программы (который исполняется процессором) и данные программы (которые в память помещает сама программа).

Что же такое оперативная память и на что она похожа?

Представьте себе Excel 😎 Страница в Excel состоит из ячеек, и у каждой ячейки есть её уникальный номер (A1, A2, ... B1, B2). Зная номер ячейки, всегда можно записать в неё какое-то значение или же получить значение, которое там хранится. Память компьютера устроена похожим образом.

memory-excel

Программа и её данные во время работы хранятся в памяти. Вся память компьютера представлена в виде маленьких ячеек – байт. У каждой ячейки есть её уникальный номер – 0, 1, 2, 3, ... (нумерация начинается с нуля). Зная номер ячейки, мы можем сохранить в эту ячейку какие-то данные. Или взять их из неё. В одних ячейках хранится код программы – набор команд для процессора, в других – данные этой программы. Номер ячейки также называют адресом ячейки.

Процессор умеет исполнять команды из загруженной в память программы. Почти все команды процессора — это что-то типа: взять данные из некоторых ячеексделать с ними что-то → результат поместить в другие ячейки.

Объединяя сотни простых команд, мы получаем сложные и полезные команды.

Когда в коде программы объявляется переменная, ей выделяется кусочек ещё не использованной памяти. Обычно это несколько байт. При объявлении переменной обязательно нужно указать тип информации, которую программа будет хранить в ней: числа, текст или другие данные. Ведь без знания типа информации не ясно, какого размера блок памяти нужно выделить под переменную.

На заре компьютерной отрасли программы работали просто с номерами ячеек памяти, но потом для удобства программистов ячейкам стали давать имена. Уникальное имя переменной — это в первую очередь для удобства программистов: программа во время работы отлично справилась бы и с номерами.

2. Переменные в памяти

В Java есть 4 основных типа данных для хранения целых чисел. Это byte, short, int и long.

Тип Размер, байт Происхождение имени
byte
1
Byte, т.к. занимает один байт памяти
short
2
Сокращение от Short Integer
int
4
Сокращение от Integer
long
8
Сокращение от Long Integer

Также в Java есть 2 вещественных типа — float и double:

Тип Размер, байт Происхождение имени
float
4
Сокращение от Floating Point Number
double
8
Сокращение от Double Float

Каждый раз, когда выполнение программы доходит до команды создания переменной, ей выделяется небольшая область памяти (размер зависит от типа переменной).

Важно!

Адресом переменной считается адрес первой ячейки выделенного под неё блока памяти.

Java-программам запрещено напрямую обращаться к памяти. Вся работа с памятью происходит только через Java-машину.

3. Тип String в памяти

Тип String может хранить большие объёмы данных, поэтому это не просто тип данных, а полноценный объект.

Сами данные типа String (текст) помещаются в специальный объект, под который выделяется память, а уже адрес этого объекта помещается в переменную, под которую тоже выделяется память.

memory-string

  • Переменная a типа int занимает 4 байта и хранит значение 1.
  • Переменная b типа int занимает 4 байта и хранит значение 10,555. Запятая — это не дробная часть числа, а разделение разрядов. Дробная часть отделяется точкой.
  • Переменная d типа double занимает 8 байт и хранит значение 13.001.
  • Переменная str типа String хранит значение D12 — адрес первой ячейки объекта, содержащего текст.

Объект типа String (содержащий текст) хранится отдельным блоком памяти. Адрес его первой ячейки хранится в переменной str.

4. Что происходит, когда мы присваиваем

Ещё одна важная вещь — как работает присваивание. Например:

int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10

В этом примере в памяти создаются две ячейки: одна для a, одна для b. Когда мы пишем b = a;, копируется значение (10), а не сам "ящик". Изменения в b никак не влияют на a.

Теперь аналогично, но со строками:

String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1); // "Hello"
System.out.println(s2); // "Hello World"

Здесь обе переменные s1 и s2 ссылаются на одну и ту же строку "Hello" до момента изменения. Но когда мы выполняем s2 = s2 + " World";, для s2 создаётся новая строка "Hello World", а s1 по-прежнему смотрит на старую строку "Hello".

5. Почему в программировании всё нумеруют с нуля

Люди очень часто удивляются, почему в программировании почти везде принято считать с нуля. Дело в том, что есть очень много ситуаций, когда считать с нуля удобнее (хотя есть и ситуации, когда удобнее считать с 1).

Попробую придумать аналогию. Вот вы стоите в длинной очереди в магазине. И тут кассир говорит, что все покупатели, начиная с 20-го, пусть идут на вторую кассу. Какие будут у них номера? 20, 21, 22, 23, ... Логично. А относительно 20-го? 0, 1, 2, 3, ...

Когда мы задаём группу как "номер первого элемента" + "количество", то внутри группы относительные номера получаются +0, +1, +2, ...

В программировании то же самое. Если вашей переменной выделили 100 байт памяти и у вас есть X – адрес первого байта, то какие будут адреса у всех байтов? X+0, X+1, X+2, ..., X+99. Вот мы уже и получили группу байтов с индексами 0, 1, 2, 99.

Когда мы думаем об относительном адресе внутри какого-либо блока данных, всегда получаем нумерацию с нуля. Это и есть первая и самая распространённая причина счёта с нуля.

1
Задача
JAVA 25 SELF, 2 уровень, 4 лекция
Недоступна
Профиль игрового персонажа 🎮
Профиль игрового персонажа 🎮
1
Задача
JAVA 25 SELF, 2 уровень, 4 лекция
Недоступна
Копирование и изменение данных проекта 📝
Копирование и изменение данных проекта 📝
1
Задача
JAVA 25 SELF, 2 уровень, 4 лекция
Недоступна
Размеры данных 📊
Размеры данных 📊
1
Задача
JAVA 25 SELF, 2 уровень, 4 лекция
Недоступна
Разные счета в банке 🏦
Разные счета в банке 🏦
Комментарии (22)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Natalia Уровень 5
30 ноября 2025
операции присваивания возможна 2-мя способами: 1) account1 = account1 + 50; 2) account1 = + 50;
Viktor Platonov Уровень 6
18 декабря 2025
А можно еще интереснее!

        account2 += account1;
        account1 -= account1;
        account1 += 50;
Павел Уровень 5
11 января 2026
2) account1 = + 50; -это некорректо, т.к. это не увеличение текущего значения переменной на 50, а просто присвоение значения 50 в эту переменную. При этом знак "+" просто лишний. Корректно:account1 = account1 + 50; или сокращенно account1 += 50;
Archibald26 Уровень 5
26 ноября 2025
интереснее бы было, видеть несколько решений. Возможно дойдем конечно до этого
Нурлан Уровень 16
26 ноября 2025
По правилам русского языка пишем "8 байт", но компилятор исправляет на "8 байтов"😒
Кирилл Никулин Уровень 2
22 октября 2025
Назрел вопрос: получается для одной переменной выделяется n-ое количество памяти. На основе этого возможно написать программу, которая при запуске будет требовать очень много байт памяти и нагружать процессор?
Дмитрий Уровень 4
16 октября 2025
Не совсем понятен прикол третьей задачи, но, в целом все просто и увлекательно ☺️
Oreshkin Andrey Уровень 5
26 сентября 2025
апдейт, температурил сайт, все отработало нормально на следующий день)
evoker7lug Уровень 1
23 сентября 2025
означает ли фраза "Адрес его первой ячейки хранится в переменной str" то, что у первой ячейки есть что-то вроде Next, которая указывает на другие ячейки в которых хранятся остальные данные? Если не так, то что означает указание на первую ячейку?
Denis Skab Уровень 8
23 сентября 2025
чувак ты же вроде как знаком с JS, учитывая что все языки си подобные, то скорее всего тут так же идёт цепочка ссылок одного обьекта на другой, так как String это обьект
hidden #3635561 Уровень 2
14 сентября 2025
А где задачи?
Anonymous #1921396 Уровень 6
12 сентября 2025
так и не поняла объяснение 5-го пункта🙃
Михаил Уровень 13
11 сентября 2025
Сто процентов необходимо скорректировать условие в 3 задаче (Размеры данных), указать в скобках, что нет необходимости использовать какие-то методы и т.д. Указать, что необходимо просто вывести строку с информацией о типах данных. Сейчас ТЗ вызывает путаницу)