Оглавление
Учебник Java
Последовательный курс Java с нуля: от первой программы до продвинутых тем.
1.Основы
- Введение в JavaЧто такое Java, где её используют, как установить JDK 25 и запустить первую программу командой java Main.java.
- Первая программаИз чего состоит программа на Java: метод main, инструкции, вывод через IO.println, комментарии и классическая форма с public class Main.
- ПеременныеОбъявление переменных в Java: тип и имя, присваивание, var, константы final и правила именования.
- Примитивные типыВосемь примитивных типов Java: int, long, double, float, char, boolean, byte и short, их диапазоны и переполнение.
- ОператорыАрифметические операторы Java, целочисленное деление и остаток, составное присваивание, инкремент, сравнение и логические операторы.
- СтрокиТип String в Java: создание строк, склейка через +, длина, символы по индексу, экранирование и сравнение через equals.
- Преобразование типовАвтоматическое расширение типов, явное приведение (int), превращение строк в числа через Integer.parseInt и чисел в строки.
- Ввод с клавиатурыКак прочитать ввод пользователя в Java: IO.readln, превращение ввода в число и класс Scanner.
- Классы-обёрткиInteger, Double, Boolean и Character в Java: автоупаковка и распаковка, null вместо числа, кеш Integer и почему обёртки нельзя сравнивать через ==.
- Math и BigDecimalКласс Math в Java, неточность дробных чисел (0.1 + 0.2), BigDecimal для денег: создание из строки, setScale, RoundingMode, compareTo и equals, а также BigInteger.
- Побитовые операторыПобитовые операторы Java: & | ^ ~, сдвиги << >> >>>, двоичная запись через Integer.toBinaryString, флаги и маски.
2.Управление ходом программы
- УсловияВетвление в Java: if, else, else if, составные условия и тернарный оператор.
- switchОператор switch в Java: стрелочные метки, несколько значений в case, switch-выражение с возвратом значения, yield и классическая форма с break.
- ЦиклыЦиклы в Java: while, do-while, for и for-each для перебора массива.
- Управление цикломОператоры break и continue в Java, выход из вложенных циклов через метки и цикл с выходом из середины.
3.Методы
- МетодыЧто такое метод в Java, как его объявить рядом с main и вызвать, и зачем в классической форме нужен static.
- Параметры и возврат значенияПараметры методов в Java, тип результата, оператор return и передача аргументов по значению.
- Перегрузка методовПерегрузка в Java: несколько методов с одним именем и разными параметрами, выбор подходящей версии и значения по умолчанию.
- Область видимостиГде видна переменная в Java: локальные переменные, блоки, переменные цикла, поля программы и затенение.
- РекурсияРекурсия в Java: метод, который вызывает сам себя, базовый случай, стек вызовов и StackOverflowError.
- Переменное число аргументовVarargs в Java: параметр с многоточием, работа с ним как с массивом, сочетание с обычными параметрами и printf.
4.Массивы и строки
- МассивыМассивы в Java: создание, доступ по индексу, длина, значения по умолчанию, перебор в цикле и вывод через Arrays.toString.
- Многомерные массивыДвумерные массивы в Java: создание таблицы, доступ по двум индексам, обход вложенными циклами, рваные массивы и Arrays.deepToString.
- Класс ArraysУтилиты класса java.util.Arrays: toString, sort, fill, copyOf, copyOfRange, equals и binarySearch.
- Методы строкОсновные методы String в Java: поиск, substring, смена регистра, strip, replace, split, join, repeat и проверки строк.
- StringBuilderStringBuilder в Java: изменяемая строка, append, insert, reverse, deleteCharAt, цепочки вызовов и сборка строки в цикле.
- Текстовые блоки и форматированиеМногострочные текстовые блоки в Java, форматирование строк через formatted, String.format и printf, спецификаторы %s, %d, %f и ширина поля.
- Регулярные выраженияРегулярные выражения в Java: matches, replaceAll, split по шаблону, классы Pattern и Matcher, группы и экранирование обратной косой черты.
5.Объектно-ориентированное программирование
- Классы и объектыЧто такое класс и объект в Java: поля, методы, оператор new, значения по умолчанию и ссылки на объекты.
- КонструкторыКонструкторы в Java: начальные значения полей, ключевое слово this, несколько конструкторов и вызов this(...).
- ИнкапсуляцияИнкапсуляция в Java: модификатор private, геттеры и сеттеры, проверка данных и поля final.
- Статические поля и методыКлючевое слово static в Java: общие поля класса, статические методы, константы static final и вызов через имя класса.
- НаследованиеНаследование классов в Java: extends, protected, вызов super(...), переопределение методов и аннотация @Override.
- ПолиморфизмПолиморфизм в Java: переменная типа родителя, выбор метода во время выполнения, общий код для разных классов и instanceof.
- Абстрактные классыАбстрактные классы и методы в Java: ключевое слово abstract, общий код для подклассов и запрет на создание объектов.
- ИнтерфейсыИнтерфейсы в Java: implements, несколько интерфейсов у одного класса, интерфейс как тип и методы по умолчанию.
- Методы класса ObjectМетоды toString, equals и hashCode в Java: как их переопределять и почему equals и hashCode всегда меняют вместе.
- Записи (record)Записи record в Java: короткое объявление класса для данных, готовые equals, hashCode и toString, компактный конструктор и методы.
- Перечисления (enum)Перечисления enum в Java: фиксированный набор значений, values() и valueOf(), switch по перечислению, поля и методы.
- Вложенные классыВложенные классы в Java: статические вложенные, внутренние, локальные и анонимные классы и когда их применять.
- Запечатанные классыЗапечатанные классы и интерфейсы в Java: sealed, permits, final и non-sealed подклассы и switch без ветки default.
- Пакеты и модификаторы доступаПакеты и import в Java, модификаторы public, protected, private и доступ по умолчанию, сборка и запуск проекта из нескольких файлов.
6.Коллекции
- Списки: List и ArrayListСписки в Java: ArrayList, добавление, чтение и удаление элементов, неизменяемые списки List.of и списки чисел.
- Множества: SetМножества в Java: HashSet без повторов, LinkedHashSet и TreeSet с порядком, объединение и пересечение множеств.
- Словари: Map и HashMapСловари Map в Java: пары ключ — значение, put и get, getOrDefault, подсчёт с merge, TreeMap и LinkedHashMap.
- Обход коллекцийКак перебрать коллекцию в Java: цикл for-each, индексы, forEach с лямбдой, обход словаря, Iterator и removeIf.
- Сортировка и компараторыСортировка коллекций в Java: естественный порядок, обратный порядок, интерфейс Comparable, Comparator.comparing и сортировка по нескольким полям.
- Очереди и декиОчереди в Java: Queue и ArrayDeque, стек на основе Deque, методы offer, poll и peek, очередь с приоритетом PriorityQueue.
- Вспомогательные методы коллекцийКласс Collections и полезные методы Java: max, min, frequency, reverse, shuffle, nCopies, неизменяемые копии и представления, Arrays.asList.
- Свой IterableКак сделать свой класс перебираемым в цикле for-each: интерфейсы Iterable и Iterator, методы hasNext и next, NoSuchElementException и forEach.
- Коллекции для перечисленийEnumMap и EnumSet в Java: словарь и множество для констант enum, диапазоны и дополнения, values(), valueOf() и почему нельзя полагаться на ordinal().
7.Обобщения и лямбды
- Обобщения (generics)Обобщённые типы в Java: параметры типа, свои обобщённые классы и записи, обобщённые методы и почему в них нельзя подставить int.
- Ограничения типов и подстановочные знакиОграниченные параметры типа в Java: extends у параметра, несколько ограничений, подстановочные знаки ? extends и ? super.
- Лямбда-выраженияЛямбды в Java: запись функции как значения, формы синтаксиса, передача лямбд в методы и захват переменных.
- Функциональные интерфейсыФункциональные интерфейсы в Java: аннотация @FunctionalInterface, стандартные Function, Predicate, Consumer, Supplier и их комбинирование.
- Ссылки на методыСсылки на методы в Java: оператор ::, ссылки на статические методы, методы объекта, методы произвольного объекта и конструкторы.
- OptionalКласс Optional в Java: значение, которого может не быть, создание через of и empty, orElse, map, ifPresent и orElseThrow.
- PECS и стирание типовПравило PECS для ? extends и ? super, подстановочный знак без ограничений и стирание типов в Java: почему нельзя new T() и instanceof List<String>.
8.Потоки данных (Stream API)
- Что такое поток данныхStream API в Java — источник, промежуточные и завершающие операции, создание потоков, ленивые вычисления и одноразовость потока.
- Операции над потокамиОсновные операции Stream API — filter, map, sorted, distinct, limit, skip, count, reduce, anyMatch, findFirst и числовые потоки.
- КоллекторыМетод collect и класс Collectors — toList, toSet, toMap, joining, counting, summingInt, averagingDouble и ошибка повторяющегося ключа.
- ГруппировкаГруппировка элементов потока в Java — Collectors.groupingBy, подсчёт и суммы по группам, mapping, TreeMap и partitioningBy.
- flatMap и числовые потокиflatMap и mapMulti для разворачивания вложенных данных, IntStream, LongStream и DoubleStream, переход между потоками через boxed и mapToObj, summaryStatistics.
- Параллельные потокиparallelStream и parallel в Java: как поток данных делится между ядрами процессора, когда это ускоряет работу, порядок и forEachOrdered, опасность общего изменяемого состояния.
9.Исключения
- Что такое исключенияИсключения в Java — как программа сообщает об ошибке, как читать трассировку стека, частые исключения и иерархия Throwable.
- try, catch и finallyОбработка исключений в Java — блоки try и catch, несколько catch, multi-catch, finally и выбрасывание исключений через throw.
- Проверяемые и непроверяемые исключенияChecked и unchecked исключения в Java — что требует компилятор, объявление throws, RuntimeException и обёртывание исключений.
- Свои исключенияКак создать собственный класс исключения в Java — наследование от Exception и RuntimeException, сообщение, причина и дополнительные поля.
- try-with-resourcesАвтоматическое закрытие ресурсов в Java — try-with-resources, интерфейс AutoCloseable, несколько ресурсов, порядок закрытия и подавленные исключения.
10.Файлы, даты и время
- Файлы и путиРабота с файловой системой в Java — Path, Files.exists, создание папок и файлов, размер, копирование, перемещение, удаление и список файлов.
- Чтение и запись файловЧтение и запись текстовых файлов в Java — Files.writeString, readString, readAllLines, write, дозапись в конец, Files.lines и буферизованные потоки.
- Даты и времяПакет java.time — LocalDate, LocalTime, LocalDateTime, арифметика дат, Period, Duration, ChronoUnit, часовые пояса и Instant.
- Форматирование и разбор датDateTimeFormatter в Java — шаблоны вроде dd.MM.yyyy, названия месяцев на нужном языке, разбор строки в дату и ошибки в шаблонах.
- HTTP-клиентЗапросы к веб-серверам из Java — HttpClient, HttpRequest и HttpResponse.BodyHandlers, GET и POST с JSON, коды ответа и асинхронный sendAsync.
- Аргументы, окружение и код завершенияКак Java-программа получает настройки снаружи — аргументы командной строки, переменные окружения System.getenv, системные свойства System.getProperty и -D, код завершения System.exit.
11.Сопоставление с образцом
- Шаблоны в instanceofСопоставление с образцом для instanceof в Java — проверка типа и приведение в одной строке, область видимости переменной шаблона и отрицание.
- Шаблоны в switchСопоставление с образцом в switch в Java — шаблоны типов в case, условия when, case null, полнота проверки и запечатанные иерархии.
- Шаблоны записейШаблоны записей в Java — разбор record на компоненты в instanceof и switch, вложенные шаблоны, var и безымянная переменная _.
12.Многопоточность
- Потоки выполненияПотоки в Java — класс Thread, запуск через start, ожидание через join, Thread.sleep, имена потоков и непредсказуемый порядок выполнения.
- Пулы потоков и ExecutorServiceExecutorService в Java — пулы потоков, submit, Callable и Future, invokeAll, обработка ошибок в задачах, тайм-ауты и закрытие пула.
- Виртуальные потокиВиртуальные потоки в Java 21+ — чем они отличаются от обычных, Thread.ofVirtual, newVirtualThreadPerTaskExecutor, тысячи задач сразу и ограничение через Semaphore.
- CompletableFutureАсинхронные цепочки в Java — CompletableFuture.supplyAsync, thenApply, thenAccept, thenCombine, allOf, обработка ошибок через exceptionally и join.
- СинхронизацияГонка данных в Java и как её избежать — synchronized-методы и блоки, атомарные классы AtomicInteger, ReentrantLock и общий объект блокировки.
- Потокобезопасные коллекцииКоллекции для многопоточного кода в Java — ConcurrentHashMap и merge, CopyOnWriteArrayList, BlockingQueue и схема производитель — потребитель.
- Ограниченные значения (ScopedValue)ScopedValue в Java 25 — как передать данные вглубь вызовов без параметров, ScopedValue.newInstance, where(...).run(...), get, вложенная привязка и почему они заменяют ThreadLocal в виртуальных потоках.
13.Продвинутые темы
- АннотацииАннотации в Java — @Override, @Deprecated, @FunctionalInterface, @SuppressWarnings, объявление своей аннотации, @Retention, @Target и чтение аннотаций во время работы программы.
- РефлексияРефлексия в Java — объект Class, поля и методы класса, вызов метода по имени, создание объекта, компоненты записей и ограничения рефлексии.
- НеизменяемостьНеизменяемые объекты в Java — final-поля, записи, List.of и List.copyOf, защитные копии, неизменяемые представления и почему final не делает список неизменяемым.
- Равенство и хеш-кодыСравнение объектов в Java — == и equals, контракт equals и hashCode, Objects.equals и Objects.hash, записи и ошибка с HashSet.
- Тестирование с JUnitМодульные тесты на Java с JUnit — подключение через Maven и Gradle, аннотация @Test, assertEquals, assertThrows, @BeforeEach, параметризованные тесты и запуск.
- Современная Java: от 8 к 25Что изменилось в Java с версии 8 до 25 — var, записи, текстовые блоки, switch-выражения, sealed-классы, сопоставление с образцом, виртуальные потоки, упорядоченные коллекции и компактные файлы.
- МодулиСистема модулей Java — module-info.java, requires и exports, проект из двух модулей, сборка javac --module-source-path и запуск java --module-path, модули самого JDK.
- ЛогированиеЛогирование в Java — почему не System.out.println, System.Logger и java.util.logging, уровни сообщений, формат, параметры и исключения в логе, SLF4J и Logback в проектах.
- Память и сборка мусораКак Java работает с памятью — стек и куча, ссылки, сборка мусора, утечки памяти через статические коллекции и слушатели, OutOfMemoryError и StackOverflowError, сборщики G1 и ZGC.
14.Базы данных (JDBC)
- Основы JDBCРабота с базой данных из Java через JDBC — что такое драйвер, подключение DriverManager.getConnection, Statement для команд SQL и чтение строк через ResultSet на примере SQLite.
- Подготовленные запросыPreparedStatement в JDBC — параметры ? в запросах, защита от SQL-инъекций, добавление, изменение и удаление строк через executeUpdate и получение сгенерированных ключей.
- ТранзакцииТранзакции в JDBC — режим автофиксации, setAutoCommit(false), commit и rollback, перевод денег между счетами и надёжный шаблон с try-with-resources.