Какие виды стека (Stack) существуют в контексте Java?

«Какие виды стека (Stack) существуют в контексте Java?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java можно выделить два принципиально разных понятия стека:

  1. Стек вызовов (Call Stack / JVM Stack)

    • Что это: Механизм виртуальной машины Java (JVM) для управления выполнением методов.
    • Назначение: Каждый поток имеет свой стек, в котором хранятся фреймы для каждого вызванного метода. Во фрейме содержатся локальные переменные, параметры и адрес возврата.
    • Ключевая особенность: Управляется JVM автоматически. При глубокой рекурсии может возникнуть StackOverflowError.
  2. Структура данных Stack<E>

    • Что это: Класс из java.util.Stack, реализующий структуру данных "стек" (LIFO — Last-In-First-Out).
    • Назначение: Используется программистом для хранения объектов.
    • Важно: Класс считается устаревшим (legacy). Вместо него рекомендуется использовать реализации интерфейса Deque, например, ArrayDeque.
      // Современная альтернатива
      Deque<Integer> stack = new ArrayDeque<>();
      stack.push(1); // Добавить на вершину
      int top = stack.pop(); // Извлечь с вершины

Итог: Первый — системный механизм выполнения, второй — программируемая коллекция для данных.