Перейти к основному содержимому

Java — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Java". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.

Вопрос. java в терминале не найден, хотя JDK "установлен".

Ответ. Установлен только JRE или PATH не содержит bin JDK. Проверьте java -version и javac -version; для разработки нужен JDK. Подробнее здесь — основы и JDK, первая программа.

Вопрос. javac компилирует, а java Main — "Could not find or load main class".

Ответ. Класс с main должен называться как файл, пакет должен совпадать со структурой каталогов, запуск — из корня пакета с полным именем com.example.Main. Подробнее здесь — первая программа, структура проекта.

Вопрос. В IDE всё зелёное, из терминала Maven — "package does not exist".

Ответ. IDE подхватила classpath, а Maven не собрал зависимости или вы запускаете не из корня pom.xml. Выполните mvn compile или mvnw clean install. Подробнее здесь — Maven и сборки.

Вопрос. NullPointerException на строке, где "ничего null нет".

Ответ. Падает цепочка вызовов: a.getB().getC() — null может быть у getB(). Разбейте на шаги, используйте Optional или проверки. Подробнее здесь — исключения, современный синтаксис.

Вопрос. Добавил объект в HashSet, потом изменил поле — элемент "пропал" из множества.

Ответ. HashSet опирается на неизменный hashCode. Не меняйте поля, участвующие в equals/hashCode, после вставки в Set/Map. Подробнее здесь — коллекции.

Вопрос. ConcurrentModificationException при удалении из списка в цикле for.

Ответ. У ArrayList, HashMap и других fail-fast коллекций итератор сверяет modCount на каждом шаге. Прямой list.remove() внутри for-each меняет счётчик, и JVM бросает исключение. Безопасные варианты — Iterator.remove(), removeIf, новый список; для параллельных потоков — CopyOnWriteArrayList, ConcurrentHashMap. Подробнее — fail-fast и fail-safe итераторы, ConcurrentModificationException, многопоточность.

Вопрос. Сравниваю строки через == — иногда работает, иногда нет.

Ответ. == сравнивает ссылки, для содержимого — equals(). Литералы в пуле могут совпасть по ссылке случайно — это ловушка для новичка. Подробнее здесь — строки, типы.

Вопрос. IDE предлагает "Unhandled exception" — можно просто добавить throws Exception?

Ответ. throws на всё — маскирует обработку. Для checked exceptions обрабатывайте осмысленно или оборачивайте; не глотайте пустой catch. Подробнее здесь — исключения.

Вопрос. Spring Boot стартует, но REST возвращает 404 на все URL.

Ответ. Контроллер не в пакете сканирования @SpringBootApplication, опечатка в @RequestMapping или конфликт context-path. Проверьте логи mapped endpoints. Подробнее здесь — Spring Boot.

Вопрос. @Autowired поле null — Spring "не видит" бин.

Ответ. Класс создан через new вне контекста — DI не сработает. Пометьте класс @Component/@Service и инжектируйте через конструктор. Подробнее здесь — Spring Boot, Spring — обзор.

Вопрос. JPA сохраняет сущность, но в БД пусто — транзакция откатилась молча.

Ответ. Метод без @Transactional или исключение после save без commit. Включите лог SQL, проверьте rollback и границы транзакций. Подробнее здесь — JPA, работа с БД.

Вопрос. LazyInitializationException при обращении к полю сущности в JSON-ответе.

Ответ. Сессия Hibernate уже закрыта вне транзакции. Используйте DTO, @Transactional на сервисе, fetch join или @EntityGraph. Подробнее здесь — JPA.

Вопрос. Приложение на Java 21, а на сервере — Java 8: "Unsupported class file major version".

Ответ. Байт-код новее runtime на сервере. Соберите с --release 8 или обновите JDK на сервере до нужной LTS. Подробнее здесь — основы и JVM, JVM в проде.

Вопрос. Память растёт, приложение тормозит — "OutOfMemoryError: Java heap space".

Ответ. Утечка ссылок, слишком маленький heap или кэш без лимита. Снимите heap dump (jcmd, VisualVM), проверьте -Xmx. Подробнее здесь — JVM и диагностика, JVM и потоки.

Вопрос. Многопоточный код "иногда" портит данные — баг не воспроизводится.

Ответ. Гонка данных без synchronized, lock или atomic. Воспроизведите под нагрузкой, используйте thread-safe коллекции. Подробнее здесь — многопоточность, асинхронность.

Вопрос. Stream уже использован — "stream has already been operated upon or closed".

Ответ. Stream в Java одноразовый. Сохраните результат в коллекцию или создайте новый stream из источника. Подробнее здесь — Stream API.

Вопрос. Lombok @Data в tutorial, а у меня "cannot find symbol" для getter.

Ответ. Нужен annotation processor в Maven/Gradle и плагин IDE. Без Lombok пишите getter/setter вручную или record. Подробнее здесь — структура и сборки.

Вопрос. Тесты проходят в IDE, в CI падают из-за локали или часового пояса.

Ответ. Формат дат и чисел зависит от Locale и ZoneId. В тестах фиксируйте Locale.US, Clock.fixed или явные ISO-строки. Подробнее здесь — строки и даты, Testcontainers.

Вопрос. JWT в Spring Security — 401 на каждый запрос после логина.

Ответ. Проверьте заголовок Authorization: Bearer <token>, секрет подписи, срок жизни и порядок фильтров в Security chain. Подробнее здесь — JWT, Security Basic.

Вопрос. Пошёл сразу в Spring Boot, не понимаю List, Map и исключения — нормально?

Ответ. Spring опирается на те же Core Java конструкции. Вернитесь к коллекциям, ООП и Maven, затем снова Первая программа на Spring Framework. Подробнее здесь — оглавление, коллекции.

Вопрос. record vs класс — когда IDE ругается на изменение поля?

Ответ. recordнеизменяемый носитель данных; поля final по смыслу. Для изменяемого состояния используйте обычный класс. Подробнее здесь — современный синтаксис.

Вопрос. Gradle и Maven в одном проекте — какой выбрать?

Ответ. Для учебного маршрута раздела достаточно одной системы сборки — чаще Maven в первых главах. Не смешивайте оба в одном репозитории без причины. Подробнее здесь — структура и сборки.

Вопрос. Android Studio и backend Java — это "один Java"?

Ответ. Общий язык и JVM-идеи, но разные API и runtime (Android SDK vs серверный JDK). Материалы раздела про Spring и JPA — для backend; мобильная ветка — отдельный маршрут. Подробнее здесь — основы, оглавление.

Вопрос. Integer кэширует -128..127 — Integer.valueOf(200) == Integer.valueOf(200) false, а для 100 true.

Ответ. Для малых значений JVM использует пул объектов. Для сравнения содержимого — equals, не ==. Подробнее здесь — типы и autoboxing.

Вопрос. Virtual Threads (Java 21) — потоки "бесплатные", можно создать миллион?

Ответ. Virtual threads дешевле platform threads для I/O-bound, но память и блокировки synchronized на carrier thread всё ещё ограничивают. Не заменяют профилирование. Подробнее здесь — Virtual Threads, асинхронность.

Вопрос. Собеседование спрашивает про equals/hashCode, а я их не переопределял — в чём риск?

Ответ. В HashMap/HashSet объекты с одинаковым смыслом не найдутся или дублируются. Переопределяйте парой, соблюдайте контракт. Подробнее здесь — коллекции, вопросы на собеседование.

Вопрос. Логи Spring забиты SQL — как понять, где реальная ошибка?

Ответ. Временно поднимите уровень вашего пакета на DEBUG, SQL — на WARN. Ищите stack trace и correlation id; для REST — ошибки REST. Подробнее здесь — Spring Boot.

Частые поисковые запросы

Вопрос. Как начать учить Java с нуля — пошаговый план?

Ответ. JDK → первая программа и Maven → синтаксис и ООП → коллекции → исключения → Stream API → Spring Boot для веба. Подробнее здесь — маршрут intro, основы, первая программа.

Вопрос. JDK, JRE и JVM — в чём разница простыми словами?

Ответ. JDK — компилятор и инструменты разработки; JRE — среда только для запуска (устаревает); JVM — виртуальная машина, исполняющая байт-код. Разработчику нужен JDK. Подробнее здесь — основы Java.

Вопрос. Spring Boot — что это и зачем нужен?

Ответ. Spring Boot — стартовый каркас для Java-сервисов: встроенный Tomcat, autoconfig, REST, Security, JPA. Стандарт для нового backend на Java. Подробнее здесь — Spring Boot, Spring — обзор.

Вопрос. Java или Kotlin — что учить для Android и backend?

Ответ. Android официально на Kotlin; backend enterprise — чаще Java + Spring. Kotlin совместим с JVM; Java даёт больше учебных материалов в этом разделе. Подробнее здесь — основы, оглавление.

Вопрос. Java для backend-разработки — актуально ли?

Ответ. Да: банки, финтех, крупный e-commerce и микросервисы на Spring Boot — стабильный спрос. Плюс зрелая экосистема и LTS JDK. Подробнее здесь — Spring Boot, JPA.

Вопрос. Maven или Gradle — что выбрать новичку?

Ответ. В разделе старт с Maven (pom.xml) — проще найти учебные примеры. Gradle гибче в больших монорепо; оба востребованы. Подробнее здесь — структура и сборки.

Вопрос. ArrayList или LinkedList — когда что использовать?

Ответ. ArrayList — по умолчанию для списков (быстрый доступ по индексу); LinkedList — редко, когда много вставок в середину и мало random access. Подробнее здесь — коллекции.

Вопрос. Java 8 или Java 21 — какую версию учить?

Ответ. Учите современную LTS (17 или 21): records, var, pattern matching, virtual threads. На собеседованиях спрашивают и Java 8 (лямбды, Stream). Подробнее здесь — современный синтаксис, Virtual Threads.

Вопрос. NullPointerException — как избежать в Java?

Ответ. Проверки, Optional, аннотации @NonNull, избегайте цепочек без null-safe. В новых API — явные контракты. Подробнее здесь — исключения, современный синтаксис.

Вопрос. Stream API Java — что это и зачем?

Ответ. Декларативная обработка коллекций: filter, map, reduce без явных циклов. Удобен для трансформаций и агрегаций; не заменяет простой for там, где он читаемее. Подробнее здесь — Stream API.

Вопрос. JPA и Hibernate — что это простыми словами?

Ответ. ORM: Java-классы ↔ таблицы БД, запросы через JPQL/репозитории. Hibernate — популярная реализация JPA в Spring. Подробнее здесь — JPA, работа с БД.

Вопрос. Как подготовиться к собеседованию Java junior?

Ответ. Core: коллекции, OOP, исключения, Stream, многопоточность базово; плюс один pet-проект Spring Boot. Карта тем — в шпаргалке раздела. Подробнее здесь — вопросы на собеседование, чек-лист.

Вопрос. Java record — что это?

Ответ. Компактный неизменяемый data-класс с автогенерацией equals/hashCode/toString. Для DTO и value objects вместо boilerplate. Подробнее здесь — современный синтаксис.

Вопрос. Virtual threads Java 21 — что это?

Ответ. Лёгкие потоки JVM для массового I/O без thread-per-request. Создание: Thread.startVirtualThread(...) или executor. Подробнее здесь — Virtual Threads, асинхронность.

Вопрос. IntelliJ IDEA или Eclipse для Java?

Ответ. IntelliJ IDEA — де-факто стандарт в индустрии и в разделе; Community Edition бесплатна. Eclipse — legacy и embedded. Подробнее здесь — первая программа, отладка IDEA.

Вопрос. Как написать REST API на Java?

Ответ. Spring Boot + @RestController, DTO, сервисный слой, JPA для БД, Security для auth. Запуск одной jar. Подробнее здесь — Spring Boot, ошибки REST.

Вопрос. OpenJDK или Oracle JDK — что ставить?

Ответ. Для учёбы и prod — сборки OpenJDK (Temurin, Corretto, Zulu): бесплатно, совместимо. Oracle JDK — коммерческие нюансы лицензии. Подробнее здесь — основы и JDK.

Вопрос. HashMap Java — как работает простыми словами?

Ответ. Массив корзин (buckets) + hashCode ключа для индекса; при коллизиях — цепочка или дерево. Требует корректных equals/hashCode у ключей. Подробнее здесь — коллекции.

Вопрос. Сколько учить Java до junior backend?

Ответ. Core Java — 3–4 месяца; Spring + SQL + pet-проект — ещё 3–6 месяцев. Java verbose, зато структура enterprise понятна из материалов. Подробнее здесь — intro, чек-лист.

Вопрос. synchronized и volatile — в чём разница?

Ответ. synchronized — взаимное исключение и видимость в блоке; volatile — только гарантия видимости поля без атомарности составных операций. Подробнее здесь — JVM и потоки.

Вопрос. CompletableFuture — async в Java без боли?

Ответ. Цепочки асинхронных задач: thenApply, thenCompose, allOf. Альтернатива callback hell; в новых проектах — virtual threads. Подробнее здесь — асинхронность.

Вопрос. Java vs Python для backend — что выбрать?

Ответ. Java — типизация, performance, enterprise Spring; Python — быстрый старт, FastAPI/Django, data/ML. Выбор по домену и команде. Подробнее здесь — intro Java, Python — intro.

Вопрос. Что такое байт-код Java?

Ответ. Промежуточный формат .class после javac; JVM интерпретирует и JIT-компилирует в машинный код. Отсюда "Write Once, Run Anywhere". Подробнее здесь — основы Java.


Что запомнить

Java — это строго типизированный, объектно-ориентированный, платформонезависимый язык программирования, разработанный компанией Sun Microsystems и в настоящее время поддерживаемый Oracle. Его ключевая особенность — выполнение байт-кода на виртуальной машине Java (JVM), что обеспечивает "записал один раз — запускай где угодно".

Основные категории применения Java:

  • Корпоративные приложения: благодаря стабильности, безопасности и зрелой экосистеме;
  • Android-разработка: до появления Kotlin Java была основным языком для мобильной платформы;
  • Серверная логика — Spring Boot, Jakarta EE, Quarkus и другие фреймворки позволяют быстро создавать масштабируемые сервисы;
  • Большие системы — банковские, страховые, логистические и государственные информационные системы;
  • Инструменты и утилиты — компиляторы, IDE, билд-системы (Maven, Gradle) часто написаны на Java.

Ключевые особенности языка:

  • Строгая статическая типизация: ошибки типов выявляются на этапе компиляции;
  • Автоматическое управление памятью: сборка мусора освобождает разработчика от ручного управления выделением и освобождением памяти;
  • Многоуровневая модель исключений: проверяемые (checked) и непроверяемые (unchecked) исключения;
  • Богатая стандартная библиотека — коллекции, многопоточность, работа с сетью, файлами, датами, регулярными выражениями;
  • Поддержка функционального программирования: лямбда-выражения, Stream API, ссылки на методы;
  • Строки, файлы, асинхронность, метаданные: Строки в JavaСовременные конструкции Java;
  • Модульность: начиная с Java 9, проекты могут быть организованы в модули через JPMS (Java Platform Module System).

Экосистема Java включает:

  • JDK — набор инструментов для разработки;
  • JRE — среда выполнения;
  • JVM — виртуальная машина, исполняющая байт-код;
  • Maven/Gradle — системы сборки и управления зависимостями;
  • Spring, Hibernate, Jakarta EE — фреймворки для бизнес-логики, ORM и веб-разработки;
  • JUnit, TestNG — инструменты тестирования;
  • OpenJDK, Adoptium, Amazon Corretto, Azul Zulu — реализации JDK.

Три основных правила эффективной работы с Java:

  1. Следовать принципам SOLID и использовать шаблоны проектирования;
  2. Писать читаемый, тестируемый код с минимальной связанностью;
  3. Использовать современные возможности языка (начиная с Java 8 и выше) — лямбды, Optional, var, записи (record), паттерн-матчинг.

Три фундаментальных момента:

  • Java — это целая платформа с мощной инфраструктурой;
  • Успех Java основан на её стабильности, обратной совместимости и сообществе;
  • Знание JVM (сборка мусора, JIT-компиляция, память) критически важно для производительности.

Куда идти дальше

ТемаРаздел
"Python — о разделе""Python — о разделе"
"Документация и инструменты Java (Microsoft)""Документация и инструменты Java (Microsoft)"
"JavaScript — о разделе""JavaScript — о разделе"
"Low-code и No-code платформы""Low-code и No-code платформы"

Проверьте себя: Чек-лист самопроверки.