Совет дня:
Проверка (
- Первый блок проверяет, что по
- Второй блок проверяет, что по
👉 Java Portal
Проверка (
assert
) одиночного объекта против List<Object>
в ответах при использовании MockMvcTester
в Spring.- Первый блок проверяет, что по
/api/posts/1
возвращается Post, у которого title
равен "Post title here"
- Второй блок проверяет, что по
/api/posts
приходит список из 4 элементов типа Post
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥2👀2
Вопросы уровня Easy/Medium на собеседовании по Java
1. Что такое ключевое слово
Ответ:
Статические члены принадлежат классу, а не экземпляру.
Можно обращаться к ним без создания объекта.
В памяти существует только одна копия.
2. В чём разница между
Ответ:
- Абстрактный класс: может содержать реализации методов, конструкторы, поддерживает одиночное наследование
- Интерфейс: начиная с Java 8, может иметь методы по умолчанию, поддерживает множественное наследование, содержит только публичные методы
3. Что такое wrapper-классы и зачем они нужны?
Ответ:
Это объектные обёртки над примитивами (
Используются в коллекциях, обобщениях и там, где требуются объекты вместо примитивов.
4. Что делает оператор
Ответ:
Проверяет, является ли объект экземпляром определённого класса или интерфейса.
Возвращает boolean.
5. Что такое инкапсуляция и как её реализовать?
Ответ:
Сокрытие внутреннего состояния и предоставление доступа через методы.
Реализуется с помощью приватных полей и публичных геттеров/сеттеров.
6. Что такое абстракция и как она реализуется?
Ответ:
Сокрытие деталей реализации и упрощение интерфейса.
Реализуется через абстрактные классы и интерфейсы.
7. Можно ли переопределить
Ответ:
Нет. Приватные методы недоступны в наследниках, поэтому их нельзя переопределить.
8. Может ли класс быть одновременно
Ответ:
Нет.
а
9. Что такое marker-интерфейсы?
Ответ:
Интерфейсы без методов, используемые как метки.
Примеры:
10. Что такое diamond problem (проблема ромбовидного наследования)?
Ответ:
Проблема возникает при множественном наследовании,
если класс наследует двух родителей, имеющих общего предка — возникает неоднозначность, какой метод использовать.
11. В чём разница между
Ответ:
-
-
12. Что такое
Ответ:
- Fail-fast: выбрасывает
- Fail-safe: работает с копией коллекции, поэтому не выбрасывает исключений
👉 Java Portal
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: работает с копией коллекции, поэтому не выбрасывает исключений
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍6🔥5
Обзор версий Java
Схема версионирования Java, Java 8 и старше
- Система версионирования Java долгое время была нетипичной по сравнению с большинством других языков и платформ.
- Раньше номера версий выглядели как "1.x", например:
- Официальная схема именования использовала формат "Java SE 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, префикс
- Теперь версии называются просто по мажорному номеру:
Java 9 — это просто
- Это изменение внесли, чтобы:
- устранить путаницу,
- привести систему к стандартной практике версионирования в индустрии.
- Кроме того, это отражает серьёзные архитектурные изменения, которые начались с Java 9 и продолжились в последующих версиях.
Эволюция версий Java:
👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5
Слабая связность — минимизация зависимостей между компонентами
Высокая связность — группировка функционально связанных элементов
Абстракция — скрытие деталей реализации
Единая ответственность — каждый компонент делает одну вещь хорошо
Разделение ответственности — разделение системы на отдельные модули
Бездействие (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
🔥3❤1
Шпаргалка по распределённым системам
🔸 Основные концепции
🔸 Архитектуры
🔸 Ключевые технологии
🔸 Коммуникация
🔸 Координация и консенсус
Распределённая система — набор взаимосвязанных компьютеров, которые общаются и координируются для достижения общей цели
Масштабируемость — обработка возросшей нагрузки
- Горизонтальная — добавление новых машин (нод)
- Вертикальная — апгрейд существующих машин (например, 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
🔥6❤1
Динамические прокси для логирования в стиле AOP
Используй
Это позволяет эмулировать AOP без Spring — идеально подходит для обработки сквозной логики (cross-cutting concerns).
В этом примере мы логируем до и после вызова метода.
Такой подход даёт гибкий способ динамически абстрагировать поведение.
> Динамические прокси позволяют внедрять поведение — например, логирование, тайминг или проверку безопасности — без изменений исходного кода.
Этот паттерн активно используется во фреймворках вроде Spring и Hibernate.
👉 Java Portal
Используй
java.lang.reflect.Proxy
, чтобы перехватывать вызовы методов на этапе выполнения. Это позволяет эмулировать AOP без Spring — идеально подходит для обработки сквозной логики (cross-cutting concerns).
В этом примере мы логируем до и после вызова метода.
Такой подход даёт гибкий способ динамически абстрагировать поведение.
> Динамические прокси позволяют внедрять поведение — например, логирование, тайминг или проверку безопасности — без изменений исходного кода.
Этот паттерн активно используется во фреймворках вроде Spring и Hibernate.
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
Конкурентность:
Конкурентность означает, что приложение продвигается по нескольким задачам одновременно.
Хотя один CPU-ядро может обрабатывать только одну задачу за раз, оно достигает конкурентности, быстро переключаясь между задачами.
Пример: Слушание музыки во время написания кода. CPU быстро переключается между этими задачами так эффективно, что кажется, будто обе выполняются одновременно.
Основная цель конкурентности — максимизировать использование процессора, минимизируя время простоя.
Параллелизм:
Параллелизм означает выполнение нескольких задач одновременно.
Для достижения параллелизма задачи разбиваются на более мелкие независимые подзадачи и обрабатываются одновременно на нескольких процессорах, ядрах или GPU.
Пример: Обучение модели глубокого обучения, разделив датасет на батчи и обрабатывая каждый батч одновременно на нескольких GPU.
Цель параллелизма — ускорить обработку, выполняя несколько задач одновременно.
Они не являются взаимно исключающимися:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
5 советов по написанию действительно хороших юнит-тестов
1) Тестируйте поведение, а не реализацию
Пишите тесты, которые проверяют, что код должен делать, а не как именно он это делает внутри.
Потому что внутренние методы могут изменяться, но ожидаемое поведение должно оставаться стабильным.
2) Давайте тестам имена как документации, а не как коду
Пишите имена тестовых методов так, как будто они рассказывают историю - - чётко, конкретно и читаемо для человека.
Это облегчает чтение отчетов о тестах — не нужно углубляться в код.
3) Пишите тест до исправления ошибки
Когда вы обнаруживаете ошибку, сначала напишите тест, который воспроизводит её, прежде чем исправить код.
Это докажет, что ошибка действительно существует (а не только в вашей голове).
Допустим, вы обнаружили, что дни рождения в високосный год крашат вашу систему.
4) Используйте тесты с параметрами для граничных случаев
Вместо того чтобы писать много похожих тестов, пробегитесь по набору входных данных с помощью параметризованных тестов.
Это предотвращает беспорядок от копипаста и делает набор тестов более чистым.
5) Проверяйте только важные моменты, а не все поля
Сфокусируйтесь на утверждениях, касающихся важных бизнес-результатов, а не на каждом поле объекта.
Это помогает тестам оставаться стабильными, даже когда несущественные детали изменяются.
👉 Java Portal
1) Тестируйте поведение, а не реализацию
Пишите тесты, которые проверяют, что код должен делать, а не как именно он это делает внутри.
Потому что внутренние методы могут изменяться, но ожидаемое поведение должно оставаться стабильным.
2) Давайте тестам имена как документации, а не как коду
Пишите имена тестовых методов так, как будто они рассказывают историю - - чётко, конкретно и читаемо для человека.
Это облегчает чтение отчетов о тестах — не нужно углубляться в код.
3) Пишите тест до исправления ошибки
Когда вы обнаруживаете ошибку, сначала напишите тест, который воспроизводит её, прежде чем исправить код.
Это докажет, что ошибка действительно существует (а не только в вашей голове).
Допустим, вы обнаружили, что дни рождения в високосный год крашат вашу систему.
4) Используйте тесты с параметрами для граничных случаев
Вместо того чтобы писать много похожих тестов, пробегитесь по набору входных данных с помощью параметризованных тестов.
Это предотвращает беспорядок от копипаста и делает набор тестов более чистым.
5) Проверяйте только важные моменты, а не все поля
Сфокусируйтесь на утверждениях, касающихся важных бизнес-результатов, а не на каждом поле объекта.
Это помогает тестам оставаться стабильными, даже когда несущественные детали изменяются.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7
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
1. O(1) — Константное время
- Время выполнения не зависит от размера входных данных.
-
2. O(log n) — Логарифмическое время
- Время выполнения растёт медленно по мере увеличения входных данных. Обычно встречается в алгоритмах, делящих задачу пополам на каждом шаге.
-
3. O(n) — Линейное время
- Время выполнения растёт пропорционально объёму входных данных.
-
4. O(n log n) — Линеаритмическое время
- Время выполнения немного быстрее, чем квадратичное, и включает логарифмическое количество операций на каждый элемент.
-
5. O(n²) — Квадратичное время
- Время выполнения растёт пропорционально квадрату входных данных.
-
6. O(2ⁿ) — Экспоненциальное время
- Время выполнения удваивается с каждым новым элементом входа. Такие алгоритмы быстро становятся неэффективными при больших объёмах данных.
-
7. O(n!) — Факториальное время
- Время выполнения растёт как факториал от количества входных данных.
-
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤2
Функциональное программирование в Java с использованием Streams и лямбд:
Streams обрабатывают фильтрацию, сортировку и свёртку данных, а лямбды упрощают определение функций. В Spring они используются для построения реактивных API, а в задачах алгоритмического программирования — для оптимизации обработки данных.
Выше приведён пример REST-эндпойнта на Spring, фильтрующего пользователей, и функции в стиле олимпиадного программирования для поиска лидеров по очкам.
👉 Java Portal
Streams обрабатывают фильтрацию, сортировку и свёртку данных, а лямбды упрощают определение функций. В Spring они используются для построения реактивных API, а в задачах алгоритмического программирования — для оптимизации обработки данных.
Выше приведён пример REST-эндпойнта на Spring, фильтрующего пользователей, и функции в стиле олимпиадного программирования для поиска лидеров по очкам.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3😁3
23 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для 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
Обновляется еженедельно и разделён по темам
⇢ http://github.com/public-apis-dev/public-apis
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
Он охватывает основы, ООП, многопоточность, сборку мусора, коллекции и другие важные темы
Проект имеет полезные разделы с примерами кода: от классических паттернов вроде Singleton до задач на динамическое программирование. Для тех, кто готовится к собеседованиям, есть подборка LeetCode-шаблонов и реальных interview-задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥4
8 концепций проектирования систем, объясненных в одной диаграмме
👉 Java Portal
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
Задания помещаются в очередь, откуда обрабатываются несколькими потребителями.
Улучшает отказоустойчивость и масштабируемость обработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4
Метод
Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать
⏩ Читать подробнее
👉 Java Portal | #cтатья
createNativeQuery
из JPA EntityManager
Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать
createNativeQuery
. Нативный SQL в JPA — это мощный инструмент, особенно когда JPQL ограниченPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6👀2