Ответ
Стек хранит примитивные типы данных (int, boolean, char и т.д.) и ссылки на объекты. Также в стеке хранятся вызовы методов (стек вызовов) — кадры стека (stack frames) с локальными переменными метода, параметрами и адресом возврата.
Пример:
void foo() {
int x = 5; // хранится в стеке
String s = "Hello"; // ссылка на объект в стеке, сам объект — в куче
bar(x);
}
void bar(int y) {
// y и другие локальные переменные — в стеке
}
Особенности:
- Быстрый доступ, но ограниченный размер
- Автоматическое управление памятью (освобождается при выходе из метода)
- Потокобезопасен (у каждого потока свой стек)
Ответ 18+ 🔞
А, ну вот, опять про эту вашу память. Слушай, представь себе, что стек — это как твой рабочий стол, только дохуя маленький и аккуратный. Туда ты кладёшь всё, что нужно прямо сейчас и ненадолго: ручку, кружку, пачку сигарет. Это твои примитивы — int, boolean, эта вся мелочёвка. И записки с адресами, где лежат большие коробки — это ссылки на объекты в куче, которые на стол уже не влезают, ёпта.
И вот самое главное — стек вызовов. Это когда ты звонишь другу, чтобы спросить, где затусить, а он тебе говорит: «Погоди, я сейчас у другого спрошу». И пока он не вернётся с ответом, твой разговор висит в эфире, ждёт. Вот так и методы: foo() вызывает bar(), и пока bar() не отработает и не вернёт управление, кадр foo() с его переменными x и s тихо себе лежит в стеке, как запись в блокноте «спросить у Коляна про бар».
Пример, чтобы совсем понятно стало:
void foo() {
int x = 5; // лежит в стеке, прямо на столе, как пятак
String s = "Hello"; // а это — бумажка с адресом, где в куче (в гараже) лежит эта самая строка
bar(x); // звоним Коляну, передаём ему пятак
}
void bar(int y) {
// Колян получил твой пятак (значение скопировалось в его стек), всё честно
}
А теперь особенности, без которых нихуя не понять:
- Быстрый доступ, но размер — овердохуища маленький. Это как быстрая память в процессоре — супершустрая, но её дохрена мало. Переполнил — всё, получи
StackOverflowError, и привет, программа накрылась медным тазом. - Самоочистка. Вышел из метода — всё, что было в его кадре (локальные переменные), автоматом выкинулось. Никакого мусора руками собирать не надо, красота.
- Потокобезопасен от рождения. У каждого потока — свой личный стек, свои личные «записки на столе». Один поток не полезет в записки другого, поэтому тут даже синхронизация не нужна, терпения ебать ноль на это тратить.