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:
- Следовать принципам SOLID и использовать шаблоны проектирования;
- Писать читаемый, тестируемый код с минимальной связанностью;
- Использовать современные возможности языка (начиная с 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 платформы" |
Проверьте себя: Чек-лист самопроверки.