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 є чотири основні типи даних для зберігання цілих чисел: byte, short, int і long.

Тип Розмір, байти Походження назви
byte
1
Byte, оскільки займає один байт памʼяті
short
2
Скорочення від Short Integer
int
4
Скорочення від Integer
long
8
Скорочення від Long Integer

Також у Java є два дійсні типи — 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 = "Привіт";
String s2 = s1;
s2 = s2 + " Світ";
System.out.println(s1); // "Привіт"
System.out.println(s2); // "Привіт Світ"

Тут обидві змінні s1 і s2 вказують на один і той самий рядок "Привіт" до моменту зміни. Але коли ми виконуємо s2 = s2 + " Світ";, для s2 створюється новий рядок "Привіт Світ", а s1 і надалі вказує на старий рядок "Привіт".

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.

Коли ми думаємо про відносну адресу всередині якогось блоку даних, завжди отримуємо нумерацію з нуля. Це і є перша й найпоширеніша причина рахунку з нуля.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ