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 лекция
Недоступна
Разные счета в банке 🏦
Разные счета в банке 🏦
Комментарии (37)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Gans Electro Уровень 28
22 мая 2026
Если есть ошибки нужно напрямую писать админам. В вас есть кнопка с конвертом. Там можно писать Зепп Бранниган. Не можно а нужно. Именно комменты под лекциями они читают редко. Их слишком много
Dmitry T Уровень 7
8 мая 2026
Для чего такие задачи? особенно 3?
Shurik Уровень 2
5 мая 2026
В стандартном курсе все объясняется намного понятнее.. Если бы я не знал, о чем здесь идет речь, я бы очень долго в это въезжал.
Anonymous #6486870 Уровень 4
25 марта 2026
3 задача бестолковая...... 4 попытки, потому что я неправильно склоняю слово байт...
Lev Уровень 6
6 апреля 2026
зря мы укр прогуливали
HAski Уровень 4
8 марта 2026
Третья задача запутала конечно! Добавьте в материал : System.out.printf() — функция для форматированного вывода, унаследованная от языка С. С её помощью можно подставлять в строку какие-либо данные. Некоторые спецификаторы, которые можно использовать с этой функцией: - %d — для вывода целочисленных значений (к ним относятся, например, byte, short, int, long); -%f — для вывода чисел с плавающей точкой (к ним относятся float, double); - %x — для вывода шестнадцатеричных чисел; - %e — для вывода чисел в экспоненциальной форме (например, 1.3e+01); - %c — для вывода одиночного символа; - %s — для вывода строковых значений; - %b — для вывода значений типа boolean. System.out.printf("byte — %d байт, int — %d байта, double — %d байтов", Byte.BYTES, Integer.BYTES, Double.BYTES);
Fenix Уровень 1
2 мая 2026
Зачем так усложнять? Тем более что в лекциях ничего не было про printf и Byte.BYTES. Просто пишешь в вывод System.out.println("byte - 1 байт"); и т.д., и всё xD
27 февраля 2026
+
murMeow Уровень 5
12 февраля 2026
Допустим, есть массив из 4 элементов: [ A, B, C, D ] Компьютер хранит их подряд в памяти. Пусть адрес первого элемента — 1000. Тогда: A — лежит по адресу 1000 B — по адресу 1001 C — по адресу 1002 D — по адресу 1003 Как вычислить адрес любого элемента? Очень просто: адрес = адрес_начала + индекс Если индекс начинается с нуля: A → 1000 + 0 B → 1000 + 1 C → 1000 + 2 D → 1000 + 3 Формула красивая и чистая. А теперь представь, что индексация с 1. Тогда: A → индекс 1 Но физически он лежит по адресу 1000. Формула стала бы: адрес = адрес_начала + (индекс - 1) То есть каждый раз нужно вычитать 1. Машине это не сложно, но логически это уже «надстройка», а не естественное смещение. Компьютер мыслит не «первый, второй, третий». Он мыслит «на сколько я сдвинулся от начала». И вот тут происходит переключение мышления. Люди считают элементы. Компьютер считает расстояние.
Андрей Уровень 27
27 января 2026
Снова просят деньгу, за переход на следующую лекцию. Теперь это будет постоянно?
Red_Cat Уровень 3
21 января 2026
Кому не очень понятно почему легче считать с нуля. Посмотри на обычную линейку. Она не начинается с цифры 1. Она начинается с нулевой отметки. Первый сантиметр находится между 0 и 1. Когда ты прикладываешь линейку к предмету, ты совмещаешь край с нулем, а не с единицей. А теперь представь, что мы считаем с 1. Тогда для того, чтобы найти адрес элемента в памяти, компьютеру пришлось бы каждый раз делать лишнее действие: (Адрес) + (Индекс - 1). Миллиарды таких вычислений в секунду — и компьютер начинает «тормозить» на ровном месте просто из-за того, что мы привыкли считать с единицы.
dxflt Уровень 25
17 января 2026
cool