Java Portal | Программирование
13.1K subscribers
966 photos
72 videos
32 files
777 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Совет дня:

Проверка (assert) одиночного объекта против List<Object> в ответах при использовании MockMvcTester в Spring.

- Первый блок проверяет, что по /api/posts/1 возвращается Post, у которого title равен "Post title here"

- Второй блок проверяет, что по /api/posts приходит список из 4 элементов типа Post

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥2👀2
Вопросы уровня Easy/Medium на собеседовании по Java

1. Что такое ключевое слово static и где оно используется?

Ответ:
Статические члены принадлежат классу, а не экземпляру.
Можно обращаться к ним без создания объекта.
В памяти существует только одна копия.

2. В чём разница между abstract class и interface?

Ответ:
- Абстрактный класс: может содержать реализации методов, конструкторы, поддерживает одиночное наследование
- Интерфейс: начиная с Java 8, может иметь методы по умолчанию, поддерживает множественное наследование, содержит только публичные методы

3. Что такое wrapper-классы и зачем они нужны?

Ответ:
Это объектные обёртки над примитивами (Integer, Boolean и т. д.).
Используются в коллекциях, обобщениях и там, где требуются объекты вместо примитивов.

4. Что делает оператор instanceof?

Ответ:
Проверяет, является ли объект экземпляром определённого класса или интерфейса.
Возвращает boolean.

5. Что такое инкапсуляция и как её реализовать?

Ответ:
Сокрытие внутреннего состояния и предоставление доступа через методы.
Реализуется с помощью приватных полей и публичных геттеров/сеттеров.

6. Что такое абстракция и как она реализуется?

Ответ:
Сокрытие деталей реализации и упрощение интерфейса.
Реализуется через абстрактные классы и интерфейсы.

7. Можно ли переопределить private-метод?

Ответ:
Нет. Приватные методы недоступны в наследниках, поэтому их нельзя переопределить.

8. Может ли класс быть одновременно abstract и final?

Ответ:
Нет. abstract означает, что класс предназначен для наследования,
а final — что класс нельзя наследовать.

9. Что такое marker-интерфейсы?

Ответ:
Интерфейсы без методов, используемые как метки.
Примеры: Serializable, Cloneable.

10. Что такое diamond problem (проблема ромбовидного наследования)?

Ответ:
Проблема возникает при множественном наследовании,
если класс наследует двух родителей, имеющих общего предка — возникает неоднозначность, какой метод использовать.

11. В чём разница между Collection и Collections?

Ответ:
- Collection — корневой интерфейс для всех коллекций
- Collectionsутилитарный класс с набором статических методов для работы с коллекциями

12. Что такое fail-fast и fail-safe итераторы?

Ответ:
- Fail-fast: выбрасывает ConcurrentModificationException, если коллекция была изменена во время итерации
- Fail-safe: работает с копией коллекции, поэтому не выбрасывает исключений

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍6🔥5
Обзор версий Java

Java — JDK 25 выйдет уже в сентябре этого года


Схема версионирования Java, Java 8 и старше


- Система версионирования Java долгое время была нетипичной по сравнению с большинством других языков и платформ.
- Раньше номера версий выглядели как "1.x", например: 1.5, 1.6. Это отражало раннюю историю развития языка.
- Официальная схема именования использовала формат "Java SE x.y", где x — мажорная версия, а y — минорная.

Примеры:
- Java SE 5.0 → Java 1.5
- Java SE 6.0 → Java 1.6
- Java SE 8.0 → Java 1.8

Эта схема создавала путаницу, потому что казалось, будто Java всё ещё находится на версии 1.x, хотя фактически язык уже прошёл через множество мажорных релизов.

Схема версионирования Java, начиная с Java 9

- Начиная с Java 9, префикс 1. был официально отброшен.
- Теперь версии называются просто по мажорному номеру:
Java 9 — это просто 9, Java 10 — это 10 и т. д.
- Это изменение внесли, чтобы:
- устранить путаницу,
- привести систему к стандартной практике версионирования в индустрии.
- Кроме того, это отражает серьёзные архитектурные изменения, которые начались с Java 9 и продолжились в последующих версиях.

Эволюция версий Java:

Java 1.0 — 23.01.1996
🔸Первый релиз: апплеты, базовые библиотеки, core API

Java 1.1 — 19.02.1997
🔸Внутренние классы, JDBC, AWT event-модель

Java 1.2 — 08.12.1998
🔸Swing GUI, коллекции, JIT-компилятор

Java 1.3 — 08.05.2000
🔸HotSpot JVM, RMI по IIOP (CORBA)

Java 1.4 — 06.02.2002
🔸Assertions, Logging API, регулярки, улучшенная модель памяти

Java 1.5 — 30.09.2004
🔸Дженерики, аннотации, enum, цикл for-each

Java 1.6 — 11.12.2006
🔸Scripting API, аннотации, улучшения JVM и рантайма

Java 1.7 — 28.07.2011
🔸Diamond-оператор, try-with-resources, строки в switch

Java 1.8 (LTS) — 18.03.2014
🔸Лямбды, Stream API, default-методы, новый Date/Time API

Java 9 — 21.09.2017
🔸Модульная система (Project Jigsaw), HTTP Client, JShell

Java 10 — 20.03.2018
🔸var, GC интерфейс, Class-Data Sharing

Java 11 (LTS) — 25.09.2018
🔸HTTP Client, dynamic class constants, Nest-Based Access Control

Java 12 — 19.03.2019
🔸switch (preview), Teeing Collectors, компактное форматирование чисел

Java 13 — 17.09.2019
🔸Text blocks, улучшения switch, ZGC

Java 14 — 17.03.2020
🔸Pattern matching (instanceof), Records (preview), JFR streaming

Java 15 — 15.09.2020
🔸Sealed-классы, скрытые классы, удалён Nashorn

Java 16 — 16.03.2021
🔸Records, Pattern Matching, Vector API, Foreign Memory API

Java 17 (LTS) — 14.09.2021
🔸Pattern Matching for switch, Sealed-классы, Foreign Function API

Java 18 — 22.03.2022
🔸UTF-8 по умолчанию, Web Server, Code snippets в API

Java 19 — 20.09.2022
🔸Record Patterns, Virtual Threads, Structured Concurrency

Java 20 — 21.03.2023
🔸Scoped Values, Virtual Threads (prod)

Java 21 (LTS) — 19.09.2023
🔸Sequenced Collections, Record Patterns, Virtual Threads, KEM API

Java 22 — 19.03.2024
🔸Region Pinning, Foreign Function API, Unnamed Variables & Patterns

Java 23 — 17.09.2024
🔸Pattern Matching, Scoped Values, Structured Concurrency

Java 24 — 18.03.2025
🔸Stream Gatherers, Compact Object Headers


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85
🔸Принципы проектирования
Слабая связность — минимизация зависимостей между компонентами
Высокая связность — группировка функционально связанных элементов
Абстракция — скрытие деталей реализации
Единая ответственность — каждый компонент делает одну вещь хорошо
Разделение ответственности — разделение системы на отдельные модули
Бездействие (Statelessness) — по возможности избегать хранения сессий
Идемпотентность — операции можно безопасно повторять
Событийная согласованность — временное несоответствие для доступности и производительности
Быстрое обнаружение ошибок (Fail-Fast) — быстрое выявление и сообщение об ошибках
Circuit Breaker — изоляция сбойных компонентов
Механизмы повторных попыток — автоматический повтор неудачных операций
Асинхронность — дизайн для неблокирующей коммуникации
Таймауты/Дедлайны — установка лимитов для предотвращения бесконечных ожиданий


🔸Управление данными
Распределённые базы данных
- NoSQL — MongoDB, Cassandra, DynamoDB (гибкая схема, масштабируемые)
- NewSQL — CockroachDB, YugabyteDB (масштабируемые с возможностями SQL)
Распределённые файловые системы
- HDFS — для больших данных (Hadoop)
- Ceph — унифицированная распределённая файловая система
Кеширование — Redis, Memcached (в памяти для скорости)
ACID — атомарность, согласованность, изоляция, долговечность (гарантии реляционных БД)
BASE — в основном доступная, с мягкой согласованностью (характеристики NoSQL)
Шардирование данных — распределение данных по нодам (шардинг, хеширование, диапазоны)
Стратегии репликации — копирование данных для отказоустойчивости


🔸Ошибки распределённых вычислений
Сеть надёжна | Задержка равна нулю | Пропускная способность бесконечна | Сеть защищена | Топология не меняется | Есть один администратор | Стоимость передачи равна нулю | Сеть однородна
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
Шпаргалка по распределённым системам

🔸Основные концепции
Распределённая система — набор взаимосвязанных компьютеров, которые общаются и координируются для достижения общей цели
Масштабируемость — обработка возросшей нагрузки
- Горизонтальная — добавление новых машин (нод)
- Вертикальная — апгрейд существующих машин (например, CPU, RAM)
Надёжность — корректная работа несмотря на сбои
Доступность — доля времени работы системы без простоев
Согласованность — согласие по значениям данных между всеми нодами в заданный момент
Устойчивость к разделению сети (Partition Tolerance) — работа при сетевых разрывах
Теорема CAP — из трёх свойств (Согласованность, Доступность, Устойчивость к разделениям) можно выбрать только два
Управление состоянием — хранение и синхронизация данных между нодами (без состояния/со состоянием)
Шардирование данных — разделение данных для масштабируемости (горизонтальное/вертикальное, по хешу/диапазону)
Стратегии репликации — копирование данных для отказоустойчивости (синхронная/асинхронная/на основе кворума)
Модели согласованности — компромиссы между согласованием данных и производительностью (строгая/событийная/каузальная)
Порядок и время — упорядочивание событий (метки Лэмпорта/векторные часы)
Отказоустойчивость — управление сбоями (фейловер/резервирование)
Управление конкурентным доступом — одновременный доступ к ресурсам (оптимистичный/пессимистичный контроль)


🔸Архитектуры
Клиент-сервер — клиенты запрашивают сервисы у серверов
P2P (одноранговая сеть) — ноды одновременно клиенты и серверы
Master-Slave — один мастер-узел координирует, множество слейвов выполняют задачи
Микросервисы — система разбита на мелкие независимые сервисы
Событийно-ориентированная архитектура — компоненты реагируют на события
SOA (сервис-ориентированная архитектура) — набор сервисов, общающихся между собой
Lambda-архитектура — гибридная архитектура для пакетной и потоковой обработки


🔸Ключевые технологии
Оркестрация контейнеров — Kubernetes, Docker Swarm
Сервис-дискавери — Consul, etcd
API-шлюзы — Kong, Tyk, Apigee, AWS API Gateway
Балансировщики нагрузки — HAProxy, NGINX, Traefik, Amazon ELB
Мониторинг и наблюдаемость — Prometheus, Grafana
Распределённый трейсинг — Zipkin, Jaeger
Сервисная сетка (Service Mesh) — Istio, Linkerd
Инфраструктура как код (IaC) — Terraform, CloudFormation
Управление конфигурациями — Ansible, Chef, Puppet
Распределённые кеши — Redis, Memcached
Обработка потоков — Apache Flink, Apache Spark Streaming
Оркестрация рабочих процессов — Apache Airflow, Argo Workflows
Планировщики заданий — Quartz, Apache Oozie, Kubernetes CronJobs
Облачные провайдеры — AWS, Azure, Google Cloud Platform
Безсерверные платформы — AWS Lambda, Azure Functions, Google Cloud Functions


🔸Коммуникация
Удалённый вызов процедур (RPC) — вызов функции на удалённой машине
Обмен сообщениями — асинхронное взаимодействие между нодами
- Очереди сообщений (Point-to-Point) — RabbitMQ, Amazon SQS
- Брокеры сообщений (Publish-Subscribe) — Kafka, Apache Pulsar
REST — язык запросов для API с точечным доступом к данным
GraphQL — TLS/SSL, HTTPS, SSH
gRPC — высокопроизводительный RPC с использованием Protocol Buffers
Webhooks — автоматические уведомления при определённых событиях


🔸Координация и консенсус
Алгоритмы консенсуса — Paxos, Raft
Распределённые блокировки — ZooKeeper, etcd
Распределённые транзакции — двухфазный коммит (2PC)
Выбор лидера — выбор координатора
Протокол госсипа — децентрализованное распространение информации
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61
Динамические прокси для логирования в стиле AOP

Используй java.lang.reflect.Proxy, чтобы перехватывать вызовы методов на этапе выполнения.
Это позволяет эмулировать AOP без Spring — идеально подходит для обработки сквозной логики (cross-cutting concerns).

В этом примере мы логируем до и после вызова метода.
Такой подход даёт гибкий способ динамически абстрагировать поведение.

> Динамические прокси позволяют внедрять поведение — например, логирование, тайминг или проверку безопасности — без изменений исходного кода.

Этот паттерн активно используется во фреймворках вроде Spring и Hibernate.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7👀2
This media is not supported in your browser
VIEW IN TELEGRAM
Конкурентность vs параллелизм - это НЕ одно и то же

Конкурентность:

Конкурентность означает, что приложение продвигается по нескольким задачам одновременно.

Хотя один CPU-ядро может обрабатывать только одну задачу за раз, оно достигает конкурентности, быстро переключаясь между задачами.

Пример: Слушание музыки во время написания кода. CPU быстро переключается между этими задачами так эффективно, что кажется, будто обе выполняются одновременно.

Основная цель конкурентности — максимизировать использование процессора, минимизируя время простоя.

Параллелизм:

Параллелизм означает выполнение нескольких задач одновременно.

Для достижения параллелизма задачи разбиваются на более мелкие независимые подзадачи и обрабатываются одновременно на нескольких процессорах, ядрах или GPU.

Пример: Обучение модели глубокого обучения, разделив датасет на батчи и обрабатывая каждый батч одновременно на нескольких GPU.

Цель параллелизма — ускорить обработку, выполняя несколько задач одновременно.

Они не являются взаимно исключающимися:

🔸Можно иметь конкурентность без параллелизма.
🔸Можно иметь параллелизм без конкурентности.
🔸Или можно использовать и то, и другое для высокопроизводительных систем.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
5 советов по написанию действительно хороших юнит-тестов

1) Тестируйте поведение, а не реализацию

Пишите тесты, которые проверяют, что код должен делать, а не как именно он это делает внутри.

Потому что внутренние методы могут изменяться, но ожидаемое поведение должно оставаться стабильным.

2) Давайте тестам имена как документации, а не как коду

Пишите имена тестовых методов так, как будто они рассказывают историю - - чётко, конкретно и читаемо для человека.

Это облегчает чтение отчетов о тестах — не нужно углубляться в код.

3) Пишите тест до исправления ошибки

Когда вы обнаруживаете ошибку, сначала напишите тест, который воспроизводит её, прежде чем исправить код.

Это докажет, что ошибка действительно существует (а не только в вашей голове).

Допустим, вы обнаружили, что дни рождения в високосный год крашат вашу систему.

4) Используйте тесты с параметрами для граничных случаев

Вместо того чтобы писать много похожих тестов, пробегитесь по набору входных данных с помощью параметризованных тестов.

Это предотвращает беспорядок от копипаста и делает набор тестов более чистым.

5) Проверяйте только важные моменты, а не все поля

Сфокусируйтесь на утверждениях, касающихся важных бизнес-результатов, а не на каждом поле объекта.

Это помогает тестам оставаться стабильными, даже когда несущественные детали изменяются.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍107
7 ключевых сложностей по времени выполнения, которые нужно знать для собеседований по программированию:

1. O(1) — Константное время
- Время выполнения не зависит от размера входных данных.
- 📌 Пример: доступ к элементу массива по индексу.

2. O(log n) — Логарифмическое время
- Время выполнения растёт медленно по мере увеличения входных данных. Обычно встречается в алгоритмах, делящих задачу пополам на каждом шаге.
- 📌Пример: бинарный поиск в отсортированном массиве.

3. O(n) — Линейное время
- Время выполнения растёт пропорционально объёму входных данных.
- 📌Пример: поиск элемента в массиве перебором.

4. O(n log n) — Линеаритмическое время
- Время выполнения немного быстрее, чем квадратичное, и включает логарифмическое количество операций на каждый элемент.
- 📌Пример: сортировка массива алгоритмами быстрой сортировки (quick sort) или слиянием (merge sort).

5. O(n²) — Квадратичное время
- Время выполнения растёт пропорционально квадрату входных данных.
- 📌Пример: сортировка пузырьком, где сравниваются и при необходимости меняются местами все пары элементов.

6. O(2ⁿ) — Экспоненциальное время
- Время выполнения удваивается с каждым новым элементом входа. Такие алгоритмы быстро становятся неэффективными при больших объёмах данных.
- 📌Пример: генерация всех подмножеств множества.

7. O(n!) — Факториальное время
- Время выполнения растёт как факториал от количества входных данных.
- 📌Пример: генерация всех перестановок множества.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍152
Функциональное программирование в Java с использованием Streams и лямбд:

Streams обрабатывают фильтрацию, сортировку и свёртку данных, а лямбды упрощают определение функций. В Spring они используются для построения реактивных API, а в задачах алгоритмического программирования — для оптимизации обработки данных.

Выше приведён пример REST-эндпойнта на Spring, фильтрующего пользователей, и функции в стиле олимпиадного программирования для поиска лидеров по очкам.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3😁3
🔍Тестовое собеседование с Java-разработчиком из Oracle завтра

23 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Алексей Ушаровский, разработчик с опытом работы в Oracle и EPAM, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Алексей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Алексею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3🤣1
Как вернуть результат в виде Map из запроса JPA или Hibernate

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🌭2
This media is not supported in your browser
VIEW IN TELEGRAM
Необходимый репозиторий с сотнями бесплатных API для практики программирования и создания проектов.

Обновляется еженедельно и разделён по темам 😇

http://github.com/public-apis-dev/public-apis

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Этот репозиторий представляет собой целую энциклопедию для Java-разработчиков. Автор структурировал материал от основ языка до продвинутых тем

Он охватывает основы, ООП, многопоточность, сборку мусора, коллекции и другие важные темы

Проект имеет полезные разделы с примерами кода: от классических паттернов вроде Singleton до задач на динамическое программирование. Для тех, кто готовится к собеседованиям, есть подборка LeetCode-шаблонов и реальных interview-задач. 😡

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍5🔥4
8 концепций проектирования систем, объясненных в одной диаграмме

1. Availability with Load Balancers

Использование балансировщиков (Layer 7) для распределения трафика между несколькими экземплярами сервисов (например, Comment Service, Post Service).

Повышает отказоустойчивость и доступность.

2. Latency with CDNs

CDN кэширует контент ближе к пользователю, уменьшая задержки.

Первый запрос идёт на origin-сервер, второй — уже из кэша CDN.

3. Scalability with Replication

Данные реплицируются между несколькими узлами.

Увеличивает доступность и масштабируемость систем.

4. Durability with Transaction Logs

Система сохраняет изменения в журнал транзакций перед применением.

В случае сбоя состояние может быть восстановлено из лога.

5. Consistency with Eventual Consistency

Записи и чтения могут идти в разные источники.

Система приходит к согласованному состоянию со временем (eventually).

6. Modularity with Loose Coupling and High Cohesion

Модули имеют чёткие границы и хорошо организованы внутри.

Улучшает читаемость, повторное использование и сопровождение кода.

7. Configurability with Configuration-as-Code

Инфраструктура управляется через код (например, Terraform, Ansible).

Контроль версий, автоматизация и повторяемость.

8. Resiliency with Message Queues

Задания помещаются в очередь, откуда обрабатываются несколькими потребителями.

Улучшает отказоустойчивость и масштабируемость обработки.


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74
Метод createNativeQuery из JPA EntityManager

Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать createNativeQuery. Нативный SQL в JPA — это мощный инструмент, особенно когда JPQL ограничен

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👀2