Этот репозиторий содержит решения практических задач, выполненных в рамках курса Java Developer. Все задания реализованы на языке Java без использования сторонних библиотек (кроме стандартных).
- Домашнее задание 1 – собственные аналоги
HashSetиArrayList, работа со Stream API. - Домашнее задание 2 – работа с файлами, пользовательское исключение.
- Домашнее задание 3 – реализация паттернов проектирования (реализовано 6 паттернов проектирования).
- Домашнее задание 4 – многопоточность: DeadLock, LiveLock, поочерёдный вывод чисел.
- Командная проект (мой вклад) – реализация модуля ввода/вывода данных – создание массива автомобилей из разных источников и сохранение результатов в файл.
Реализован MyHashSet<E> с методами:
add(E element)– добавляет элемент, если его ещё нетremove(E element)– удаляет элементcontains(E element)– проверка наличия- автоматическое перехеширование при превышении
LOAD_FACTOR = 0.75
Используется хеш-таблица с цепочками (Separate Chaining).
Реализован MyArrayList<E> с методами:
add(E element)– добавление в конецget(int index),remove(int index)addAll(Collection<? extends E> c)– добавление всех элементов из коллекции
Созданы классы Student и Book. В одном потоке выполняются операции:
- вывод каждого студента
- получение списка всех книг (flatMap)
- сортировка по количеству страниц
- фильтр книг, выпущенных после 2000 года
- ограничение первыми 3 элементами
- получение произвольного года выпуска через
findAny()и обработкаifPresentOrElse()
- Создано собственное непроверяемое исключение
FileOperationException - Класс
FileManagerсодержит методы:writeToFile(String filename, String data)– запись строки в файлreadFromFile(String filename)– чтение содержимого файла
- В
mainреализован консольный ввод данных и имени файла с последующей записью и чтением
Все операции ввода-вывода обёрнуты в try-with-resources, ошибки преобразуются в FileOperationException.
| Паттерн | Описание | Пример |
|---|---|---|
| Strategy | Взаимозаменяемые алгоритмы оплаты | creditCardPayment, PayPalPayment |
| Chain of Responsibility | Цепочка логгеров (Console, File, Error) | Обработка сообщений разного уровня |
| Builder | Пошаговое создание компьютера | Computer.ComputerBuilder |
| Proxy | Ленивая загрузка изображений | ProxyImage ↔ RealImage |
| Decorator | Динамическое добавление опций к кофе | MilkCoffee, SyrupCoffee |
| Adapter | Адаптация LegacyRectangle к интерфейсу Shape |
рисует прямоугольник в консоли |
Каждый паттерн представлен отдельным запускаемым классом.
Два потока захватывают мониторы в разном порядке:
lock1 → lock2 и lock2 → lock1, что приводит к взаимной блокировке.
Состояние потоков выводится через getState().
Два Worker бесконечно уступают друг другу общий Resource, но не выполняют полезную работу.
Два потока через wait()/notifyAll() печатают бесконечную последовательность: 1 2 1 2 ...
В рамках курса мы разработали приложение для работы с автомобилями.
Моя ответственность: реализация модуля ввода/вывода данных – создание массива автомобилей из разных источников и сохранение результатов в файл.
Классы, написанные мной:
| Класс | Назначение |
|---|---|
InputManager |
Создание массива Car[] тремя способами: вручную (консоль), случайная генерация, чтение из CSV‑файла |
OutputManager |
Сохранение массива автомобилей в текстовый файл в формате Модель,Мощность,Год |
Вспомогательные модели (совместная работа):
Car– неизменяемый класс, построенный черезBuilderс валидацией полей.CarComparators– готовые компараторы для сортировки по модели, мощности и году.
- Java 17+ (можно использовать любую версию от 8)
- Сборка: компиляция через
javacили любая IDE (IntelliJ IDEA, Eclipse) - Никаких внешних зависимостей (Maven/Gradle не используется)