1. Будова пам'яті

У кожного комп'ютера є оперативна пам'ять. Що ж це таке, які має властивості та, найголовніше, яка нам із цього користь?

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

Що ж таке оперативна пам'ять і на що вона схожа?

Уявіть собі Excel 😎 Сторінка в Exсel складається з клітинок (комірок), і кожна комірка має свій унікальний номер (A1, A2, ... B1, B2). Якщо знати номер комірки, завжди можна записати в неї якесь значення або ж отримати значення, що там зберігається. Пам'ять комп'ютера побудована за схожим принципом.

Під час роботи програма та її дані зберігаються в пам'яті. Уся пам'ять комп'ютера складається з маленьких комірок — байтів. Кожна комірка має свій унікальний номер — 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 (текст) поміщаються в спеціальний об'єкт, для якого виділяється пам'ять, а вже адреса цього об'єкта поміщається в змінну, для якої теж виділяється пам'ять.

Змінна a типу int займає 4 байти і зберігає значення 1.

Змінна b типу int займає 4 байти і зберігає значення 10,555. Кома тут не відокремлює дробову частину числа, а розділяє групи розрядів. Дробову частину відокремлюють крапкою.

Змінна d типу double займає 8 байтів та зберігає значення 13.001.

Змінна str типу String займає 4 байти і зберігає значення G13 — адресу першої комірки об'єкта, який містить текст.

Об'єкт типу String (який містить текст) зберігається в окремому блоці пам'яті. Адреса його першої комірки зберігається в змінній str.


4. Чому в програмуванні все нумерують починаючи з нуля

Люди часто дивуються, чому в програмуванні майже скрізь починають відлік з нуля. Річ у тім, що є дуже багато ситуацій, коли рахувати починаючи з нуля зручніше (хоча трапляються й такі ситуації, коли зручніше рахувати починаючи з 1).

Найпростіша з таких ситуацій — це адресація пам'яті. Якщо вашій змінній виділили 4 байти пам'яті й ви знаєте, що X — адреса першого байта, то яку адресу буде мати кожен із цих байтів? X+0, X+1, X+2, X+3. Ось ми вже й отримали групу байтів із індексами 0, 1, 2, 3 (тобто для визначення адрес усіх байтів знадобилася група чисел саме від 0 до 3).

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