Подходит ли Java для структур данных и алгоритмов?
Да. Рядом с Python код на Java многословен, но эта многословность помогает в обучении: типы делают явными каждый узел, каждую ссылку и каждый обобщённый параметр, а коллекции стандартной библиотеки один к одному соответствуют структурам этого пути. Скорости Java хватает почти для любой тестирующей системы и любого собеседования, и именно этот язык используют многие университетские курсы и программы кампусного найма.
Какие коллекции Java каким структурам данных соответствуют?
ArrayDeque служит стеком или очередью, LinkedList устроен как двусвязный список, HashMap и HashSet построены на хеш-таблицах, PriorityQueue реализует двоичную min-кучу, а TreeMap и TreeSet устроены как красно-чёрные деревья, то есть сбалансированные двоичные деревья поиска, как АВЛ-дерево, которое вы пишете на втором шаге. Класса для префиксного дерева или графа нет: их вы пишете сами.
Что использовать в Java: Stack или ArrayDeque?
ArrayDeque. Stack относится к устаревшим классам и наследуется от Vector, поэтому каждый вызов синхронизирован, а ещё он получает методы списка, которых у стека быть не должно; сама документация Java рекомендует вместо него Deque. Интервьюеры это замечают: идиоматично писать Deque<Integer> stack = new ArrayDeque<>();.
Java или C++ для DSA?
Тот язык, на котором вы будете проходить собеседования или соревноваться. В спортивном программировании нормой считается C++ благодаря скорости и STL; для собеседований Java ничуть не хуже, а сборщик мусора избавляет от ручного управления памятью, пока алгоритмы ещё в новинку. Идеи одни и те же, так что переход позже означает перевод синтаксиса, а не повторное обучение.
Какие курсы этого пути не преподаются на Java?
Три: динамическое программирование и серия по интервью на Python преподаются на Python, а битовые операции на C++. Они перечислены после шагов, каждый со ссылкой, которая открывает курс на его собственном языке, и обе темы легко читаются с позиции Java: рекуррентное соотношение одинаково на любом языке, а в Java есть битовые операторы C++ плюс беззнаковый сдвиг >>>.
Нужно ли знать Java, прежде чем начинать этот путь?
Вы должны уверенно владеть классами, методами, массивами и циклами; дженерики пригодятся, и их вы освоите по ходу. Если вы ещё не на этом уровне, курс Java от Coddy сначала бесплатно доведёт вас до него, а этот путь начинается там, где он заканчивается.