<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Главная страница on IT Ментор | Java методичка</title><link>https://krios2146.github.io/java-backend-interview-prep/</link><description>Recent content in Главная страница on IT Ментор | Java методичка</description><generator>Hugo</generator><language>ru</language><lastBuildDate>Sat, 14 Feb 2026 21:21:43 +0400</lastBuildDate><atom:link href="https://krios2146.github.io/java-backend-interview-prep/index.xml" rel="self" type="application/rss+xml"/><item><title>Java Core</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/</guid><description>&lt;h2 id="java-core"&gt;
 Java Core
 &lt;a class="anchor" href="#java-core"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-расскажи-мне-про-контракт-и-свойства-equals--hashcode"&gt;1. Расскажи мне про контракт и свойства Equals &amp;amp; Hashcode &lt;a href="#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d0%bc%d0%bd%d0%b5-%d0%bf%d1%80%d0%be-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d0%ba%d1%82-%d0%b8-%d1%81%d0%b2%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%b0-equals--hashcode" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Контракт:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Если &lt;code&gt;hashCode()&lt;/code&gt; двух объектов возвращает разные значения, то они не могут быть равны&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;equals()&lt;/code&gt; объектов true, то и хеш-коды должны быть равны&lt;/li&gt;
&lt;li&gt;Переопределив &lt;code&gt;equals()&lt;/code&gt;, всегда переопределять &lt;code&gt;hashCode()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Если у объектов одинаковый &lt;code&gt;hashCode()&lt;/code&gt;, то они не обязательно &lt;code&gt;equals()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;При каждом вызове &lt;code&gt;hashCode()&lt;/code&gt; для одного и того же объекта должен возвращаться один и тот же хеш-код&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Свойства equals():&lt;/strong&gt;&lt;/em&gt;
Метод &lt;code&gt;equals()&lt;/code&gt; реализует отношение равенства (эквивалентности), которое обладает следующими свойствами:&lt;/p&gt;</description></item><item><title>SOLID</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/</guid><description>&lt;h2 id="solid"&gt;
 SOLID
 &lt;a class="anchor" href="#solid"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-solid-каждая-буква"&gt;1. Что такое SOLID (каждая буква)? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-solid-%d0%ba%d0%b0%d0%b6%d0%b4%d0%b0%d1%8f-%d0%b1%d1%83%d0%ba%d0%b2%d0%b0" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;SOLID&lt;/strong&gt; – это принципы разработки программного обеспечения, следуя которым получаем хороший код, который в дальнейшем будет хорошо масштабироваться и поддерживаться в рабочем состоянии.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;S&lt;/strong&gt; Single Responsibility Principle – принцип единственной ответственности.Каждый класс должен иметь только одну зону ответственности.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O&lt;/strong&gt; Open closed Principle – принцип открытости-закрытости.Классы должны быть открыты для расширения, но закрыты для изменения.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&lt;/strong&gt; Liskov substitution Principle – принцип подстановки Барбары Лисков. Должна быть возможность вместо базового (родительского) типа класса подставить любой его подтип (класс-наследник), при этом работа программы не должна измениться.&lt;/p&gt;</description></item><item><title>Базы данных</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/</guid><description>&lt;h2 id="базы-данных"&gt;
 Базы данных
 &lt;a class="anchor" href="#%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-виды-бд-и-для-чего-их-лучше-использовать"&gt;1. Виды БД и для чего их лучше использовать? &lt;a href="#1-%d0%b2%d0%b8%d0%b4%d1%8b-%d0%b1%d0%b4-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%85-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;ol&gt;
&lt;li&gt;Реляционные БД&lt;/li&gt;
&lt;li&gt;Документоориентированные базы данных&lt;/li&gt;
&lt;li&gt;Графовые базы данных&lt;/li&gt;
&lt;li&gt;Ключ-значение базы данных&lt;/li&gt;
&lt;li&gt;Колонноориентированные базы данных&lt;/li&gt;
&lt;li&gt;Временные базы данных (Time-Series)&lt;/li&gt;
&lt;li&gt;Объектно-ориентированные базы данных&lt;/li&gt;
&lt;li&gt;NewSQL&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Таблица сравнений&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Вид БД&lt;/th&gt;
 &lt;th&gt;Примеры&lt;/th&gt;
 &lt;th&gt;Основное применение&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Реляционные&lt;/td&gt;
 &lt;td&gt;MySQL, PostgreSQL&lt;/td&gt;
 &lt;td&gt;Финансы, CRM, интернет-магазины&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Документоориентированные&lt;/td&gt;
 &lt;td&gt;MongoDB, CouchDB&lt;/td&gt;
 &lt;td&gt;Гибкие структуры данных, профили пользователей&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Графовые&lt;/td&gt;
 &lt;td&gt;Neo4j, OrientDB&lt;/td&gt;
 &lt;td&gt;Анализ связей, социальные сети&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ключ-значение&lt;/td&gt;
 &lt;td&gt;Redis, DynamoDB&lt;/td&gt;
 &lt;td&gt;Кэширование, сессии&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Колонноориентированные&lt;/td&gt;
 &lt;td&gt;Cassandra, HBase&lt;/td&gt;
 &lt;td&gt;Аналитика, большие данные&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Временные&lt;/td&gt;
 &lt;td&gt;InfluxDB, TimescaleDB&lt;/td&gt;
 &lt;td&gt;Метрики, IoT&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Объектно-ориентированные&lt;/td&gt;
 &lt;td&gt;ObjectDB&lt;/td&gt;
 &lt;td&gt;CAD, моделирование&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NewSQL&lt;/td&gt;
 &lt;td&gt;CockroachDB&lt;/td&gt;
 &lt;td&gt;Масштабируемость, транзакции&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;&lt;/p&gt;</description></item><item><title>Деплой</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/</guid><description>&lt;h2 id="деплой"&gt;
 Деплой
 &lt;a class="anchor" href="#%d0%b4%d0%b5%d0%bf%d0%bb%d0%be%d0%b9"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-cicd"&gt;1. CI/CD &lt;a href="#1-cicd" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;em&gt;CI/CD&lt;/em&gt; (Continuous Integration / Continuous Delivery) — это набор практик и инструментов для автоматизации интеграции кода и доставки приложений:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CI (Continuous Integration)&lt;/em&gt;: Автоматическое тестирование и интеграция кода в общую ветку. После каждого коммита запускаются тесты, сборка.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CD (Continuous Delivery)&lt;/em&gt;: Автоматизация процесса доставки приложений на различные среды (dev, staging, production) после успешного тестирования.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-как-работает-docker-из-чего-состоит-докер-образ"&gt;2. Как работает Docker. Из чего состоит докер образ? &lt;a href="#2-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-docker-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%b4%d0%be%d0%ba%d0%b5%d1%80-%d0%be%d0%b1%d1%80%d0%b0%d0%b7" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Docker-образ состоит из:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Базового слоя&lt;/em&gt; (например, alpine, ubuntu).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Набора слоёв файловой системы&lt;/em&gt;, которые включают установленные пакеты, зависимости и конфигурации.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Манифеста&lt;/em&gt; (метаданных) образа, описывающих его слои и зависимости.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description></item><item><title>Другое</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/</guid><description>&lt;h2 id="другое"&gt;
 Другое
 &lt;a class="anchor" href="#%d0%b4%d1%80%d1%83%d0%b3%d0%be%d0%b5"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-инструменты-для-отладки-приложения-течет-память-все-замирает---visual-vm-jmap-профилировщики"&gt;1. Инструменты для отладки приложения, течет память, все замирает - Visual VM, JMap, профилировщики &lt;a href="#1-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d1%82%d0%bb%d0%b0%d0%b4%d0%ba%d0%b8-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d1%82%d0%b5%d1%87%d0%b5%d1%82-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d1%8c-%d0%b2%d1%81%d0%b5-%d0%b7%d0%b0%d0%bc%d0%b8%d1%80%d0%b0%d0%b5%d1%82---visual-vm-jmap-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d1%89%d0%b8%d0%ba%d0%b8" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Когда приложение ведет себя ненормально (например, потребляет слишком много памяти, замирает или падает), важно понять причину. Для этого используются инструменты мониторинга и отладки.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. VisualVM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Что это:&lt;/strong&gt; Инструмент для мониторинга JVM (Java Virtual Machine), входящий в состав JDK.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. JMap&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Что это:&lt;/strong&gt; Утилита для работы с состоянием памяти в JVM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Профилировщики&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Что это:&lt;/strong&gt; Специализированные инструменты для анализа работы приложений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Примеры:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YourKit&lt;/strong&gt;: Анализ потребления памяти, потоков и выполнения методов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JProfiler&lt;/strong&gt;: Профилирование производительности, памяти, потоков.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Async Profiler&lt;/strong&gt;: Низкоуровневый инструмент для анализа нагрузки на CPU и JVM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Когда использовать:&lt;/strong&gt; Если приложение замедляется, можно профилировать его выполнение и выявить &amp;ldquo;узкие места&amp;rdquo; — методы или участки кода, которые занимают много времени.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</description></item><item><title>Микросервисы</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/</guid><description>&lt;h2 id="микросервисы"&gt;
 Микросервисы
 &lt;a class="anchor" href="#%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d1%8b"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-монолит-vs-микросервис"&gt;1. Монолит vs Микросервис &lt;a href="#1-%d0%bc%d0%be%d0%bd%d0%be%d0%bb%d0%b8%d1%82-vs-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Монолит&lt;/em&gt; - это подход, где всё приложение разрабатывается как единое целое. Все функции и компоненты связаны друг с другом, работают в одном проекте и на одном сервере&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Микросервис&lt;/em&gt; - это подход, где приложение разбивается на независимые сервисы, каждый из которых отвечает за отдельную задачу&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Плюсы и минусы монолитов?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Не надо настраивать взаимодействие(Kafka например)&lt;/li&gt;
&lt;li&gt;Нет проблем с транзакциями в БД в отличии от микросервисов&lt;/li&gt;
&lt;li&gt;Выше производительность&lt;/li&gt;
&lt;li&gt;Простое развертывание для девопса&lt;/li&gt;
&lt;li&gt;Проще тестировать, т.к. монолит проще поднять нежели 10-ки микросервисов&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Тестирование</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/</guid><description>&lt;h2 id="тестирование"&gt;
 Тестирование
 &lt;a class="anchor" href="#%d1%82%d0%b5%d1%81%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-на-чем-пишутся-тесты"&gt;1. На чем пишутся тесты? &lt;a href="#1-%d0%bd%d0%b0-%d1%87%d0%b5%d0%bc-%d0%bf%d0%b8%d1%88%d1%83%d1%82%d1%81%d1%8f-%d1%82%d0%b5%d1%81%d1%82%d1%8b" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Unit-тесты&lt;/em&gt;: В основном используются фреймворки &lt;strong&gt;JUnit&lt;/strong&gt; для написания модульных тестов в Java.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Интеграционные тесты&lt;/em&gt;: Используют &lt;strong&gt;Spring Test&lt;/strong&gt;, &lt;strong&gt;Testcontainers&lt;/strong&gt; для интеграционного тестирования с базами данных и внешними системами.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mocking&lt;/em&gt;: Фреймворки, такие как &lt;strong&gt;Mockito&lt;/strong&gt; применяются для создания заглушек (mock-объектов) в unit-тестах.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;UI-тесты&lt;/em&gt;: Для тестирования интерфейсов часто используют &lt;strong&gt;Selenium&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Performance тесты&lt;/em&gt;: Инструменты вроде &lt;strong&gt;JMeter&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-mock-vs-spy"&gt;2. Mock vs spy &lt;a href="#2-mock-vs-spy" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;strong&gt;Критерий&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Mock&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Spy&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Описание&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Полностью имитирует поведение объекта. Вы задаёте ожидаемые ответы на вызовы методов.&lt;/td&gt;
 &lt;td&gt;Реальный объект, но с возможностью &amp;ldquo;шпионить&amp;rdquo; за вызовами методов.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Подход&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Заменяет объект, тестируется только взаимодействие (behavior verification).&lt;/td&gt;
 &lt;td&gt;Используется реальный объект, но вы можете подменять результаты вызовов его методов.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Когда использовать&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Когда необходимо полностью изолировать тестируемый объект от зависимости.&lt;/td&gt;
 &lt;td&gt;Когда хотите протестировать реальный объект, но также отследить вызовы его методов.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Пример использования&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Проверка взаимодействия с внешней зависимостью, например, базой данных.&lt;/td&gt;
 &lt;td&gt;Проверка поведения конкретного метода объекта, оставаясь близко к реальной логике.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Типы подмен&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Вы задаёте возвращаемые значения для всех методов объекта.&lt;/td&gt;
 &lt;td&gt;Реальные методы объекта выполняются, если не настроена их подмена.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;</description></item><item><title>Технические вопросы</title><link>https://krios2146.github.io/java-backend-interview-prep/questions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/questions/</guid><description>&lt;h1 id="технические-вопросы"&gt;
 Технические вопросы
 &lt;a class="anchor" href="#%d1%82%d0%b5%d1%85%d0%bd%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81%d1%8b"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;



 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 

 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 

 
 
 
 





 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 
 
 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/"&gt;ООП&lt;/a&gt; [10.31%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%be%d0%be%d0%bf"&gt;Что такое ООП?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#2-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%be%d0%be%d0%bf"&gt;Плюсы и минусы ООП&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#3-%d0%bf%d1%80%d0%b8%d0%bd%d1%86%d0%b8%d0%bf%d1%8b-%d0%be%d0%be%d0%bf-%d0%bd%d0%b0%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8%d0%bd%d0%ba%d0%b0%d0%bf%d1%81%d1%83%d0%bb%d1%8f%d1%86%d0%b8%d1%8f-%d0%bf%d0%be%d0%bb%d0%b8%d0%bc%d0%be%d1%80%d1%84%d0%b8%d0%b7%d0%bc-%d0%b0%d0%b1%d1%81%d1%82%d1%80%d0%b0%d0%ba%d1%86%d0%b8%d1%8f"&gt;Принципы ООП (наследование, инкапсуляция, полиморфизм, абстракция)&lt;/a&gt; [9.92%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#4-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81"&gt;Класс, объект, интерфейс&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#5-%d0%b0%d1%81%d1%81%d0%be%d1%86%d0%b8%d0%b0%d1%86%d0%b8%d1%8f-%d0%b0%d0%b3%d1%80%d0%b5%d0%b3%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%b7%d0%b8%d1%86%d0%b8%d1%8f"&gt;Ассоциация, агрегация, композиция&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#6-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d0%b8-%d0%b4%d0%b8%d0%bd%d0%b0%d0%bc%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d1%81%d0%b2%d1%8f%d0%b7%d1%8b%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5"&gt;Статическое и динамическое связывание&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/#7-%d1%8f%d0%b2%d0%bb%d1%8f%d0%b5%d1%82%d1%81%d1%8f--is-a-%d0%b8%d0%bc%d0%b5%d0%b5%d1%82--has-a"&gt;Является – «is a», имеет – «has a»&lt;/a&gt; [0.38%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/"&gt;SOLID&lt;/a&gt; [19.47%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-solid-%d0%ba%d0%b0%d0%b6%d0%b4%d0%b0%d1%8f-%d0%b1%d1%83%d0%ba%d0%b2%d0%b0"&gt;Что такое SOLID (каждая буква)?&lt;/a&gt; [19.08%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/#2-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d1%80%d0%b8%d0%bd%d1%86%d0%b8%d0%bf%d1%8b-%d0%bc%d0%be%d0%b6%d0%b5%d1%88%d1%8c-%d0%bd%d0%b0%d0%b7%d0%b2%d0%b0%d1%82%d1%8c"&gt;Какие принципы можешь назвать?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/solid/#3-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%bc%d1%8b-%d0%bc%d0%be%d0%b6%d0%b5%d0%bc-%d0%bd%d0%b0%d1%80%d1%83%d1%88%d0%b0%d1%82%d1%8c-%d0%bf%d1%80%d0%b8%d0%bd%d1%86%d0%b8%d0%bf%d1%8b-solid"&gt;Когда мы можем нарушать принципы SOLID?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/"&gt;Java Core&lt;/a&gt; [67.56%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d0%bc%d0%bd%d0%b5-%d0%bf%d1%80%d0%be-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d0%ba%d1%82-%d0%b8-%d1%81%d0%b2%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%b0-equals--hashcode"&gt;Расскажи мне про контракт и свойства Equals &amp;amp; Hashcode&lt;/a&gt; [20.23%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%ba%d0%be%d0%bb%d0%bb%d0%b8%d0%b7%d0%b8%d1%8f"&gt;Что такое коллизия?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#3-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%82%d0%b8%d0%bf%d1%8b-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%b2-java"&gt;Какие типы ссылок существуют в Java?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#4-%d0%ba%d0%b0%d0%ba%d0%be%d0%b9-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-%d0%bd%d0%b0%d0%b7%d1%8b%d0%b2%d0%b0%d1%8e%d1%82-immutable"&gt;Какой класс называют Immutable?&lt;/a&gt; [11.07%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#5-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d0%b0%d1%8f-%d0%b8%d0%b4%d0%b5%d1%8f-%d1%8f%d0%b7%d1%8b%d0%ba%d0%b0"&gt;Основная идея языка&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#6-%d0%b7%d0%b0-%d1%81%d1%87%d0%b5%d1%82-%d1%87%d0%b5%d0%b3%d0%be-%d0%be%d0%b1%d0%b5%d1%81%d0%bf%d0%b5%d1%87%d0%b5%d0%bd%d0%b0-%d0%ba%d1%80%d0%be%d1%81%d1%81%d0%bf%d0%bb%d0%b0%d1%82%d1%84%d0%be%d1%80%d0%bc%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;За счет чего обеспечена кроссплатформенность?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#7-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-java"&gt;Плюсы и минусы Java?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#8-jvm-jre-jdk-jit"&gt;JVM, JRE, JDK, JIT&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#9-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b1%d0%b0%d0%b9%d1%82-%d0%ba%d0%be%d0%b4"&gt;Что такое байт-код?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#10-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%b1%d0%be%d1%80%d1%89%d0%b8%d0%ba-%d0%bc%d1%83%d1%81%d0%be%d1%80%d0%b0-garbage-collector"&gt;Что такое сборщик мусора (garbage collector)?&lt;/a&gt; [8.02%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#11-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-gc"&gt;Как работает GC?&lt;/a&gt; [14.12%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#12-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b2%d0%b8%d0%b4%d1%8b-gc-%d0%b7%d0%bd%d0%b0%d0%b5%d1%88%d1%8c"&gt;Какие виды GC знаешь?&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#13-%d0%be%d0%b1%d0%bb%d0%b0%d1%81%d1%82%d0%b8-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8-java-stack-%d0%b8-heap-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5"&gt;Области памяти Java. Stack и heap. Что это такое?&lt;/a&gt; [16.79%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#14-%d1%82%d0%b8%d0%bf%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%b2-java"&gt;Типы данных в Java&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#15-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-%d0%be%d0%b1%d0%b5%d1%80%d1%82%d0%ba%d0%b0"&gt;Что такое класс-обертка?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#16-%d0%b0%d0%b2%d1%82%d0%be%d1%83%d0%bf%d0%b0%d0%ba%d0%be%d0%b2%d0%ba%d0%b0-%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b0%d1%81%d0%bf%d0%b0%d0%ba%d0%be%d0%b2%d0%ba%d0%b0"&gt;Автоупаковка и автораспаковка&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#17-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8string-%d0%b2-java-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%bd%d1%8e%d0%b0%d0%bd%d1%81%d1%8b"&gt;Строки/String в Java? Из чего состоит? Нюансы&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#18-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bf%d1%83%d0%bb-%d1%81%d1%82%d1%80%d0%be%d0%bastring-pool"&gt;Что такое пул строк/String pool?&lt;/a&gt; [9.16%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#19-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%bd%d0%b5-%d1%80%d0%b5%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d0%b4%d1%83%d0%b5%d1%82%d1%81%d1%8f-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8-%d0%b2-%d1%86%d0%b8%d0%ba%d0%bb%d0%b5"&gt;Почему не рекомендуется изменять строки в цикле?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#20-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-string-stringbuffer-stringbuilder"&gt;Разница между String, StringBuffer, StringBuilder&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#21-%d0%ba%d0%b0%d0%ba%d0%b8%d0%bc-%d0%be%d0%b1%d1%80%d0%b0%d0%b7%d0%be%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d1%8b%d0%b5-%d0%bf%d0%b5%d1%80%d0%b5%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b--%d0%bf%d0%be-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d1%8e-%d0%b8%d0%bb%d0%b8-%d0%bf%d0%be-%d1%81%d1%81%d1%8b%d0%bb%d0%ba%d0%b5"&gt;Каким образом переменные передаются в методы — по значению или по ссылке?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#22-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-enum"&gt;Что такое enum?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#23-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d0%be%d1%80"&gt;Что такое конструктор?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#24-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b5%d1%81%d1%82%d1%8c-%d0%bc%d0%be%d0%b4%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%82%d0%be%d1%80%d1%8b-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d0%bd%d0%b8%d0%bc%d1%8b-%d0%ba-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0%d0%bc"&gt;Какие есть модификаторы доступа? Какие применимы к классам?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#25-%d1%87%d1%82%d0%be-%d0%be%d0%b7%d0%bd%d0%b0%d1%87%d0%b0%d0%b5%d1%82-static"&gt;Что означает static?&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#26-%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%bb%d0%b8-%d1%81%d1%83%d0%b7%d0%b8%d1%82%d1%8c-%d1%83%d1%80%d0%be%d0%b2%d0%b5%d0%bd%d1%8c-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-%d0%b8%d0%bb%d0%b8-%d1%82%d0%b8%d0%bf-%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%89%d0%b0%d0%b5%d0%bc%d0%be%d0%b3%d0%be-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0"&gt;Можно ли сузить уровень доступа или тип возвращаемого значения при переопределении метода?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#27-%d1%87%d1%82%d0%be-%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b8%d1%82%d1%8c-%d0%b2-%d1%81%d0%b8%d0%b3%d0%bd%d0%b0%d1%82%d1%83%d1%80%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-%d0%bf%d1%80%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%bb%d0%b8-%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d0%bc%d0%be%d0%b4%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%82%d0%be%d1%80%d1%8b-throws-%d0%b8-%d1%82-%d0%bf"&gt;Что можно изменить в сигнатуре метода при переопределении? Можно ли менять модификаторы (throws и т. п.)?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#28-%d1%87%d1%82%d0%be-%d0%be%d0%b7%d0%bd%d0%b0%d1%87%d0%b0%d0%b5%d1%82-%d0%bc%d0%be%d0%b4%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%82%d0%be%d1%80-final-%d0%ba-%d1%87%d0%b5%d0%bc%d1%83-%d0%be%d0%bd-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%b1%d1%8b%d1%82%d1%8c-%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d0%bd%d0%b8%d0%bc"&gt;Что означает модификатор final? К чему он может быть применим?&lt;/a&gt; [8.02%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#29-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b0%d0%b1%d1%81%d1%82%d1%80%d0%b0%d0%ba%d1%82%d0%bd%d1%8b%d0%b5-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d1%8b"&gt;Что такое абстрактные классы?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#30-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d1%8b"&gt;Что такое интерфейсы?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#31-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d0%b0-%d0%be%d1%82-%d0%b0%d0%b1%d1%81%d1%82%d1%80%d0%b0%d0%ba%d1%82%d0%bd%d1%8b%d1%85-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2"&gt;Отличия интерфейса от абстрактных классов?&lt;/a&gt; [14.12%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#32-%d0%ba%d0%b0%d0%ba%d0%be%d0%b2-%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%be%d0%ba-%d0%b2%d1%8b%d0%b7%d0%be%d0%b2%d0%b0-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d0%be%d1%80%d0%be%d0%b2-%d0%b8-%d0%b1%d0%bb%d0%be%d0%ba%d0%be%d0%b2-%d0%b8%d0%bd%d0%b8%d1%86%d0%b8%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d1%81-%d1%83%d1%87%d0%b5%d1%82%d0%be%d0%bc-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d0%b8-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2"&gt;Каков порядок вызова конструкторов и блоков инициализации с учетом иерархии классов?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#33-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-%d0%b8-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b1%d1%8b%d0%b2%d0%b0%d1%8e%d1%82-%d0%b1%d0%bb%d0%be%d0%ba%d0%b8-%d0%b8%d0%bd%d0%b8%d1%86%d0%b8%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8"&gt;Зачем нужны и какие бывают блоки инициализации?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#34-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b2-java-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8e%d1%82%d1%81%d1%8f-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%b1%d0%bb%d0%be%d0%ba%d0%b8-%d0%b8%d0%bd%d0%b8%d1%86%d0%b8%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8"&gt;Для чего в Java используются статические блоки инициализации?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;35. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#35-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-object-%d0%b8-%d0%b5%d0%b3%d0%be-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b"&gt;Класс Object и его методы?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;36. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#36-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%b5%d1%80%d0%b8%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%be%d0%bd%d0%b0-%d0%bd%d1%83%d0%b6%d0%bd%d0%b0"&gt;Что такое сериализация и для чего она нужна?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;37. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#37-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f%d0%bc%d0%b8-java"&gt;Разница между версиями Java&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;38. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#38-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%bb%d0%b8-%d0%b0%d0%b1%d1%81%d1%82%d1%80%d0%b0%d0%ba%d1%82%d0%bd%d1%8b%d0%b9-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-%d0%b1%d1%8b%d1%82%d1%8c-final"&gt;Может ли абстрактный класс быть final?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;39. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#39-integer-pool"&gt;Integer pool&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;40. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#40-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b2%d0%b8%d0%b4%d1%8b-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d1%87%d0%b8%d0%ba%d0%be%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2-%d1%82%d1%8b-%d0%b7%d0%bd%d0%b0%d0%b5%d1%88%d1%8c"&gt;Какие виды загрузчиков классов ты знаешь?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;41. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#41-record-%d1%8b-%d1%81-java-17-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc"&gt;Record-ы с Java 17. Для чего и зачем?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;42. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#42-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b0%d0%bd%d0%be%d0%bd%d0%b8%d0%bc%d0%bd%d1%8b%d0%b9-%d0%ba%d0%bb%d0%b0%d1%81%d1%81"&gt;Что такое Анонимный класс&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;43. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#43-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d1%87%d1%82%d0%be-%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d1%82-jit-%d0%ba%d0%be%d0%bc%d0%bf%d0%b8%d0%bb%d1%8f%d1%82%d0%be%d1%80"&gt;Расскажи что делает JIT компилятор&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;44. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#44-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d0%bf%d1%80%d0%be-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b5%d0%b2-jvm"&gt;Расскажи про прогрев JVM&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;45. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#45-break-vs-continue-%d0%b2-%d1%86%d0%b8%d0%ba%d0%bb%d0%b5"&gt;break vs continue в цикле&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;46. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#46-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d1%8f-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d0%b0-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d1%81%d0%b2%d0%be%d1%8e-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d1%8e"&gt;Что такое аннотация? Зачем нужна? Как создать свою аннотацию?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;47. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#47-%d0%bf%d0%b5%d1%80%d0%b5%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d0%b0-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%be%d0%b2"&gt;Переопределение и перегрузка методов&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;48. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#48-classloader-%d0%b2-java"&gt;ClassLoader в Java&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;49. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/java-core/#49-%d0%b2-%d1%87%d0%b5%d0%bc-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d0%b9-%d0%bf%d0%be-equals-%d0%b8-"&gt;В чем разница сравнений по equals и &amp;#34;==&amp;#34;?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/"&gt;Коллекции&lt;/a&gt; [57.25%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%ba%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b3%d0%bb%d1%8f%d0%b4%d0%b8%d1%82-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8f-%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d0%b9"&gt;Расскажите как выглядит иерархия коллекций&lt;/a&gt; [21.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-arraylist"&gt;Что такое ArrayList?&lt;/a&gt; [5.73%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#3-arraylist-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%bc%d0%b0%d1%81%d1%81%d0%b8%d0%b2%d0%b0-%d0%bf%d0%be-%d1%83%d0%bc%d0%be%d0%bb%d1%87%d0%b0%d0%bd%d0%b8%d1%8e"&gt;ArrayList. Какая размерность массива по умолчанию?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#4-arraylist-%d1%87%d1%82%d0%be-%d0%bf%d1%80%d0%be%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%bf%d0%be%d0%b4-%d0%ba%d0%b0%d0%bf%d0%be%d1%82%d0%be%d0%bc-%d0%bf%d1%80%d0%b8-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8-%d1%8d%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d0%b0-%d0%b2-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be%d1%81%d0%b5%d1%80%d0%b5%d0%b4%d0%b8%d0%bd%d1%83%d0%ba%d0%be%d0%bd%d0%b5%d1%86-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0"&gt;ArrayList. Что происходит под капотом при добавлении/удалении элемента в начало/середину/конец списка?&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#5-arraylist---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;ArrayList - сложность операций&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#6-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-linkedlist"&gt;Что такое LinkedList?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#7-linkedlist-%d1%87%d1%82%d0%be-%d0%bf%d1%80%d0%be%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%bf%d0%be%d0%b4-%d0%ba%d0%b0%d0%bf%d0%be%d1%82%d0%be%d0%bc-%d0%bf%d1%80%d0%b8-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8-%d1%8d%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d0%b0-%d0%b2-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be%d1%81%d0%b5%d1%80%d0%b5%d0%b4%d0%b8%d0%bd%d1%83%d0%ba%d0%be%d0%bd%d0%b5%d1%86-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0"&gt;LinkedList. Что происходит под капотом при добавлении/удалении элемента в начало/середину/конец списка?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#8-linkedlist---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;LinkedList - сложность операций&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#9-arraylist-vs-linkedlist"&gt;ArrayList vs LinkedList&lt;/a&gt; [17.56%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#10-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d1%81%d0%ba%d0%be%d1%80%d0%be%d1%81%d1%82%d1%8c-%d0%b2%d1%81%d1%82%d0%b0%d0%b2%d0%ba%d0%b8-%d0%b2-arraylist-%d0%b8-linkedlist"&gt;Какая скорость вставки в ArrayList и LinkedList&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#11-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-treemap"&gt;Что такое TreeMap?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#12-treemap---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;TreeMap - сложность операций&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#13-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b5%d0%b5-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%be-treemap"&gt;Внутреннее устройство TreeMap&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#14-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-hashmap"&gt;Что такое HashMap?&lt;/a&gt; [9.92%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#15-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b5%d0%b5-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%be-hashmap"&gt;Внутреннее устройство HashMap&lt;/a&gt; [17.56%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#16-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b1%d0%b0%d0%ba%d0%b5%d1%82-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b5%d0%b5-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%be-%d0%b1%d0%b0%d0%ba%d0%b5%d1%82%d0%b0"&gt;Что такое бакет? Внутреннее устройство бакета&lt;/a&gt; [6.49%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#17-hashmap---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;HashMap - сложность операций&lt;/a&gt; [11.83%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#18-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d1%8f-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%b0-%d0%b2-hashmap"&gt;Процесс добавления объекта в HashMap&lt;/a&gt; [12.6%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#19-%d0%b1%d1%83%d0%b4%d0%b5%d1%82-%d0%bb%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-hashmap-%d0%b5%d1%81%d0%bb%d0%b8-%d0%b2%d1%81%d0%b5-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc%d1%8b%d0%b5-%d0%ba%d0%bb%d1%8e%d1%87%d0%b8-%d0%b1%d1%83%d0%b4%d1%83%d1%82-%d0%b8%d0%bc%d0%b5%d1%82%d1%8c-%d0%be%d0%b4%d0%b8%d0%bd%d0%b0%d0%ba%d0%be%d0%b2%d1%8b%d0%b9-hashcode"&gt;Будет ли работать HashMap, если все добавляемые ключи будут иметь одинаковый hashCode()?&lt;/a&gt; [14.5%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#20-%d0%ba%d0%bb%d1%8e%d1%87%d0%b8-%d0%b2-hashmap"&gt;Ключи в HashMap&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#21-%d0%bc%d0%be%d0%b3%d1%83-%d0%bf%d0%be%d0%bb%d0%be%d0%b6%d0%b8%d1%82%d1%8c-%d0%b2-hashmap-%d0%b8%d0%bb%d0%b8-treemap-%d1%8d%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82-%d1%81-%d0%ba%d0%bb%d1%8e%d1%87%d0%be%d0%bc-null"&gt;Могу положить в HashMap или TreeMap элемент с ключом null?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#22-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-hashset"&gt;Что такое HashSet?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#23-%d0%ba%d0%b0%d0%ba-hashset-%d1%81%d0%b2%d1%8f%d0%b7%d0%b0%d0%bd-%d1%81-hashmap"&gt;Как HashSet связан с HashMap?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#24-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b5%d0%b5-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%be-hashset"&gt;Внутреннее устройство HashSet&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#25-hashset---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;HashSet - сложность операций&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#26-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d1%8f-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%b0-%d0%b2-hashset"&gt;Процесс добавления объекта в HashSet?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#27-%d0%b1%d1%83%d0%b4%d0%b5%d1%82-%d0%bb%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-hashset-%d0%b5%d1%81%d0%bb%d0%b8-%d0%b2%d1%81%d0%b5-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc%d1%8b%d0%b5-%d1%8d%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-%d0%b1%d1%83%d0%b4%d1%83%d1%82-%d0%b8%d0%bc%d0%b5%d1%82%d1%8c-%d0%be%d0%b4%d0%b8%d0%bd%d0%b0%d0%ba%d0%be%d0%b2%d1%8b%d0%b9-hashcode"&gt;Будет ли работать HashSet, если все добавляемые элементы будут иметь одинаковый hashCode()?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#28-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-treeset-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b5%d0%b5-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b9%d1%81%d1%82%d0%b2%d0%be"&gt;Что такое TreeSet? Внутреннее устройство&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#29-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-queue"&gt;Что такое Queue?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#30-queue---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;Queue - сложность операций&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#31-%d0%bd%d0%b0%d0%b7%d0%be%d0%b2%d0%b8%d1%82%d0%b5-%d0%b3%d0%bb%d0%b0%d0%b2%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-queue"&gt;Назовите главные реализации Queue&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#32-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-deque"&gt;Что такое Deque?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#33-%d0%bd%d0%b0%d0%b7%d0%be%d0%b2%d0%b8%d1%82%d0%b5-%d0%b3%d0%bb%d0%b0%d0%b2%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-deque"&gt;Назовите главные реализации Deque&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#34-deque---%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9"&gt;Deque - сложность операций&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;35. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#35-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d1%8f-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d1%83%d0%b5%d1%82-%d0%b4%d0%b8%d1%81%d1%86%d0%b8%d0%bf%d0%bb%d0%b8%d0%bd%d1%83-%d0%be%d0%b1%d1%81%d0%bb%d1%83%d0%b6%d0%b8%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-lifo-fifo"&gt;Какая коллекция реализует дисциплину обслуживания LIFO? FIFO?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;36. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#36-hashmap-vs-treemap"&gt;HashMap vs TreeMap&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;37. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#37-%d0%ba%d0%b0%d0%ba-%d1%81-%d1%81%d0%be%d0%b1%d0%be%d0%b9-%d1%81%d0%b2%d1%8f%d0%b7%d0%b0%d0%bd%d1%8b-iterable-%d0%b8-foreach"&gt;Как с собой связаны Iterable и foreach?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;38. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#38-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d0%b0-map-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81-map-%d0%b2%d1%8b%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d0%be"&gt;Реализации интерфейса Map. Почему интерфейс Map выделен отдельно?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;39. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#39-%d0%ba%d0%b0%d0%ba%d1%83%d1%8e-%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d1%8e-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%b4%d0%bb%d1%8f-%d1%83%d0%bd%d0%b8%d0%ba%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%be%d1%82%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Какую коллекцию использовать для уникальных отсортированных значений?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;40. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#40-hashtable---%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5"&gt;HashTable - что это такое?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;41. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#41-arraysaslist-and-listof"&gt;Arrays.asList() and List.of()&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;42. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#42-linkedhashmap"&gt;LinkedHashMap&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;43. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/#43-%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%b2-%d0%b4%d0%b5%d1%80%d0%b5%d0%b2%d0%b5"&gt;Структуры данных. Какая сложность в дереве?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/"&gt;Исключения&lt;/a&gt; [30.92%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8e-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Расскажите про иерархию исключений&lt;/a&gt; [13.36%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-error-%d0%b8-exception"&gt;Что такое Error и Exception?&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#3-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%b0%d1%82%d1%8b%d0%b2%d0%b0%d0%b5%d0%bc%d1%8b%d0%b5-%d0%b8-%d0%bd%d0%b5%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%b0%d1%82%d1%8b%d0%b2%d0%b0%d0%b5%d0%bc%d1%8b%d0%b5-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f"&gt;Расскажите про обрабатываемые и необрабатываемые исключения&lt;/a&gt; [13.36%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#4-%d0%be-%d1%87%d0%b5%d0%bc-%d0%b3%d0%be%d0%b2%d0%be%d1%80%d0%b8%d1%82-%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%b2%d0%be%d0%b5-%d1%81%d0%bb%d0%be%d0%b2%d0%be-throws"&gt;О чем говорит ключевое слово throws?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#5-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d1%81%d0%be%d0%b1%d1%81%d1%82%d0%b2%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d1%81%d0%ba%d0%be%d0%b5-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5"&gt;Как создать собственное («пользовательское») исключение?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#6-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%bc%d0%b5%d1%85%d0%b0%d0%bd%d0%b8%d0%b7%d0%bc-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b8-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b2-java-try-catch-finally"&gt;Расскажите про механизм обработки исключений в java (Try-catch-finally)&lt;/a&gt; [7.63%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#7-%d0%b2%d0%be%d0%b7%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%bb%d0%b8-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b1%d0%bb%d0%be%d0%ba%d0%b0-try-finally-%d0%b1%d0%b5%d0%b7-catch"&gt;Возможно ли использование блока try-finally (без catch)?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#8-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%bb%d0%b8-%d0%be%d0%b4%d0%b8%d0%bd-%d0%b1%d0%bb%d0%be%d0%ba-catch-%d0%be%d1%82%d0%bb%d0%b0%d0%b2%d0%bb%d0%b8%d0%b2%d0%b0%d1%82%d1%8c-%d1%81%d1%80%d0%b0%d0%b7%d1%83-%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Может ли один блок catch отлавливать сразу несколько исключений?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#9-%d0%b2%d1%81%d0%b5%d0%b3%d0%b4%d0%b0-%d0%bb%d0%b8-%d0%b2%d1%8b%d0%bf%d0%be%d0%bb%d0%bd%d1%8f%d0%b5%d1%82%d1%81%d1%8f-%d0%b1%d0%bb%d0%be%d0%ba-finally-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%bb%d0%b8-%d1%81%d0%b8%d1%82%d1%83%d0%b0%d1%86%d0%b8%d0%b8-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%b1%d0%bb%d0%be%d0%ba-finally-%d0%bd%d0%b5-%d0%b1%d1%83%d0%b4%d0%b5%d1%82-%d0%b2%d1%8b%d0%bf%d0%be%d0%bb%d0%bd%d0%b5%d0%bd"&gt;Всегда ли выполняется блок finally? Существуют ли ситуации, когда блок finally не будет выполнен?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#10-%d0%b2-%d0%ba%d0%b0%d0%ba%d0%be%d0%bc-%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%ba%d0%b5-%d1%81%d0%bb%d0%b5%d0%b4%d1%83%d0%b5%d1%82-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%b0%d1%82%d1%8b%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b2-catch-%d0%b1%d0%bb%d0%be%d0%ba%d0%b0%d1%85"&gt;В каком порядке следует обрабатывать исключения в catch блоках?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#11-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bc%d0%b5%d1%85%d0%b0%d0%bd%d0%b8%d0%b7%d0%bc-try-with-resources"&gt;Что такое механизм try-with-resources?&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#12-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-outofmemoryerror-%d0%bf%d0%be%d0%b9%d0%bc%d0%b0%d1%82%d1%8c-%d1%83%d1%82%d0%b5%d1%87%d0%ba%d1%83-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8-%d0%b8-%d0%bf%d0%be%d1%84%d0%b8%d0%ba%d1%81%d0%b8%d1%82%d1%8c"&gt;Ошибка OutOfMemoryError. Поймать утечку памяти и пофиксить&lt;/a&gt; [8.4%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#13-sneakythrows-%d0%b2-lombok"&gt;@SneakyThrows в Lombok&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/#14-stackoverflowerror-vs-outofmemoryerror"&gt;StackOverflowError vs OutOfMemoryError&lt;/a&gt; [1.91%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/"&gt;Дженерики&lt;/a&gt; [16.03%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b4%d0%b6%d0%b5%d0%bd%d0%b5%d1%80%d0%b8%d0%ba%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b"&gt;Что такое дженерики? Для чего нужны?&lt;/a&gt; [7.63%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d1%8b%d1%80%d1%8b%d0%b5-%d1%82%d0%b8%d0%bf%d1%8b"&gt;Что такое сырые типы?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#3-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b2%d0%b0%d0%b9%d0%bb%d0%b4%d0%ba%d0%b0%d1%80%d0%b4"&gt;Что такое вайлдкард&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#4-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%bf%d1%80%d0%b8%d0%bd%d1%86%d0%b8%d0%bf-pecs"&gt;Расскажите про принцип PECS&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#5-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-optional"&gt;Расскажите про класс Optional&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/#6-%d0%ba%d0%b0%d0%ba-jvm-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d1%81-generics"&gt;Как JVM работает с Generics&lt;/a&gt; [3.44%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/"&gt;Функциональные интерфейсы&lt;/a&gt; [16.03%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81"&gt;Что такое функциональный интерфейс?&lt;/a&gt; [9.16%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#2-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d0%b0-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d1%8f-functionalinterface"&gt;Для чего нужна аннотация @FunctionalInterface&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#3-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b2%d1%81%d1%82%d1%80%d0%be%d0%b5%d0%bd%d0%bd%d1%8b%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d1%8b-%d0%b2%d1%8b-%d0%b7%d0%bd%d0%b0%d0%b5%d1%82%d0%b5"&gt;Какие встроенные функциональные интерфейсы вы знаете?&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#4-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d1%81%d1%8b%d0%bb%d0%ba%d0%b0-%d0%bd%d0%b0-%d0%bc%d0%b5%d1%82%d0%be%d0%b4"&gt;Что такое ссылка на метод?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#5-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bb%d1%8f%d0%bc%d0%b1%d0%b4%d0%b0-%d0%b2%d1%8b%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%87%d0%b5%d0%bc-%d0%b5%d0%b3%d0%be-%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b7%d0%b0%d0%bc%d0%b5%d0%bd%d0%b8%d1%82%d1%8c"&gt;Что такое лямбда выражение? Чем его можно заменить?&lt;/a&gt; [7.63%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/#6-%d1%87%d1%82%d0%be-%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d1%82-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81-function"&gt;Что делает Интерфейс Function?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/"&gt;Stream API&lt;/a&gt; [27.86%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-stream-api-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-stream"&gt;Что такое Stream API и для чего нужны Stream?&lt;/a&gt; [11.07%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#2-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-stream-%d0%bd%d0%b0%d0%b7%d1%8b%d0%b2%d0%b0%d1%8e%d1%82-%d0%bb%d0%b5%d0%bd%d0%b8%d0%b2%d1%8b%d0%bc"&gt;Почему Stream называют ленивым?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#3-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-stream"&gt;Какие существуют способы создания Stream?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#4-%d1%82%d0%b8%d0%bf%d1%8b-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%be%d0%b2-%d0%b2-stream-api"&gt;Типы методов в Stream API&lt;/a&gt; [10.69%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#5-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bf%d1%80%d0%be%d0%bc%d0%b5%d0%b6%d1%83%d1%82%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%bc%d0%b5%d0%b6%d1%83%d1%82%d0%be%d1%87%d0%bd%d1%8b%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%b2-%d1%81%d1%82%d1%80%d0%b8%d0%bc%d0%b0%d1%85-%d0%b2%d1%8b-%d0%b7%d0%bd%d0%b0%d0%b5%d1%82%d0%b5"&gt;Что такое промежуточные методы? Какие промежуточные методы в стримах вы знаете?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#6-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%82%d0%b5%d1%80%d0%bc%d0%b8%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%b2-%d1%81%d1%82%d1%80%d0%b8%d0%bc%d0%b0%d1%85-%d0%b2%d1%8b-%d0%b7%d0%bd%d0%b0%d0%b5%d1%82%d0%b5"&gt;Что такое терминальные методы? Какие терминальные методы в стримах вы знаете?&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#7-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%b2-stream-api"&gt;Методы в Stream API&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#8-%d1%87%d0%b5%d0%bc-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d1%8e%d1%82%d1%81%d1%8f-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-map-%d0%b8-flatmap"&gt;Чем отличаются методы map() и flatMap()?&lt;/a&gt; [8.78%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#9-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%ba%d0%bb%d0%b0%d1%81%d1%81-collectors-%d0%b8-%d0%b5%d0%b3%d0%be-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b"&gt;Расскажите про класс Collectors и его методы&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#10-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-intstream-%d0%b8-doublestream"&gt;Что такое IntStream и DoubleStream?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#11-%d0%b2-%d1%87%d1%91%d0%bc-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-parallel-%d0%b8-parallelstream"&gt;В чём разница между parallel и parallelStream?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#12-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8-consumer-function-supplier"&gt;Для чего нужны операции Consumer, Function, Supplier?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#13-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bf%d0%b0%d1%80%d0%b0%d0%bb%d0%bb%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%81%d1%82%d1%80%d0%b8%d0%bc%d1%8b"&gt;Что такое параллельные стримы?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/#14-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-findany-%d0%b8-findfirst"&gt;Разница между findAny() и findFirst()&lt;/a&gt; [1.91%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/"&gt;Многопоточность&lt;/a&gt; [48.09%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;Что такое многопоточность?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#2-%d1%87%d0%b5%d0%bc-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%be%d1%82-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%b0"&gt;Чем процесс отличается от потока?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#3-%d1%87%d0%b5%d0%bc-thread-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%be%d1%82-runnable-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-thread-%d0%b0-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-runnable"&gt;Чем Thread отличается от Runnable? Когда использовать Thread, а когда Runnable?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#4-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d0%bd-%d0%b2-java"&gt;Что такое монитор? Как реализован в Java?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#5-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%b2-java"&gt;Что такое синхронизация? Какие способы синхронизации существуют в Java?&lt;/a&gt; [16.03%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#6-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-futuretask"&gt;Что такое FutureTask?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#7-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-completablefuture"&gt;Что такое CompletableFuture?&lt;/a&gt; [5.73%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#8-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-executorservice"&gt;Что такое ExecutorService?&lt;/a&gt; [6.49%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#9-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-%d1%81-%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d1%8f%d0%bc%d0%b8-%d0%b2-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b8"&gt;Как работать с коллекциями в многопоточном программировании?&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#10-synchronizedcollections-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%b7%d0%b0-%d1%81%d1%87%d0%b5%d1%82-%d1%87%d0%b5%d0%b3%d0%be-%d0%b4%d0%be%d1%81%d1%82%d0%b8%d0%b3%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;SynchronizedCollections. Что это? За счет чего достигается потокобезопасность?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#11-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-deadlock"&gt;Что такое Deadlock&lt;/a&gt; [8.78%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#12-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-livelock"&gt;Что такое Livelock&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#13-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-race-condition"&gt;Что такое Race condition&lt;/a&gt; [7.25%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#14-atomic-vs-volatile-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%b8-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c"&gt;Atomic vs Volatile. Что это и когда использовать?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#15-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-atomic"&gt;Зачем нужны atomic&lt;/a&gt; [13.36%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#16-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-volatile"&gt;Зачем нужны volatile&lt;/a&gt; [16.03%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#17-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b1%d1%8b%d0%b2%d0%b0%d1%8e%d1%82-%d1%81%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b8%d1%8f-%d1%83-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%b0"&gt;Какие бывают состояния у потока?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#18-collectionssynchronizedmap-vs-concurrenthashmap"&gt;Collections.synchronizedMap vs ConcurrentHashMap&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#19-%d0%ba%d0%b0%d0%ba%d0%b8%d0%bc%d0%b8-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d0%b0%d0%bc%d0%b8-%d0%bc%d0%be%d0%b6%d0%b5%d0%bc-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d1%82%d0%b8%d1%82%d1%8c-%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%b2-%d0%b2-java-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b8-%d0%ba%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d1%82%d0%b8%d1%82%d1%8c-%d0%bf%d0%be%d1%82%d0%be%d0%ba-%d0%b2-java"&gt;Какими способами можем запустить несколько потоков в Java приложении? Как запустить поток в Java?&lt;/a&gt; [8.02%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#20-%d1%87%d1%82%d0%be-%d0%b7%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d1%8b-runnable-%d0%b8-callable-%d0%b2-%d1%87%d0%b5%d0%bc-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bd%d0%b8%d0%bc%d0%b8-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f"&gt;Что за интерфейсы Runnable и Callable? В чем между ними отличия?&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#21-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d0%bf%d1%80%d0%be-%d0%bf%d0%b0%d0%ba%d0%b5%d1%82-concurrent"&gt;Расскажи про пакет concurrent&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#22-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-%d0%b4%d0%bb%d1%8f-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d0%b3%d0%be-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0"&gt;Способы решения задач для многопоточного доступа&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#23-%d1%87%d0%b5%d0%bc-%d0%ba%d0%be%d0%bd%d0%ba%d1%83%d1%80%d0%b5%d0%bd%d1%82%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%be%d1%82-%d0%bf%d0%b0%d1%80%d0%b0%d0%bb%d0%bb%d0%b5%d0%bb%d0%b8%d0%b7%d0%bc%d0%b0"&gt;Чем конкурентность отличается от параллелизма?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#24-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-cas-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8-compare-and-swap"&gt;Что такое CAS операции? (Compare And Swap)&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#25-%d0%b0%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c-vs-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;Асинхронность vs многопоточность&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#26-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-%d0%bf%d1%83%d0%bb%d1%8b-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%b2"&gt;Зачем нужны пулы потоков?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#27-%d1%87%d1%82%d0%be-%d0%b7%d0%bd%d0%b0%d1%87%d0%b8%d1%82-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;Что значит потокобезопасность?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#28-%d0%be%d0%b1%d0%bb%d0%b0%d1%81%d1%82%d0%b8-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8-%d0%b2-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d0%b8"&gt;Области памяти в многопоточности?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#29-executorsnewcachedthreadpool"&gt;Executors.newCachedThreadPool()&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#30-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-happens-before"&gt;Что такое happens-before?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/#31-forkjoinpool-vs-fixedthreadpool"&gt;ForkJoinPool vs FixedThreadPool&lt;/a&gt; [0.38%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/"&gt;Базы данных&lt;/a&gt; [17.18%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#1-%d0%b2%d0%b8%d0%b4%d1%8b-%d0%b1%d0%b4-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%85-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c"&gt;Виды БД и для чего их лучше использовать?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#2-%d0%bc%d0%b0%d1%81%d1%88%d1%82%d0%b0%d0%b1%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d0%bd%d0%b5%d1%85%d0%b2%d0%b0%d1%82%d0%ba%d1%83-%d0%bc%d0%b5%d1%81%d1%82%d0%b0-%d0%bd%d0%b0-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%b5"&gt;Масштабирование. Как решить нехватку места на сервере?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#3-%d1%80%d0%b5%d0%bf%d0%bb%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5"&gt;Репликация базы данных. Что это такое?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#4-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%88%d0%b0%d1%80%d0%b4%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5"&gt;Что такое шардирование?&lt;/a&gt; [7.63%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#5-nosql-vs-sql"&gt;NoSQL vs SQL&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/database-management-system/#6-%d0%bf%d0%b0%d1%80%d1%82%d0%b8%d1%86%d0%b8%d0%be%d0%bd%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5"&gt;Партиционирование&lt;/a&gt; [5.34%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/"&gt;SQL&lt;/a&gt; [72.52%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%82%d1%80%d0%b0%d0%bd%d0%b7%d0%b0%d0%ba%d1%86%d0%b8%d0%b8"&gt;Что такое транзакции?&lt;/a&gt; [8.4%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#2-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-acid"&gt;Расскажите про ACID&lt;/a&gt; [10.69%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#3-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-%d0%bf%d0%b0%d1%80%d0%b0%d0%bb%d0%bb%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d1%82%d1%80%d0%b0%d0%bd%d0%b7%d0%b0%d0%ba%d1%86%d0%b8%d0%b9"&gt;Проблемы параллельных транзакций&lt;/a&gt; [8.78%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#4-%d1%83%d1%80%d0%be%d0%b2%d0%bd%d0%b8-%d0%b8%d0%b7%d0%be%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d0%be%d1%81%d1%82%d0%b8-read-uncommitted-read-committed-repeatable-read-serializable"&gt;Уровни изолированности (read uncommitted, read committed, repeatable read, serializable)&lt;/a&gt; [23.28%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#5-%d0%b2%d0%b8%d0%b4%d1%8b-join-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%ba%d0%b0%d0%b6%d0%b4%d1%8b%d0%b9-join"&gt;Виды JOIN. Как работает каждый JOIN?&lt;/a&gt; [12.98%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#6-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d1%8b-%d0%b2-sql-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be"&gt;Индексы в SQL. Что это?&lt;/a&gt; [20.99%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#7-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%be%d0%b2-%d1%8d%d1%82%d0%be-%d0%bf%d0%bb%d0%be%d1%85%d0%be"&gt;Почему когда много индексов, это плохо?&lt;/a&gt; [7.63%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#8-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%be%d0%b2"&gt;Плюсы и минусы индексов&lt;/a&gt; [8.78%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#9-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b2%d0%b8%d0%b4%d1%8b-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%be%d0%b2-%d0%b7%d0%bd%d0%b0%d0%b5%d1%88%d1%8c"&gt;Какие виды индексов знаешь?&lt;/a&gt; [14.89%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#10-%d0%ba%d0%b0%d0%ba-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be-%d0%b2%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81"&gt;Как правильно выбрать индекс?&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#11-%d0%bd%d0%be%d1%80%d0%bc%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b8-%d0%b4%d0%b5%d0%bd%d0%be%d1%80%d0%bc%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%b5%d1%80%d0%b5%d1%87%d0%b8%d1%81%d0%bb%d0%b8%d1%82%d0%b5-%d1%84%d0%be%d1%80%d0%bc%d1%8b"&gt;Нормализация и денормализация. Перечислите формы&lt;/a&gt; [8.4%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#12-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b2%d0%bd%d0%b5%d1%88%d0%bd%d0%b8%d0%b9-%d0%ba%d0%bb%d1%8e%d1%87"&gt;Что такое внешний ключ?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#13-%d1%87%d0%b5%d0%bc-where-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%be%d1%82-having-%d0%bc%d0%be%d0%b6%d0%b5%d0%bc-%d0%bb%d0%b8-%d0%bc%d1%8b-%d0%b8%d1%85-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%b2-%d0%be%d0%b4%d0%bd%d0%be%d0%bc-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%b5"&gt;Чем WHERE отличается от HAVING? Можем ли мы их использовать в одном запросе?&lt;/a&gt; [8.02%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#14-%d1%87%d0%b5%d0%bc-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b0%d0%b5%d1%82%d1%81%d1%8f-mysql-%d0%be%d1%82-postgresql"&gt;Чем отличается MySQL от PostgreSQL?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#15-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b"&gt;Оптимизация запросов. Какие существуют инструменты?&lt;/a&gt; [22.52%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#16-explain-vs-explain-analyze"&gt;EXPLAIN vs EXPLAIN ANALYZE&lt;/a&gt; [10.31%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#17-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82-%d0%b4%d0%bb%d1%8f-%d1%81%d0%b1%d0%be%d1%80%d0%b0-%d1%81%d1%82%d0%b0%d1%82%d0%b8%d1%81%d1%82%d0%b8%d0%ba%d0%b8-%d0%b2-postgresql"&gt;Инструмент для сбора статистики в PostgreSQL&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#18-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%b5%d0%bb%d0%b5%d0%ba%d1%82%d0%b8%d0%b2%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;Что такое селективность?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#19-%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%b2%d0%be%d0%b5-%d1%81%d0%bb%d0%be%d0%b2%d0%be-lateral"&gt;Ключевое слово LATERAL&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#20-%d0%be%d0%ba%d0%be%d0%bd%d0%bd%d1%8b%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8-partition-by"&gt;Оконные функции. PARTITION BY&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#21-cube-rollup-groupby"&gt;cube, rollup, groupBy&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#22-%d1%85%d1%80%d0%b0%d0%bd%d0%b8%d0%bc%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d1%86%d0%b5%d0%b4%d1%83%d1%80%d1%8b"&gt;Хранимые процедуры&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#23-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-serializable"&gt;Как работает Serializable?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#24-view-materialized-view-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%be%d0%b1%d1%8b%d1%87%d0%bd%d1%8b%d0%bc-%d0%b8-%d0%bc%d0%b0%d1%82%d0%b5%d1%80%d0%b8%d0%b0%d0%bb%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%bc-%d0%bf%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5%d0%bc"&gt;View, materialized view. Разница между обычным и материализованным представлением?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#25-c-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-sql-%d0%b1%d0%bb%d0%be%d0%ba%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b8---select-for-update"&gt;C помощью SQL блокировка строки? - SELECT FOR UPDATE&lt;/a&gt; [6.11%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#26-union-vs-union-all"&gt;UNION vs UNION ALL&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#27-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8-%d0%bf%d1%80%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%b2%d0%be%d0%b5-%d1%81%d0%bb%d0%be%d0%b2%d0%be-distinct"&gt;Расскажи про ключевое слово DISTINCT?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#28-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%87%d0%bd%d1%8b%d0%b5-%d0%b2%d1%8b%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f"&gt;Что такое табличные выражения?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#29-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d1%82%d1%81%d1%8f-database-connection-pool-hikari-%d0%b8%d1%81%d1%87%d0%b5%d1%80%d0%bf%d0%b0%d0%bd%d0%b8%d0%b5-connection-pool"&gt;Для чего используется Database Connection Pool? (Hikari) Исчерпание connection pool&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#30-%d0%b1%d0%bb%d0%be%d0%ba%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b8-%d0%b8-%d0%bb%d0%be%d0%ba%d0%b8-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d1%81%d1%82%d0%b8%d1%87%d0%bd%d0%b0%d1%8f-%d0%b8-%d0%bf%d0%b5%d1%81%d1%81%d0%b8%d0%bc%d0%b8%d1%81%d1%82%d0%b8%d1%87%d0%bd%d0%b0%d1%8f"&gt;Блокировки и локи. Оптимистичная и Пессимистичная&lt;/a&gt; [17.56%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#31-%d0%b1%d0%b4-constraint-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82"&gt;БД. Constraint. Какие существуют?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#32-primary-key"&gt;Primary Key&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#33-foreign-key"&gt;Foreign Key&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/#34-delete-vs-truncate"&gt;DELETE vs TRUNCATE&lt;/a&gt; [1.15%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/"&gt;NoSQL&lt;/a&gt; [3.82%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/#1-nosql-%d1%82%d0%b8%d0%bf%d1%8b-%d0%b1%d0%b4"&gt;NoSQL типы БД&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/#2-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d1%82%d1%81%d1%8f-redis"&gt;Для чего используется Redis?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/#3-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%ba%d1%8d%d1%88"&gt;Что такое Кэш?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/"&gt;Миграции&lt;/a&gt; [4.58%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/#1-liquibase-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be"&gt;Liquibase. Что это и для чего?&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/#2-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%91%d1%82-liquibase-%d0%b2%d0%be-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%bc%d0%b8%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;Какие записи создаёт liquibase во время миграции?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/#3-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-%d0%bc%d0%b8%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;Зачем нужны инструменты миграции?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/"&gt;ORM&lt;/a&gt; [43.13%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-hibernate-jpa-jdbc-orm"&gt;Что такое Hibernate, JPA, JDBC, ORM?&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#2-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-orm"&gt;Плюсы и минусы ORM&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#3-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-entity-%d0%b8-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5"&gt;Как создать Entity и что это такое?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#4-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%bb%d0%b8-entity-%d0%bd%d0%b0%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d0%be%d1%82-%d0%bd%d0%b5-entity-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2"&gt;Может ли Entity наследоваться от не-Entity классов?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#5-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%bb%d0%b8-entity-%d0%bd%d0%b0%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d0%be%d1%82-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d1%85-entity-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2"&gt;Может ли Entity наследоваться от других Entity классов?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#6-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%bc%d1%8b-%d0%bd%d0%b5-%d0%bc%d0%be%d0%b6%d0%b5%d0%bc-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-final-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d1%8b-%d0%b2-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%b5-entity"&gt;Почему мы не можем использовать final классы в качестве Entity?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#7-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-proxy-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d1%82%d1%81%d1%8f"&gt;Что такое Proxy и для чего используется?&lt;/a&gt; [9.92%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#8-fetchtype"&gt;FetchType&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#9-%d0%b6%d0%b8%d0%b7%d0%bd%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%86%d0%b8%d0%ba%d0%bb-%d1%81%d1%83%d1%89%d0%bd%d0%be%d1%81%d1%82%d0%b8"&gt;Жизненный цикл сущности&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#10-%d0%ba%d1%8d%d1%88%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5"&gt;Кэширование&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#11-hql-%d0%b8-jpql"&gt;HQL и JPQL&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#12-entitymanager--entitymanagerfactory--sessionfactory--session"&gt;EntityManager &amp;#43; EntityManagerFactory / SessionFactory &amp;#43; session&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#13-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-n--1-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b"&gt;Проблема N &amp;#43; 1. Способы решения проблемы&lt;/a&gt; [20.23%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#14-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-entity-graph"&gt;Что такое Entity Graph?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#15-statement-prepared-statement-callable-statement"&gt;Statement, Prepared statement, Callable statement&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#16-%d1%81%d0%b2%d1%8f%d0%b7%d0%b8-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%86%d0%b0%d0%bc%d0%b8-%d0%b2-orm"&gt;Связи между таблицами в ORM&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#17-lazyinitializationexception"&gt;LazyInitializationException&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#18-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-sql-%d0%b8%d0%bd%d1%8a%d0%b5%d0%ba%d1%86%d0%b8%d1%8f"&gt;Что такое SQL-инъекция?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#19-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-join-fetch"&gt;Проблемы JOIN FETCH&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#20-%d0%bb%d0%be%d0%b3%d0%b8-%d0%b2-hibernate"&gt;Логи в Hibernate&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#21-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d1%8f-query-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5"&gt;Аннотация @Query, что это такое?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#22-%d0%ba%d0%b0%d0%ba-hibernate-%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b8%d1%80%d1%83%d0%b5%d1%82-sql-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d1%8b"&gt;Как Hibernate генерирует SQL запросы?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#23-hibernate-%d1%87%d1%82%d0%be-%d1%85%d1%80%d0%b0%d0%bd%d0%b8%d1%82%d1%81%d1%8f-%d0%b2-persistence-context-%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b2%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%b8-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82-%d1%85%d1%80%d0%b0%d0%bd%d0%b8%d1%82%d1%81%d1%8f-%d0%b2-persistence-context"&gt;Hibernate. Что хранится в Persistence Context? Сколько времени объект хранится в Persistence Context?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#24-hibernate-%d0%b8-lombok"&gt;Hibernate и Lombok&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#25-%d0%ba%d0%b0%d0%ba-jpa-%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d1%82-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d1%8b"&gt;Как JPA делает запросы?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/#26-%d1%81%d1%82%d1%80%d0%b0%d1%82%d0%b5%d0%b3%d0%b8%d0%b8-%d0%bd%d0%b0%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%b2-hibernate"&gt;Стратегии наследования в Hibernate&lt;/a&gt; [3.05%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/"&gt;Spring&lt;/a&gt; [80.15%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#1-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bc%d1%8b-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-spring-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%b5%d0%b3%d0%be-%d1%82%d0%b0%d0%ba-%d0%bb%d1%8e%d0%b1%d1%8f%d1%82"&gt;Зачем мы используем Spring? Почему его так любят?&lt;/a&gt; [11.45%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#2-inversion-of-control"&gt;Inversion of Control&lt;/a&gt; [10.69%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#3-dependency-injection"&gt;Dependency Injection&lt;/a&gt; [12.21%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#4-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1%d1%8b-%d0%b2%d0%bd%d0%b5%d0%b4%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b7%d0%b0%d0%b2%d0%b8%d1%81%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b5%d0%b9-%d0%b7%d0%bd%d0%b0%d0%b5%d1%88%d1%8c"&gt;Какие способы внедрения зависимостей знаешь?&lt;/a&gt; [14.5%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#5-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d0%be%d1%80"&gt;Почему лучше использовать конструктор?&lt;/a&gt; [12.21%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#6-autowired"&gt;@Autowired&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#7-qualifier-vs-primary"&gt;@Qualifier vs @Primary&lt;/a&gt; [12.98%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#8-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-bean"&gt;Что такое Bean?&lt;/a&gt; [10.69%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#9-%d1%81%d0%ba%d0%be%d1%83%d0%bf-%d0%b1%d0%b8%d0%bd%d0%be%d0%b2-web-%d1%81%d0%ba%d0%be%d1%83%d0%bf"&gt;Скоуп бинов. Web скоуп&lt;/a&gt; [25.95%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#10-%d0%ba%d0%b0%d0%ba-%d0%be%d0%b1%d0%b5%d1%81%d0%bf%d0%b5%d1%87%d0%b8%d1%82%d1%8c-%d1%87%d1%82%d0%be%d0%b1%d1%8b-%d0%bf%d1%80%d0%b8-%d0%b2%d0%bd%d0%b5%d0%b4%d1%80%d0%b5%d0%bd%d0%b8%d0%b8-%d0%b1%d0%b8%d0%bd%d0%b0-%d1%81%d0%be-%d1%81%d0%ba%d0%be%d1%83%d0%bf%d0%be%d0%bc-prototype-%d0%b2-singleton-%d0%b1%d0%b8%d0%bd-%d0%ba%d0%b0%d0%b6%d0%b4%d1%8b%d0%b9-%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b0%d0%bb-%d0%bd%d0%be%d0%b2%d1%8b%d0%b9-%d1%8d%d0%ba%d0%b7%d0%b5%d0%bc%d0%bf%d0%bb%d1%8f%d1%80"&gt;Как обеспечить, чтобы при внедрении бина со скоупом prototype в singleton-бин каждый вызов получал новый экземпляр?&lt;/a&gt; [5.73%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#11-%d0%b6%d0%b8%d0%b7%d0%bd%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%86%d0%b8%d0%ba%d0%bb-bean-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81%d1%8b-%d1%81%d0%b2%d1%8f%d0%b7%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d1%81-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0%d0%bc%d0%b8-%d0%b2%d1%85%d0%be%d0%b4%d1%8f%d1%89%d0%b8%d0%bc%d0%b8-%d0%b2-%d0%b6%d0%b8%d0%b7%d0%bd%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%86%d0%b8%d0%ba%d0%bb-%d0%b1%d0%b8%d0%bd%d0%b0"&gt;Жизненный цикл Bean. Вопросы связанные с классами, входящими в жизненный цикл бина&lt;/a&gt; [20.23%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#12-componentscan"&gt;@ComponentScan&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#13-conditional-%d0%b2-spring"&gt;@Conditional в Spring&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#14-service-repository-component"&gt;@Service, @Repository, @Component&lt;/a&gt; [14.5%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#15-controller-%d0%b8-restcontroller"&gt;@Controller и @RestController&lt;/a&gt; [8.4%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#16-responsebody-vs-responseentity"&gt;@ResponseBody vs ResponseEntity&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#17-spring-mvc-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-%d1%80%d0%b5%d1%88%d0%b0%d0%b5%d1%82"&gt;Spring MVC. Что это? Какие проблемы решает?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#18-%d0%bf%d0%b0%d1%80%d0%b0%d0%b4%d0%b8%d0%b3%d0%bc%d0%b0-aop"&gt;Парадигма AOP&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#19-%d1%86%d0%b8%d0%ba%d0%bb%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b0%d1%8f-%d0%b7%d0%b0%d0%b2%d0%b8%d1%81%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c"&gt;Циклическая зависимость&lt;/a&gt; [8.02%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#20-spring-boot"&gt;Spring Boot&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#21-spring-boot-vs-spring"&gt;Spring Boot vs Spring&lt;/a&gt; [10.31%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#22-spring-jdbc"&gt;Spring JDBC&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#23-spring-data-jpa"&gt;Spring Data JPA&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#24-%d0%b1%d0%bb%d0%be%d0%ba%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-%d0%bf%d0%be-%d1%83%d0%bc%d0%be%d0%bb%d1%87%d0%b0%d0%bd%d0%b8%d1%8e-%d0%b2-spring"&gt;Блокировка по умолчанию в Spring&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#25-transactional-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82"&gt;@Transactional. Как работает?&lt;/a&gt; [28.24%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#26-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b5%d1%81%d1%82%d1%8c-%d0%b0%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d1%8b-%d1%83-transactional"&gt;Какие есть атрибуты у @Transactional?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#27-%d0%b0%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82-propagation-%d1%83-transactional"&gt;Атрибут propagation у @Transactional&lt;/a&gt; [9.16%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#28-transaction-%d1%87%d1%82%d0%be-%d0%b1%d1%83%d0%b4%d0%b5%d1%82-%d0%b5%d1%81%d0%bb%d0%b8-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-%d0%b2-%d0%be%d0%b4%d0%bd%d0%be%d0%bc-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b5-%d0%bf%d1%80%d0%b8-%d1%80%d0%b0%d0%b7%d0%bb%d0%b8%d1%87%d0%bd%d1%8b%d1%85-%d1%81%d1%86%d0%b5%d0%bd%d0%b0%d1%80%d0%b8%d1%8f%d1%85"&gt;@Transaction Что будет если вызвать метод из метода в одном классе при различных сценариях&lt;/a&gt; [14.5%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#29-%d0%ba%d0%b0%d0%ba-%d0%b3%d0%b0%d1%80%d0%b0%d0%bd%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%ba%d0%be%d1%80%d1%80%d0%b5%d0%ba%d1%82%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8-%d1%81%d0%be%d1%85%d1%80%d0%b0%d0%bd%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b2-%d1%81%d1%83%d1%89%d0%bd%d0%be%d1%81%d1%82%d1%8f%d1%85-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b5%d0%bd%d0%bd%d1%8b%d1%85-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b5-%d1%81-transactional"&gt;Как гарантировать корректное обновление и сохранение изменений в сущностях, полученных в методе с @Transactional&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#30-transactional-%d0%b8-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f"&gt;@Transactional и Исключения&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#31-async"&gt;@Async&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#32-starter-%d0%b2-spring-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b"&gt;Starter в Spring. Плюсы и минусы&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#33-spring-criteria-api"&gt;Spring Criteria API&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#34-scheduled"&gt;@Scheduled&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;35. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#35-%d0%bf%d0%be%d0%bd%d1%8f%d1%82%d0%b8%d0%b5-controller-%d0%b8-servlet-%d0%b2-java-%d1%8d%d1%82%d0%be-%d0%be%d0%b4%d0%bd%d0%be-%d0%b8-%d1%82%d0%be-%d0%b6%d0%b5-%d0%b5%d1%81%d0%bb%d0%b8-%d1%80%d0%b0%d0%b7%d0%bd%d0%be%d0%b5-%d0%b2-%d1%87%d0%b5%d0%bc-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f"&gt;Понятие Controller и Servlet в Java. Это одно и то же? Если разное, в чем отличия?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;36. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#36-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82-filter-%d0%b2-%d0%ba%d0%b0%d0%ba%d0%be%d0%b9-%d0%bc%d0%be%d0%bc%d0%b5%d0%bd%d1%82-%d0%b2%d1%8b%d0%b7%d1%8b%d0%b2%d0%b0%d0%b5%d1%82%d1%81%d1%8f"&gt;Что такое объект Filter? В какой момент вызывается?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;37. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#37-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-applicationcontext-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%bf%d0%be%d0%b4-%d0%ba%d0%b0%d0%bf%d0%be%d1%82%d0%be%d0%bc"&gt;Что такое ApplicationContext? Как работает под капотом&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;38. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#38-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d0%b8-requestparam-%d0%b8-pathvariable"&gt;Зачем нужны аннотации @RequestParam и @PathVariable?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;39. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#39-configurationproperties-configurationproperties-vs-value"&gt;@ConfigurationProperties? ConfigurationProperties vs Value&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;40. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#40-value-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be"&gt;@Value. Что это?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;41. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#41-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-dispatcherservlet"&gt;Как работает DispatcherServlet?&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;42. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#42-%d0%b2%d0%b0%d1%80%d0%b8%d0%b0%d0%bd%d1%82%d1%8b-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b8-exceptions-%d0%b2-spring"&gt;Варианты обработки Exceptions в Spring&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;43. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#43-configuration-%d1%8f%d0%b2%d0%bb%d1%8f%d0%b5%d1%82%d1%81%d1%8f-configuration-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%bd%d0%b5%d0%bd%d1%82%d0%be%d0%bc-%d0%ba%d0%b0%d0%ba%d1%83%d1%8e-%d0%b4%d0%be%d0%bf-%d0%bb%d0%be%d0%b3%d0%b8%d0%ba%d1%83-configuration-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d1%83%d0%b5%d1%82"&gt;@Configuration. Является Configuration компонентом? Какую доп логику Configuration реализует?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;44. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#44-postconstruct"&gt;@PostConstruct&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;45. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#45-dependency-management-%d0%b2-spring-boot"&gt;Dependency management в Spring boot&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;46. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#46-spring-security-%d0%ba%d0%b0%d0%ba-%d1%85%d1%80%d0%b0%d0%bd%d0%b8%d1%82%d1%8c-%d0%bf%d0%b0%d1%80%d0%be%d0%bb%d1%8c-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8f"&gt;Spring Security, как хранить пароль пользователя?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;47. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#47-spring-profiles-%d0%ba%d0%b0%d0%ba-%d1%81-%d0%bd%d0%b8%d0%bc%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c"&gt;Spring Profiles как с ними работать?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;48. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#48-%d0%b2%d0%b8%d0%b4%d1%8b-proxy-%d0%b2-spring"&gt;Виды proxy в Spring&lt;/a&gt; [5.73%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;49. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#49-lookup"&gt;@Lookup&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;50. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#50-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-beanpostprocessor-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%b5%d1%81%d1%82%d1%8c-before-%d0%b8-after-initialization"&gt;Как работает BeanPostProcessor. Почему есть before и after initialization&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;51. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#51-lazy"&gt;@Lazy&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;52. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#52-controlleradvice"&gt;@ControllerAdvice&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;53. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/#53-%d0%ba%d0%b0%d0%ba-%d1%83%d1%81%d1%82%d1%80%d0%be%d0%b5%d0%bd-spring-security"&gt;Как устроен Spring Security&lt;/a&gt; [2.29%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/"&gt;Паттерны проектирования&lt;/a&gt; [20.23%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#1-gof-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b"&gt;GOF паттерны&lt;/a&gt; [11.45%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd"&gt;Что такое паттерн?&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#3-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d0%be%d0%b2"&gt;Плюсы и минусы использования паттернов&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#4-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d1%8b-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d0%be%d0%b2"&gt;Какие существуют группы паттернов?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#5-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%b2-%d0%ba%d0%b0%d0%ba%d1%83%d1%8e-%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d1%83-%d0%b2%d1%85%d0%be%d0%b4%d1%8f%d1%82"&gt;Какие паттерны в какую группу входят?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#6-adapter-vs-decorator"&gt;Adapter vs Decorator&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#7-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-mvc"&gt;Паттерн MVC&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#8-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-command"&gt;Паттерн Command&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#9-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-chain-of-responsibility"&gt;Паттерн Chain of responsibility&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#10-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d1%83%d0%b5%d1%82%d1%81%d1%8f-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80-abstract-factory"&gt;Как реализуется паттер Abstract Factory?&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#11-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8e%d1%82%d1%81%d1%8f-%d0%b2-spring"&gt;Какие паттерны проектирования используются в Spring&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#12-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d0%b0-singleton"&gt;Плюсы и минусы паттерна Singleton?&lt;/a&gt; [5.34%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/#13-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-builder"&gt;Паттерн Builder&lt;/a&gt; [2.29%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/"&gt;WEB&lt;/a&gt; [22.52%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#1-rest"&gt;REST&lt;/a&gt; [7.25%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#2-restful-%d0%b8-restless"&gt;RESTful и RESTless&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#3-rest-vs-soap"&gt;REST vs SOAP&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#4-%d0%b2-%d0%ba%d0%b0%d0%ba%d0%b8%d1%85-%d1%81%d0%b8%d1%82%d1%83%d0%b0%d1%86%d0%b8%d1%8f%d1%85-%d0%b4%d0%be%d0%bf%d1%83%d1%81%d1%82%d0%b8%d0%bc%d0%be-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-restless"&gt;В каких ситуациях допустимо использование RESTless&lt;/a&gt; [0%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#5-rest-vs-rpc-%d0%ba%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b1%d1%80%d0%b0%d1%82%d1%8c-%d1%87%d1%82%d0%be-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4%d0%b8%d1%82"&gt;REST vs RPC. Как выбрать что лучше подходит?&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#6-%d0%bd%d0%b0%d0%b7%d0%be%d0%b2%d0%b8%d1%82%d0%b5-6-%d0%bf%d1%80%d0%b8%d0%bd%d1%86%d0%b8%d0%bf%d0%be%d0%b2-rest-api"&gt;Назовите 6 принципов REST API&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#7-%d0%b8%d0%b4%d0%b5%d0%bc%d0%bf%d0%be%d1%82%d0%b5%d0%bd%d1%82%d0%bd%d1%8b%d0%b9-%d0%bc%d0%b5%d1%82%d0%be%d0%b4"&gt;Идемпотентный метод&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#8-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d1%8b%d0%b5-http-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b"&gt;Основные HTTP методы&lt;/a&gt; [7.25%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#9-%d1%81%d1%82%d0%b0%d1%82%d1%83%d1%81%d1%8b-%d0%be%d1%82%d0%b2%d0%b5%d1%82%d0%be%d0%b2"&gt;Статусы ответов&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#10-get-vs-post"&gt;GET vs POST&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#11-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-http-%d0%b8-https"&gt;Разница HTTP и HTTPs&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#12-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81"&gt;Из чего состоит HTTP запрос&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#13-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%b4%d0%bb%d1%8f-http-%d0%bf%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d0%b0"&gt;Какие методы авторизации существуют для HTTP протокола?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#14-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-json-web-token"&gt;Из чего состоит JSON Web Token?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#15-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d1%8b-%d1%83%d1%80%d0%be%d0%b2%d0%bd%d1%8f-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Какие протоколы уровня приложений?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#16-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-http"&gt;Что такое HTTP?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#17-%d0%b7%d0%b0-%d1%87%d1%82%d0%be-%d0%be%d1%82%d0%b2%d0%b5%d1%87%d0%b0%d1%8e%d1%82-cookie%d0%ba%d1%83%d0%ba%d0%b8"&gt;За что отвечают Cookie/куки?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/#18-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f-post-put-patch"&gt;Отличия POST, PUT, PATCH&lt;/a&gt; [3.44%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/"&gt;Микросервисы&lt;/a&gt; [22.52%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#1-%d0%bc%d0%be%d0%bd%d0%be%d0%bb%d0%b8%d1%82-vs-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81"&gt;Монолит vs Микросервис&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#2-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%be%d0%b2"&gt;Плюсы и минусы микросервисов&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#3-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-saga-%d0%b2-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%bd%d0%be%d0%b9-%d0%b0%d1%80%d1%85%d0%b8%d1%82%d0%b5%d0%ba%d1%82%d1%83%d1%80%d0%b5"&gt;Паттерн Saga в микросервисной архитектуре&lt;/a&gt; [6.11%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#4-cap-%d1%82%d0%b5%d0%be%d1%80%d0%b5%d0%bc%d0%b0"&gt;CAP теорема&lt;/a&gt; [1.91%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-circuit-breaker"&gt;Паттерн Circuit Breaker&lt;/a&gt; [3.82%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#6-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd-api-gateway"&gt;Паттерн API Gateway&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#7-http-vs-kafka-%d0%ba%d0%b0%d0%ba%d0%be%d0%b9-%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1-%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%b0%d0%bc%d0%b8-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d0%b8-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83"&gt;HTTP vs Kafka. Какой способ общения между микросервисами лучше и почему?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#8-%d1%88%d0%b0%d0%b1%d0%bb%d0%be%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%b4%d0%bb%d1%8f-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b"&gt;Шаблоны проектирования для микросервисов (паттерны)&lt;/a&gt; [6.11%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/microservices/#9-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-transactional-outbox"&gt;Что такое Transactional Outbox&lt;/a&gt; [4.58%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/"&gt;Брокеры сообщений&lt;/a&gt; [44.27%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#1-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%b1%d1%80%d0%be%d0%ba%d0%b5%d1%80%d0%be%d0%b2-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Плюсы и минусы брокеров сообщений&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#2-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-kafka-%d0%b8-rabbitmq"&gt;Разница между Kafka и RabbitMQ&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#3-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%82%d0%be%d0%bf%d0%b8%d0%ba-%d0%b2-kafka"&gt;Что такое топик в Kafka?&lt;/a&gt; [6.87%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#4-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-producer-%d0%b8-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-consumer"&gt;Что такое Producer и что такое Consumer?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#5-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-partition-%d0%b2-kafka"&gt;Что такое partition в Kafka?&lt;/a&gt; [9.92%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#6-%d1%80%d0%b0%d1%81%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9-%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d1%80%d0%b0%d1%81%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d1%8f%d1%8e%d1%82%d1%81%d1%8f-%d0%bf%d0%be-%d0%bf%d0%b0%d1%80%d1%82%d0%b8%d1%86%d0%b8%d1%8f%d0%bc"&gt;Распределение сообщений. Как сообщения распределяются по партициям?&lt;/a&gt; [11.45%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#7-%d0%b3%d0%b0%d1%80%d0%b0%d0%bd%d1%82%d0%b8%d0%b8-%d0%b4%d0%be%d1%81%d1%82%d0%b0%d0%b2%d0%ba%d0%b8-%d0%b2-kafka"&gt;Гарантии доставки в Kafka&lt;/a&gt; [11.83%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#8-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%83%d1%89%d0%b5%d1%81%d1%82%d0%b2%d1%83%d1%8e%d1%82-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d1%8f%d0%bc%d0%b8"&gt;Какие существуют паттерны работы с очередями?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#9-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d1%8b%d0%b5-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%bd%d0%b5%d0%bd%d1%82%d1%8b-kafka"&gt;Основные компоненты Kafka?&lt;/a&gt; [12.21%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#10-kafka-consumer-group"&gt;Kafka. Consumer Group&lt;/a&gt; [9.54%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#11-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-kafka-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80"&gt;Из чего состоит Kafka кластер?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#12-%d0%b1%d1%80%d0%be%d0%ba%d0%b5%d1%80%d1%8b-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9-vs-rest"&gt;Брокеры сообщений vs Rest&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#13-pull-%d0%b8-push-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8-%d0%b2-%d1%87%d1%91%d0%bc-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0"&gt;Pull и push модели, в чём разница?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#14-%d0%ba%d0%b0%d0%ba-%d0%b3%d0%b0%d1%80%d0%b0%d0%bd%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%b2-kafka-%d0%b8%d0%b4%d0%b5%d0%bc%d0%bf%d0%be%d1%82%d0%b5%d0%bd%d1%82%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d1%87%d1%82%d0%be%d0%b1%d1%8b-%d0%bd%d0%b5-%d0%b1%d1%8b%d0%bb%d0%be-%d0%b7%d0%b0%d0%b4%d0%b2%d0%be%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b8-%d0%bf%d0%be%d1%82%d0%b5%d1%80%d1%8c-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Как гарантировать в Kafka идемпотентность, чтобы не было задвоений и потерь сообщений?&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#15-%d0%ba%d0%b0%d0%ba-%d0%b2-kafka-%d0%b3%d0%b0%d1%80%d0%b0%d0%bd%d1%82%d0%b8%d1%80%d1%83%d0%b5%d1%82%d1%81%d1%8f-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9"&gt;Как в Kafka гарантируется последовательность сообщений?&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#16-%d1%87%d1%82%d0%be-%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d1%82%d1%8c-%d1%87%d1%82%d0%be%d0%b1%d1%8b-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%bf%d0%b0%d0%b4%d0%b0%d0%bb%d0%b8-%d0%b2-%d0%be%d0%b4%d0%bd%d1%83-%d0%bf%d0%b0%d1%80%d1%82%d0%b8%d1%86%d0%b8%d1%8e"&gt;Что сделать, чтобы сообщения попадали в одну партицию?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#17-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-round-robin"&gt;Как работает Round Robin?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#18-acknowledgment-%d0%b2-kafka"&gt;Acknowledgment в Kafka&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#19-%d1%81%d0%bc%d0%b5%d1%89%d0%b5%d0%bd%d0%b8%d0%b5-offset-%d0%b2-kafka"&gt;Смещение (offset) в Kafka&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#20-%d0%bf%d0%be%d0%b2%d1%82%d0%be%d1%80%d0%bd%d0%be%d0%b5-%d1%87%d1%82%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%b8%d0%b7-kafka"&gt;Повторное чтение данных из Kafka&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/#21-dlq-topic"&gt;DLQ topic?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/"&gt;Тестирование&lt;/a&gt; [11.07%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#1-%d0%bd%d0%b0-%d1%87%d0%b5%d0%bc-%d0%bf%d0%b8%d1%88%d1%83%d1%82%d1%81%d1%8f-%d1%82%d0%b5%d1%81%d1%82%d1%8b"&gt;На чем пишутся тесты?&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#2-mock-vs-spy"&gt;Mock vs spy&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#3-%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d1%82%d0%b5%d1%81%d1%82%d1%8b"&gt;Параметризованные тесты&lt;/a&gt; [1.15%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#4-unit-%d1%82%d0%b5%d1%81%d1%82%d1%8b-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%b8-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc"&gt;Unit тесты. Что это и зачем?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#5-unit-%d1%82%d0%b5%d1%81%d1%82%d1%8b-vs-%d0%b8%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d1%8b%d0%b5-%d1%82%d0%b5%d1%81%d1%82%d1%8b"&gt;Unit тесты vs интеграционные тесты&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#6-mock-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82"&gt;Mock. Как работает?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#7-spy-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82"&gt;Spy. Как работает?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#8-%d0%ba%d0%b0%d0%ba%d0%b8%d0%bc-%d0%be%d0%b1%d1%80%d0%b0%d0%b7%d0%be%d0%bc-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d1%8f%d1%8e%d1%82%d1%81%d1%8f-%d1%80%d0%b5%d0%b7%d1%83%d0%bb%d1%8c%d1%82%d0%b0%d1%82%d1%8b-%d1%82%d0%b5%d1%81%d1%82%d0%be%d0%b2"&gt;Каким образом проверяются результаты тестов?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/testing/#9-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d1%8b%d0%b5-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%b2-%d1%82%d0%b5%d1%81%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b8"&gt;Основные аннотации в тестировании&lt;/a&gt; [0.76%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/"&gt;Деплой&lt;/a&gt; [10.31%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#1-cicd"&gt;CI/CD&lt;/a&gt; [2.67%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#2-%d0%ba%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-docker-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%b4%d0%be%d0%ba%d0%b5%d1%80-%d0%be%d0%b1%d1%80%d0%b0%d0%b7"&gt;Как работает Docker. Из чего состоит докер образ?&lt;/a&gt; [3.44%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#3-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%bb%d0%be%d0%b9-%d0%ba%d0%b0%d0%ba-%d0%bc%d1%8b-%d0%bc%d0%be%d0%b6%d0%b5%d0%bc-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d0%bd%d0%be%d0%b2%d1%8b%d0%b9-%d1%81%d0%bb%d0%be%d0%b9"&gt;Что такое слой? Как мы можем создать новый слой?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#4-docker-compose"&gt;Docker compose&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#5-arg-env-%d0%b2-%d1%87%d0%b5%d0%bc-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f"&gt;ARG, ENV. В чем отличия?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#6-docker-cmd-vs-entrypoint"&gt;Docker cmd vs entrypoint&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#7-%d0%be%d1%82%d0%bb%d0%b8%d1%87%d0%b8%d1%8f-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%b9%d0%bd%d0%b5%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d0%be%d1%82-%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8"&gt;Отличия контейнеризации от виртулизации&lt;/a&gt; [4.96%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0/deployment/#8-%d0%bf%d0%be%d0%b4%d0%b4%d0%b5%d1%80%d0%b6%d0%ba%d0%b0-%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%b0-%d0%b2-%d0%bf%d1%80%d0%be%d0%b4%d0%b0%d0%ba%d1%88%d0%b5%d0%bd%d0%b5-%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%b5%d0%b3%d0%be-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d0%be%d0%b1%d1%89%d0%b8%d0%b5-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4%d1%8b"&gt;Поддержка сервиса в продакшене, мониторинг его работы. Общие подходы?&lt;/a&gt; [0.38%]&lt;/h4&gt;

 


 
 
 

 

 

 
 
 

 &lt;h2&gt;&lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/"&gt;Другое&lt;/a&gt; [20.23%]&lt;/h2&gt;

 

 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#1-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d1%82%d0%bb%d0%b0%d0%b4%d0%ba%d0%b8-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d1%82%d0%b5%d1%87%d0%b5%d1%82-%d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d1%8c-%d0%b2%d1%81%d0%b5-%d0%b7%d0%b0%d0%bc%d0%b8%d1%80%d0%b0%d0%b5%d1%82---visual-vm-jmap-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d1%89%d0%b8%d0%ba%d0%b8"&gt;Инструменты для отладки приложения, течет память, все замирает - Visual VM, JMap, профилировщики&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#2-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b0"&gt;Определение сложности алгоритма&lt;/a&gt; [3.05%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#3-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d0%be-o-%d0%b1%d0%be%d0%bb%d1%8c%d1%88%d0%be%d0%b5-%d0%b2-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b0%d1%85-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%81%d0%bb%d0%be%d0%b6%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%b2-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b5"&gt;Для чего нужно O большое в алгоритмах? (Что такое сложность в алгоритме)&lt;/a&gt; [4.58%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#4-%d0%ba%d0%b0%d0%ba%d0%be%d0%b9-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4-%d0%ba-%d0%bd%d0%b5%d0%b9%d0%bc%d0%b8%d0%bd%d0%b3%d1%83-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%be%d0%b2-%d0%bf%d0%be%d0%b7%d0%b2%d0%be%d0%bb%d1%8f%d0%b5%d1%82-%d1%8f%d1%81%d0%bd%d0%be-%d0%b8-%d0%be%d0%b4%d0%bd%d0%be%d0%b7%d0%bd%d0%b0%d1%87%d0%bd%d0%be-%d0%be%d1%82%d1%80%d0%b0%d0%b6%d0%b0%d1%82%d1%8c-%d0%b8%d1%85-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%bd%d0%b0%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%b4%d0%bb%d1%8f-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%be%d0%b2-%d0%ba%d0%be%d1%82%d0%be%d1%80%d1%8b%d0%b5-%d0%b2%d1%8b%d0%bf%d0%be%d0%bb%d0%bd%d1%8f%d1%8e%d1%82-%d0%bf%d0%be%d0%b8%d1%81%d0%ba-%d1%81-%d1%81%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%be%d0%b9-%d0%be%d1%87%d0%b8%d1%81%d1%82%d0%ba%d1%83-%d0%ba%d1%8d%d1%88%d0%b0-%d0%b8%d0%bb%d0%b8-%d1%80%d0%b0%d1%81%d1%87%d1%91%d1%82-%d1%81-%d1%81%d0%be%d1%85%d1%80%d0%b0%d0%bd%d0%b5%d0%bd%d0%b8%d0%b5%d0%bc-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%b8-%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%82%d0%be%d0%bc-%d1%81%d1%82%d0%b0%d1%82%d1%83%d1%81%d0%b0"&gt;Какой подход к неймингу методов позволяет ясно и однозначно отражать их функциональность, например, для методов, которые выполняют поиск с сортировкой, очистку кэша или расчёт с сохранением данных и возвратом статуса?&lt;/a&gt; [0.76%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#5-%d0%ba%d0%b0%d0%ba-%d0%b2%d1%8b%d1%8f%d0%b2%d0%bb%d1%8f%d1%82%d1%8c-%d0%b8-%d1%83%d1%81%d1%82%d1%80%d0%b0%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b7%d0%ba%d0%b8%d0%b5-%d0%bc%d0%b5%d1%81%d1%82%d0%b0-%d0%bf%d1%80%d0%be%d0%b8%d0%b7%d0%b2%d0%be%d0%b4%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b2-rest-%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%b0%d1%85-%d0%b8-%d0%bc%d0%b8%d0%ba%d1%80%d0%be%d1%81%d0%b5%d1%80%d0%b2%d0%b8%d1%81%d0%bd%d1%8b%d1%85-%d0%b0%d1%80%d1%85%d0%b8%d1%82%d0%b5%d0%ba%d1%82%d1%83%d1%80%d0%b0%d1%85-%d0%ba%d0%be%d0%b3%d0%b4%d0%b0-%d1%80%d0%be%d1%81%d1%82-%d0%bd%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%ba%d0%b8-%d0%bd%d0%b0%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d1%83%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%82%d1%80%d0%b0%d1%84%d0%b8%d0%ba%d0%b0-%d0%b8%d0%bb%d0%b8-%d0%be%d0%b1%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%b8%d0%b9-%d0%ba-%d0%b1%d0%b4-%d0%bf%d1%80%d0%b8%d0%b2%d0%be%d0%b4%d0%b8%d1%82-%d0%ba-%d0%b7%d0%bd%d0%b0%d1%87%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be-%d0%b1%d0%be%d0%bb%d0%b5%d0%b5-%d0%b4%d0%be%d0%bb%d0%b3%d0%be%d0%b9-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2-%d1%87%d0%b5%d0%bc-%d0%be%d0%b6%d0%b8%d0%b4%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%b8-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d1%81%d1%82%d1%80%d0%b0%d1%82%d0%b5%d0%b3%d0%b8%d0%b8-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d0%b2-%d1%82%d0%be%d0%bc-%d1%87%d0%b8%d1%81%d0%bb%d0%b5-%d0%b0%d1%80%d1%85%d0%b8%d1%82%d0%b5%d0%ba%d1%82%d1%83%d1%80%d0%bd%d1%8b%d0%b5-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d0%bc%d0%b0%d1%81%d1%88%d1%82%d0%b0%d0%b1%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bc%d0%be%d0%b3%d1%83%d1%82-%d0%bf%d0%be%d0%bc%d0%be%d1%87%d1%8c-%d0%b4%d0%be%d1%81%d1%82%d0%b8%d1%87%d1%8c-%d1%82%d1%80%d0%b5%d0%b1%d1%83%d0%b5%d0%bc%d1%8b%d1%85-%d0%b2%d1%80%d0%b5%d0%bc%d0%b5%d0%bd%d0%bd%d1%8b%d1%85-%d1%80%d0%b0%d0%bc%d0%be%d0%ba-%d0%be%d1%82%d0%ba%d0%bb%d0%b8%d0%ba%d0%b0"&gt;Как выявлять и устранять узкие места производительности в REST-сервисах и микросервисных архитектурах, когда рост нагрузки (например, увеличение трафика или обращений к БД) приводит к значительно более долгой обработке запросов, чем ожидается, и какие стратегии оптимизации (в том числе архитектурные изменения и масштабирование) могут помочь достичь требуемых временных рамок отклика?&lt;/a&gt; [1.53%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#6-%d0%be%d0%b1%d1%8b%d1%87%d0%bd%d0%be%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-vs-%d1%80%d0%b5%d0%b0%d0%ba%d1%82%d0%b8%d0%b2%d1%89%d0%b8%d0%bd%d0%b0"&gt;Обычное программирование vs реактивщина&lt;/a&gt; [2.29%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#7-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%b5%d0%bd-reflection"&gt;Для чего нужен Reflection?&lt;/a&gt; [4.2%]&lt;/h4&gt;

 

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%BE%D1%87%D0%B5%D0%B5/other/#8-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b8%d0%b4%d0%b5%d0%bc%d0%bf%d0%be%d1%82%d0%b5%d0%bd%d1%82%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;Что такое идемпотентность?&lt;/a&gt; [3.82%]&lt;/h4&gt;</description></item><item><title>SQL</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/sql/</guid><description>&lt;h2 id="sql"&gt;
 SQL
 &lt;a class="anchor" href="#sql"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-транзакции"&gt;1. Что такое транзакции? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%82%d1%80%d0%b0%d0%bd%d0%b7%d0%b0%d0%ba%d1%86%d0%b8%d0%b8" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Это набор логически связанных запросов. Транзакция либо выполнится полностью(&lt;strong&gt;commit&lt;/strong&gt;), либо откатится(&lt;strong&gt;rollback&lt;/strong&gt;)&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-расскажите-про-acid"&gt;2. Расскажите про ACID &lt;a href="#2-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-acid" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Это набор свойств, гарантирующих надежность транзакции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt; - Атомарность. Все операции внутри транзакции либо выполняются полностью, либо не выполняются вообще&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt; - Согласованность. После выполнения транзакции данные должны соблюдать все правила целостности (правила целостности определяются бизнес-логикой)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt; - Изолированность. Во время выполнения транзакции параллельные транзакции не должны оказывать влияние на ее результат&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; - Долговечность. Независимо от проблем (потеря питания, сбой и т.д), изменения, сделанные успешно завершенной транзакцией, должны остаться сохранёнными в базе данных&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description></item><item><title>Брокеры сообщений</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/message-broker/</guid><description>&lt;h2 id="брокеры-сообщений"&gt;
 Брокеры сообщений
 &lt;a class="anchor" href="#%d0%b1%d1%80%d0%be%d0%ba%d0%b5%d1%80%d1%8b-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-плюсы-и-минусы-брокеров-сообщений"&gt;1. Плюсы и минусы брокеров сообщений &lt;a href="#1-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%b1%d1%80%d0%be%d0%ba%d0%b5%d1%80%d0%be%d0%b2-%d1%81%d0%be%d0%be%d0%b1%d1%89%d0%b5%d0%bd%d0%b8%d0%b9" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Асинхронность&lt;/em&gt;: Службы могут работать независимо друг от друга.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Масштабируемость&lt;/em&gt;: Легко увеличивать количество потребителей.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Надежность&lt;/em&gt;: Сообщения не теряются благодаря механизмам повторных попыток и подтверждений.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Разделение нагрузки&lt;/em&gt;: Потребители могут обрабатывать сообщения параллельно.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Сложность настройки&lt;/em&gt;: Требует правильной конфигурации для эффективной работы.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Задержка&lt;/em&gt;: Добавление брокера увеличивает задержку доставки сообщений.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Поддержка инфраструктуры&lt;/em&gt;: Нужны усилия для мониторинга и администрирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-разница-между-kafka-и-rabbitmq"&gt;2. Разница между Kafka и RabbitMQ &lt;a href="#2-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-kafka-%d0%b8-rabbitmq" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Модели сообщений&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Вопросы про опыт работы</title><link>https://krios2146.github.io/java-backend-interview-prep/work-experience/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/work-experience/</guid><description>&lt;h1 id="вопросы-про-опыт-работы"&gt;
 Вопросы про опыт работы
 &lt;a class="anchor" href="#%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81%d1%8b-%d0%bf%d1%80%d0%be-%d0%be%d0%bf%d1%8b%d1%82-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;



 
 &lt;h2&gt;Общие вопросы [85.88%]&lt;/h2&gt;
 
 &lt;h4&gt;1. Расскажите о проекте/о себе/почему решили сменить работу [79.77%]&lt;/h4&gt;
 
 &lt;h4&gt;2. Размер команды? Из кого состояла. Как работали с бизнес требованиями. Как была организована работа в команде? [26.72%]&lt;/h4&gt;
 
 &lt;h4&gt;3. Системы трекинга [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;4. Как писали документацию? Где хранили? Confluence? [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;5. Методология разработки приложений [5.73%]&lt;/h4&gt;
 
 &lt;h4&gt;6. Какие правила использовались при апруве ревью? [8.02%]&lt;/h4&gt;
 
 &lt;h4&gt;7. Занимались рефакторингом? Работали с чужим кодом? [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;8. Как оценивали задачи? [5.73%]&lt;/h4&gt;
 
 &lt;h4&gt;9. Расскажи про GitFlow [5.34%]&lt;/h4&gt;
 
 &lt;h4&gt;10. Расскажите о флоу разработки? [8.4%]&lt;/h4&gt;
 
 &lt;h4&gt;11. Расскажи про самую интересную/трудную задачу [18.7%]&lt;/h4&gt;
 
 &lt;h4&gt;12. Какой RPS? Какой объем данных? [3.05%]&lt;/h4&gt;
 
 &lt;hr&gt;
 
 &lt;h2&gt;Опыт с технологиями [78.24%]&lt;/h2&gt;
 
 &lt;h4&gt;1. Опыт с Kafka [28.24%]&lt;/h4&gt;
 
 &lt;h4&gt;2. Опыт Многопоточки [25.95%]&lt;/h4&gt;
 
 &lt;h4&gt;3. Опыт с Kubernetes [12.98%]&lt;/h4&gt;
 
 &lt;h4&gt;4. Опыт написания нативных SQL запросов [12.6%]&lt;/h4&gt;
 
 &lt;h4&gt;5. Опыт с Docker [11.83%]&lt;/h4&gt;
 
 &lt;h4&gt;6. Опыт со Spring Security [9.92%]&lt;/h4&gt;
 
 &lt;h4&gt;7. Опыт с Hibernate [9.16%]&lt;/h4&gt;
 
 &lt;h4&gt;8. Опыт со Stream API [8.4%]&lt;/h4&gt;
 
 &lt;h4&gt;9. Опыт с реактивным программированием? [7.63%]&lt;/h4&gt;
 
 &lt;h4&gt;10. Опыт тестирования [7.63%]&lt;/h4&gt;
 
 &lt;h4&gt;11. Опыт оптимизации запросов [6.49%]&lt;/h4&gt;
 
 &lt;h4&gt;12. Опыт с Redis [5.73%]&lt;/h4&gt;
 
 &lt;h4&gt;13. Опыт написания Spring Starter [5.73%]&lt;/h4&gt;
 
 &lt;h4&gt;14. Опыт с PostgreSQL [5.34%]&lt;/h4&gt;
 
 &lt;h4&gt;15. Опыт CI/CD [4.96%]&lt;/h4&gt;
 
 &lt;h4&gt;16. Опыт с БД миграциями [4.96%]&lt;/h4&gt;
 
 &lt;h4&gt;17. Опыт со Spring [4.96%]&lt;/h4&gt;
 
 &lt;h4&gt;18. Опыт со Spring AOP [4.58%]&lt;/h4&gt;
 
 &lt;h4&gt;19. Опыт с gRPC [4.58%]&lt;/h4&gt;
 
 &lt;h4&gt;20. Опыт с Kotlin [4.2%]&lt;/h4&gt;
 
 &lt;h4&gt;21. Опыт с базами данных, каких размеров они были? [3.82%]&lt;/h4&gt;
 
 &lt;h4&gt;22. Опыт с Linux [3.82%]&lt;/h4&gt;
 
 &lt;h4&gt;23. Опыт со Spring Boot [3.82%]&lt;/h4&gt;
 
 &lt;h4&gt;24. Опыт с брокерами сообщений [3.44%]&lt;/h4&gt;
 
 &lt;h4&gt;25. Опыт со Swagger [3.44%]&lt;/h4&gt;
 
 &lt;h4&gt;26. Опыт с NoSQL [3.44%]&lt;/h4&gt;
 
 &lt;h4&gt;27. Опыт профилирования приложений [3.44%]&lt;/h4&gt;
 
 &lt;h4&gt;28. Опыт с RabbitMQ [3.05%]&lt;/h4&gt;
 
 &lt;h4&gt;29. Опыт со Spring Data [3.05%]&lt;/h4&gt;
 
 &lt;h4&gt;30. Опыт написания микросервисов [3.05%]&lt;/h4&gt;
 
 &lt;h4&gt;31. Опыт с Grafana [2.67%]&lt;/h4&gt;
 
 &lt;h4&gt;32. Опыт с WebFlux [2.67%]&lt;/h4&gt;
 
 &lt;h4&gt;33. Опыт проектирования модели данных [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;34. Опыт с Camunda [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;35. Опыт с Liquibase [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;36. Опыт с Maven [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;37. Опыт с Keycloak [2.29%]&lt;/h4&gt;
 
 &lt;h4&gt;38. Опыт нагрузочного тестирования [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;39. Опыт с GraphQL [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;40. Опыт с REST API [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;41. Опыт с инструментами считающими покрытие проекта тестами [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;42. Опыт со Spring Cloud [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;43. Опыт построения архитектуры? [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;44. Опыт с SOAP [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;45. Опыт с Gradle [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;46. Опыт с ClickHouse [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;47. Опыт с Mockito [1.91%]&lt;/h4&gt;
 
 &lt;h4&gt;48. Опыт Lombok [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;49. Опыт с Minio [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;50. Опыт с Reflection API? [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;51. Опыт с SonarQube [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;52. Опыт с Amazon S3 [1.53%]&lt;/h4&gt;
 
 &lt;h4&gt;53. Опыт Jenkins [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;54. Опыт TDD [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;55. Опыт мониторинга [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;56. Опыт с Cassandra [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;57. Опыт с JDBC [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;58. Опыт с JWT токенами [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;59. Опыт с XML конфигурацией в Spring [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;60. Опыт с Elasticsearch [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;61. Опыт с OpenAPI? [1.15%]&lt;/h4&gt;
 
 &lt;h4&gt;62. Опыт DevOps [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;63. Опыт MongoDB [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;64. Опыт командной строки/терминала? [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;65. Опыт криптографии [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;66. Опыт с jOOQ [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;67. Опыт с Nginx [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;68. Опыт с OAuth 2.0 [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;69. Опыт с OpenShift? [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;70. Опыт с PL SQL [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;71. Опыт с VisualVM [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;72. Опыт с WebSocket? [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;73. Опыт с Quarkus [0.76%]&lt;/h4&gt;
 
 &lt;h4&gt;74. Опыт Apache Ignite [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;75. Опыт Debezium [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;76. Опыт Hadoop [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;77. Опыт Postman [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;78. Опыт TimescaleDB [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;79. Опыт работы с логами production систем [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;80. Опыт с Azure [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;81. Опыт с CQRS? [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;82. Опыт с Flight Recorder [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;83. Опыт с Future, CompletableFuture? [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;84. Опыт с HighLoad [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;85. Опыт с JMX [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;86. Опыт с MVC [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;87. Опыт с Netty [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;88. Опыт с Transactional Box [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;89. Опыт с авторизацией [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;90. Опыт с легаси кодом [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;91. Опыт с ООП [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;92. Опыт с сертификатами безопасности [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;93. Опыт с системами сборки [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;94. Опыт с функциональным программированием [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;95. Опыт статического анализатора кода [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;96. Опыт тестирования кода на уязвимости и поиск уязвимости [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;97. Опыт Prometheus [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;98. Опыт Spring Batch [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;99. Опыт Materialized view [0.38%]&lt;/h4&gt;
 
 &lt;h4&gt;100. Опыт WireMock [0.38%]&lt;/h4&gt;
 
 &lt;hr&gt;</description></item><item><title>Коллекции</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/collections/</guid><description>&lt;h2 id="коллекции"&gt;
 Коллекции
 &lt;a class="anchor" href="#%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Обязательно к прочтению&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArrayList - 
 &lt;a href="https://habr.com/ru/articles/128269/"&gt;https://habr.com/ru/articles/128269/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LinkedList - 
 &lt;a href="https://habr.com/ru/articles/127864/"&gt;https://habr.com/ru/articles/127864/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HashMap - 
 &lt;a href="https://habr.com/ru/articles/128017/"&gt;https://habr.com/ru/articles/128017/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;







 
 

 &lt;h4 id="1-расскажите-как-выглядит-иерархия-коллекций"&gt;1. Расскажите как выглядит иерархия коллекций &lt;a href="#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%ba%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b3%d0%bb%d1%8f%d0%b4%d0%b8%d1%82-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8f-%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d0%b9" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;figure&gt;&lt;img src="https://krios2146.github.io/java-backend-interview-prep/collections_hierarchy.png"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Collections hierarchy&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Collection&lt;/strong&gt; и &lt;strong&gt;Map&lt;/strong&gt; - два интерфейса, которые находятся на вершине иерархии JCF. Интерфейс Collection расширяют интерфейсы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List&lt;/li&gt;
&lt;li&gt;Queue&lt;/li&gt;
&lt;li&gt;Set&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-что-такое-arraylist"&gt;2. Что такое ArrayList? &lt;a href="#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-arraylist" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Это список, реализованный на основе динамически расширяемого массива. То есть под капотом буквально создается массив&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-arraylist-какая-размерность-массива-по-умолчанию"&gt;3. ArrayList. Какая размерность массива по умолчанию? &lt;a href="#3-arraylist-%d0%ba%d0%b0%d0%ba%d0%b0%d1%8f-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%bc%d0%b0%d1%81%d1%81%d0%b8%d0%b2%d0%b0-%d0%bf%d0%be-%d1%83%d0%bc%d0%be%d0%bb%d1%87%d0%b0%d0%bd%d0%b8%d1%8e" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Capacity = 10&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Можно ли задать начальную емкость/размер списка?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Основы Java, коллекции, OOP, лямбды, иммутабельность</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/java-core/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/java-core/</guid><description>&lt;h1&gt;Основы Java, коллекции, OOP, лямбды, иммутабельность&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. HashMap расширилась. Добавили в неё 13 элементов, потом удалили 2 что произойдет?&lt;/h3&gt;

 &lt;h3&gt;2. В HashMap вставляем 10 тыс ключ-значений, это все разные объекты. Как сделать так, что с вероятностью 99% мы получили значение по ключу за константное время? - один вариант: сразу создать очень большую мапу 10 млрд значений&lt;/h3&gt;

 &lt;h3&gt;3. Какие коллекции позволяют дублировать, какие не позволяют?&lt;/h3&gt;

 &lt;h3&gt;4. Переменная не помечена словом final, но изменяться она не может?&lt;/h3&gt;

 &lt;h3&gt;5. Хорошо ли делать длинную цепочку наследования на классах?&lt;/h3&gt;

 &lt;h3&gt;6. Есть класс, у которого 2 поля int и java.util.date. Как сделать immutable class из этого?&lt;/h3&gt;

 &lt;h3&gt;7. Есть key, value. Программист создает Map с дженериками, где key - собственный класс, а value - string. Что ему нужно сделать, чтобы использовать key?&lt;/h3&gt;

 &lt;h3&gt;8. Есть список из 10 объектов. Делаю стрим map, filter, и другие нетерминальные операции. Сохраняю ссылку на стрим. Потом добавлю новые объекты в список. В самом конце, беру ссылку на стрим, вызываю терминальную операцию toList(). Какое количество объектов стрим обработает: изначальное или новое? Или ошибка?&lt;/h3&gt;

 &lt;h3&gt;9. Я использую массив в качестве ключа для HashMap. Во время код-ревью что вы мне скажете?&lt;/h3&gt;

 &lt;h3&gt;10. В таблице первичный ключ Х, но нужно искать не по Х, а по У. Когда грузишь мапу, что ты можешь сделать, чтобы ключь стал другим в мапе, но ты не потеряешь данные? Зачем я могу это делать?&lt;/h3&gt;

 &lt;h3&gt;11. Компилятор требует при использовании лямбды выражения либо final, либо effectively final?&lt;/h3&gt;

 &lt;h3&gt;12. Ты передаешь переменные. Параметры через конструктор. Они объявлены как final. Это иммутабельность?&lt;/h3&gt;

 &lt;h3&gt;13. У класса переопределили метод. Как вызвать метод предка из переопределенного класса? Представим, что метод приватный.&lt;/h3&gt;

 &lt;h3&gt;14. Создал иммутабельный класс, в нем 10 полей, хочу использовать свой класс как ключ в HashMap. Что делать?&lt;/h3&gt;

 &lt;h3&gt;15. Объект типа User с двумя полями String firstName, String lastName, без реализации hashCode(). Объекты User используются в качестве ключей в HashMap. Сначала записали в HashMap с ключом user1. Потом создали user2 с такими же firstName, lastName, пробуем по ключу user2 вытащить из HashMap данные. Что будет?&lt;/h3&gt;

 &lt;h3&gt;16. Сможет ли сборщик мусора удалить два объекта ссылающиеся друг на друга?&lt;/h3&gt;

 &lt;h3&gt;17. Если в интервейсе есть один дефолтный метод, то его можно использовать как функциональный интерфейс?&lt;/h3&gt;

 &lt;h3&gt;18. Если мы переопределяем поведение родительского метода, можем ли мы изменить тип исключения, которое выбрасывает родительское?&lt;/h3&gt;

 &lt;h3&gt;19. Предположим у тебя есть объект, который представляет из себя List листов стрингов. С помощью Stream API тебе надо найти String с наибольшей длиной&lt;/h3&gt;

 &lt;h3&gt;20. Статический блок, переменная статическая не final, она проинициализированна в блоке инициализации и в самом поле. Какое значение переменная примет?&lt;/h3&gt;

 &lt;h3&gt;21. Берем не final переменную. Инициализируем переменную через поле и через конструктор. Какое значение переменная примет?&lt;/h3&gt;

 &lt;h3&gt;22. Есть три способа пройтись по коллекции. Расскажи про них и какой в каком случае использовать?&lt;/h3&gt;

 &lt;h3&gt;23. Что будет если на вход map() и flatMap() приходит null&lt;/h3&gt;

 &lt;h3&gt;24. Как скопировать объект? Сделать копию объекта&lt;/h3&gt;

 &lt;h3&gt;25. Есть ArrayList на 10 элементов. Хочу получить доступ к пятому элементу. Почему доступ будет O(1)? Как сработает доступ по индексу? Если в ArrayList лежат strings?&lt;/h3&gt;

 &lt;h3&gt;26. Хочу создать LinkedList из strings. Где будут лежать strings?&lt;/h3&gt;

 &lt;h3&gt;27. У нас есть некий объект Юзер. Есть три параметра. Как инкапсулировать параметры?&lt;/h3&gt;

 &lt;h3&gt;28. Есть класс Parent и от него наследуется класс Child. В Parent есть три метода. Как нам реализовать методы, чтобы ими могли пользоваться только наследуемые.&lt;/h3&gt;

 &lt;h3&gt;29. Есть класс внутри которого находится статический параметр. Если я создам 50 инстрансов этого класса и буду менять этот статический параметр, то что будет?&lt;/h3&gt;

 &lt;h3&gt;30. Создал Stream. Произвел операцию. Смогу ли я обратиться к этому стриму еще раз?&lt;/h3&gt;

 &lt;h3&gt;31. Нужно отсортироваться List с какими то классами. Стринговыми юзерами. а стринговые юзеры они храняться в пакете который мы получили из мавена. Что тут лучше использовать?&lt;/h3&gt;

 &lt;h3&gt;32. Если мы напишем stream.filter.filter.filter что произойдет?&lt;/h3&gt;

 &lt;h3&gt;33. Как на практике проверить, что вместо родителя можно подставить наследника?&lt;/h3&gt;

 &lt;h3&gt;34. С чего начинается поиск ресурсов для удаления GC. Как GC ищет первые ссылки для удаления?&lt;/h3&gt;

 &lt;h3&gt;35. Пердставим, что у нас есть приложение, которое нормально обрабатывает 100 RPS. Жрет 250 мб оперативки. Мы захотели его ускорить и выдали ему 32 гб оперативки. Дадим на него теже 100 RPS. Измениться ли профиль ответа? Ускориться ли работа? Как будет наполняться Heap?&lt;/h3&gt;

 &lt;h3&gt;36. Как можно сравнить объекты между собой кроме equals и hashcode&lt;/h3&gt;

 &lt;h3&gt;37. Есть два класса. Один класс используется как ключ для мапы, другой класс исспользуется только для значений в мапе. Как ты будешь реализовывать контракт hashCode и equals в этих классах&lt;/h3&gt;

 &lt;h3&gt;38. TreeSet. Есть элементы от 0 до n. Начинаю последовательно вставлять в TreeSet. Какая будет высота дерева?&lt;/h3&gt;

 &lt;h3&gt;39. Есть список состоящий из одного миллиона объектов. Нужно отыскать все дубликаты использую минимальный объем памяти&lt;/h3&gt;

 &lt;h3&gt;40. Есть класс User. Внутри есть поле класса Address. В классе Address есть поле класса Building. Хочу по user получить номер здания, в котором живет. В этой цепочке всё может быть Null. Мы не хотим NullPointerException. Как это сделать? Какой уникальный безопасный метод нужно создать?&lt;/h3&gt;

 &lt;h3&gt;41. Если в кетч поймали исключение, начали обрабатываеть и словили еще одно исключение. Что будет?&lt;/h3&gt;

 &lt;h3&gt;42. Что можно сделать с List, но нельзя сделать с Queue&lt;/h3&gt;

 &lt;h3&gt;43. Как сделать копию объекта не используя стандартные методы?&lt;/h3&gt;

 &lt;h3&gt;44. Предоположим у нас есть лист Юзеров. У Юзера есть логин. Как преобразовать лист в мапу, где ключ будет логин, а значение будет Юзер.&lt;/h3&gt;

 &lt;h3&gt;45. Есть бинарное дерево упорядоченное слево на право. Есть ссылка на корень дерева. Нужно вывести все элементы дерева в порядке возрастания.&lt;/h3&gt;

 &lt;h3&gt;46. Предположим есть обхект, который представляет из себя List&amp;lt;List&lt;!-- raw HTML omitted --&gt;&amp;gt;. С помощью Stream нужно найти String с наибольшей длиной&lt;/h3&gt;

 &lt;h3&gt;47. Тебе с фронтенда приходит enum. Тебе надо сравнить два enum. Что ты будешь использовать? equals или == и почему?&lt;/h3&gt;

 &lt;h3&gt;48. Нужно List&lt;!-- raw HTML omitted --&gt; превратить в List&lt;!-- raw HTML omitted --&gt;. Что используешь для задачи перегнать один тип объектов в другой? Классический цикл или Java Stream API?&lt;/h3&gt;

 &lt;h3&gt;49. Я создал интерфейс там есть абстрактный метод и дефолтный метод. Это будет являться функциональным интерфейсом?&lt;/h3&gt;

 &lt;h3&gt;50. We have a large text file, we want to count all the words. What Java collection you will use?&lt;/h3&gt;

 &lt;h3&gt;51. We have a list of Strings. There are some duplicates. How to remove duplicates without loops and if statements?&lt;/h3&gt;

 &lt;h3&gt;52. Есть код, написанный на Java. Какие этапы он проходит перед тем, как он будет исполнен на машине? И что происходит при исполнении на машине?&lt;/h3&gt;

 &lt;h3&gt;53. Есть наш класс, в котором переопределили hashCode() так, что каждый раз возвращается новое рандомное значение (return Random.nextInt()). Мы параметризовали этим классом HashSet. Изменится ли сложность contains() у HashSet? Как будет работать HashSet?&lt;/h3&gt;

 &lt;h3&gt;54. Нужно реализовать энциклопедию: книжка, в которой написаны слова и их значения. Все слова упорядочены по алфавиту. Какую структуру, структуры данных ты бы использовал?&lt;/h3&gt;

 &lt;h3&gt;55. I put a key-value pair into the HashMap. Then another key (different from the first key) generates the same hashcode. What is the HashMap next scenario?&lt;/h3&gt;

 &lt;h3&gt;56. I&amp;rsquo;ve created final HashMap. Can I change elements of HashMap?&lt;/h3&gt;

 &lt;h3&gt;57. А как сделать, чтобы при получении ссылочного типа через getter я не мог его изменять внутри?&lt;/h3&gt;

 &lt;h3&gt;58. Ты создал параметризованный класс. Потом ты где-то в коде насоздавал этих классов, параметризованных разными классами. В Runtime все эти классы будут разными?&lt;/h3&gt;

 &lt;h3&gt;59. Открываем ресурс в конструкции try-with-resources. В логическом блоке вылетело исключение. Ресурс будет закрываться, но процессе закрытия что-то произошло с сетью и тоже вылетело исключение. Ресурс закроется?&lt;/h3&gt;

 &lt;h3&gt;60. Пишем Generic List&lt;!-- raw HTML omitted --&gt;. Что это будет значить? Какие объекты можем положить в этот лист?&lt;/h3&gt;

 &lt;h3&gt;61. Есть Pair a и Pair b. Содержимое одинаковое. Ты сравниваешь через равно, через тройное равно, через equals(). Какие результаты будут? Как в ключевом слове record?&lt;/h3&gt;

 &lt;h3&gt;62. Создашь переменную внутри цикла. Что с ней произойдет в Куче, после того, как одна итерация цикла пройдет? Когда она вычистится?&lt;/h3&gt;

 &lt;h3&gt;63. Мы делаем много вставок в конец ArrayList. Иногда хватает места, иногда не хватает, приходится расширяться. Какая средняя сложность операции? Чаще встречается плохой сценарий, когда надо расширяться?&lt;/h3&gt;

 &lt;h3&gt;64. Есть два списка очень больших, с млн элементов в каждом. ArrayList и LinkedList. Мы просто итерируемся foreach по каждому. Где быстрее процедура итерации?&lt;/h3&gt;

 &lt;h3&gt;65. Хотим использовать как ключ HashMap свой класс иммутабельный. В классе очень много полей 20-30, многие из них опциональные. Я не хочу создавать поля через конструктор объекта. Какую более удачную конструкцию можешь предложить для создания иммутабельных объектов с кучей опциональных полей?&lt;/h3&gt;

 &lt;h3&gt;66. Есть интерфейс. В нем один метод. В сигнатуре метода я не написал, что он кидает какие-либо исключения. Реализую этот интерфейс, хочу из этого метода кинуть проверяемое исключение. Могу ли я так сделать?&lt;/h3&gt;

 &lt;h3&gt;67. В TreeMap 100 элементов. Сколько там будет сравнений, сколько проходов в худшем случае, пока он не найдет элемент?&lt;/h3&gt;

 &lt;h3&gt;68. Ситуация с двумя списками: ArrayList vs LinkedList. Элементы одинаковые. Ты постоянно добавляешь элемент в конец каждого списка. И итерируешься полностью по листу. Что будет быстрее отрабатывать?&lt;/h3&gt;

 &lt;h3&gt;69. List очень большой, а памяти очень мало. На копирование даже половины исходного списка не хватит. Как с этим побороться?&lt;/h3&gt;

 &lt;h3&gt;70. Что будет быстрее работать при операции сложения: два int или два Integer?&lt;/h3&gt;

 &lt;h3&gt;71. Есть функция, которая складывает два числа. Сначала ее сигнатура: передаем в нее два int, возвращает она тоже int. Потом заменили все эти int на Integer. Это корректная замена? Какие проблемы, ошибки могут быть?&lt;/h3&gt;

 &lt;h3&gt;72. Есть список с объектами - геометрическими фигурами. У них есть свойство цвет. Надо из списка с помощью Stream API получить только зеленые фигуры. Как это сделать? Усложнение ситуации. На выходе нужно получить Map, у которой ключ это цвет, а значение это список фигур такого цвета&lt;/h3&gt;

 &lt;h3&gt;73. Как найти последний элемент стрима? Сколько всего элементов заранее не известно&lt;/h3&gt;

 &lt;h3&gt;74. Объявили переменную типа int count. Потом есть стрим и в нем есть метод map(). И в методе map() мы инкрементим count переменную, чтобы посчитать количество вызовов map(). Можно ли так сделать?&lt;/h3&gt;

 &lt;h3&gt;75. ArrayList с capacity 20. Я уже вставил 3 элемента. Потом вставляю четвертый элемент посерединке. Будет ли расширение ArrayList?&lt;/h3&gt;

 &lt;h3&gt;76. Создали HashMap. У нее 16 бакетов. Хотим вставить элемент. Посчитали его hashCode(), получили число 1024. Что дальше? Следующий элемент тоже имеет hashCode() 1024? Следующий элемент имеет hashCode() 1025, в какой бакет? Бакеты будут создаваться до бесконечности? Как буду складывать на основе hashCode() в бакеты, если в hashCode() элементов намного больше, чем 16 бакетов?&lt;/h3&gt;

 &lt;h3&gt;77. Есть наш класс, он в jar файле. jar с классом добавлен в classpath в явном виде. Какой жизненный цикл при старте JVM проходит наш класс?&lt;/h3&gt;

 &lt;h3&gt;78. Есть объекты A и B. Из A есть ссылка на B, из B есть ссылка на A. Больше на эти объекты никто не ссылается. Будет ли такая пара собрана GC?&lt;/h3&gt;

 &lt;h3&gt;79. Есть стек вызова потока. Там указана точка возврата, точка входа в метод. Что-нибудь еще на стеке есть в это время?&lt;/h3&gt;

 &lt;h3&gt;80. Есть объект, просто new Object(). У него я вызвал hashCode(). Потом прошла сборка GC, переместила объект между поколениями, по хипу перемещала. И потом я еще раз вызвал hashCode(). Он вернется такой же или изменится?&lt;/h3&gt;

 &lt;h3&gt;81. Если GC переместил объект в памяти, ссылка на объект меняется, но hashCode объекта не должен меняться. Как это происходит?&lt;/h3&gt;

 &lt;h3&gt;82. Пишешь программу. Унаследовался от какого-то класса. И тебе надо получить доступ к приватному полю или приватному методу у родительского класса. Какие варианты есть?&lt;/h3&gt;

 &lt;h3&gt;83. Есть 2 интерфейса, их оба наследует наш класс. У этих интерфейсов есть дефолтные методы с одинаковым названием и сигнатурой. Метод void apply(). Как на экземпляре нашего класса вызвать конкретный метод apply() конкретного интерфейса?&lt;/h3&gt;

 &lt;h3&gt;84. Как трансформировать Set&lt;!-- raw HTML omitted --&gt; mySet в List&lt;!-- raw HTML omitted --&gt; myList = mySet с помощью стримов?&lt;/h3&gt;

 &lt;h3&gt;85. Вы пишете код. У вас есть валидация. Вам нужно создать свое собственное исключение. Какое будете создавать? Проверяемое или нет? Критерии выбора&lt;/h3&gt;

 &lt;h3&gt;86. Есть SQLException - он проверяемый, а HibernateException почему-то не проверяемый. По сути одно и тоже. Почему так сделано&lt;/h3&gt;

 &lt;h3&gt;87. Immutability. We have an Employee object with List of departments inside it. What should we do to make Employee object immutable? The list of departments is set through the construction of the Employee object&lt;/h3&gt;

 &lt;h3&gt;88. We have an Employee object. We want to put it to the TreeSet. How Java knows what is the correct order of Employee objects?&lt;/h3&gt;

 &lt;h3&gt;89. StreamAPI. Есть терминальные операции findFirst() и findAny(). Если у тебя Array, ты сделал Stream. Сначала сделал findFirst(), а потом сделал findAny() - всегда будет возвращать одно и то же? Или разное?&lt;/h3&gt;

 &lt;h3&gt;90. Есть список lst из Integer-ов (1, 2, 3, 4, 5). Я сделал два стрима lst.stream().findFirst() и lst.stream().findAny(). Могу я быть уверенным, что вернет одно и то же? Странно, если рандомно findAny() выводит&lt;/h3&gt;

 &lt;h3&gt;91. Есть время заказа, какой бы тип ты выбрал: LocalDateTime или ZonedDateTime?&lt;/h3&gt;

 &lt;h3&gt;92. В стримах есть метод findFirst(), он находит первый элемент в стриме. А как бы ты реализовал поиск последнего элемента в стриме?&lt;/h3&gt;

 &lt;h3&gt;93. Есть классическое консольное приложение. Мы добавили 1 млн примитивных объектов в это приложение. Мы хотим очень часто (200 раз в сек.) делать операции contains(), чтобы просто получать результат True или False, и выводить на консоль. Нас интересует только скорость работы contains(), чтобы он работал как можно быстрее. Что лучше выбрать в этой ситуации: ArrayList или LinkedList?&lt;/h3&gt;

 &lt;h3&gt;94. Вставили в HashSet 1 млн уникальных объектов, они успешно вставились. Но мы реализовали hash функцию, которая всегда возвращает 1. Какой сложности будет операция contains() в этом случае?&lt;/h3&gt;

 &lt;h3&gt;95. Добавили в TreeSet 1 млн объектов, при условии, что каждый новый добавляемый объект больше предыдущего. Какая будет эффективность contains()?&lt;/h3&gt;

 &lt;h3&gt;96. Ты пишешь свой микросервис. В нем надо реализовать 10 кастомных исключений. У тебя возникает вопрос: сделать их Checked или Unchecked? Как поступишь? Где перехватывать родителя исключений будешь?&lt;/h3&gt;

 &lt;h3&gt;97. Пусть у нас есть два поля: a = 1, b = 2. В методе в одном случае они будут помечены как final, в другом не будут. С ними будут делать какие то математические операции, менять их между собой. Например, a = a * b, b = b ÷ a. Будет ли в чем-то разница, пометим мы их final или нет?&lt;/h3&gt;

 &lt;h3&gt;98. А если тебе из массива случайных чисел нужно убрать повторы, как бы ты делал? Какая будет сложность алгоритма?&lt;/h3&gt;

 &lt;h3&gt;99. Есть объект у которого два поля. Id и List&lt;!-- raw HTML omitted --&gt;. Что сделать, чтобы класс стал иммутабельным?&lt;/h3&gt;

 &lt;h3&gt;100. Представьте, что у нас есть ArrayList, что нужно сделать, чтобы поиск элемента был быстрее чем O(n)&lt;/h3&gt;

 &lt;h3&gt;101. Есть заполненная HashMap. Нужно из ключей этой HashMap сделать HashSet. Что нужно написать в коде для этого?&lt;/h3&gt;

 &lt;h3&gt;102. Сериализация. Нам потребовалось провести Singleton по процессу сериализации и десериализации. С чем можем столкнуться?&lt;/h3&gt;

 &lt;h3&gt;103. Мы добавили какой-то элемент и хотим добавить еще один. У него hash code оказался таким же. Как такая ситуация называется?&lt;/h3&gt;

 &lt;h3&gt;104. У нас есть мапа, в качестве ключа используем собственный класс, в котором hash code константа. Создаю два экземпляра этого класса и использую их как ключи. В один положил единицу, во второй двойку. Теперь я хочу получить по первому ключу значение. Какое получу? Какие плюсы и минусы того, что я сделал?&lt;/h3&gt;

 &lt;h3&gt;105. Я пишу класс, в конструкторе которого выдаю ссылку на этот класс до конца работы конструктора. Когда вызывается конструктор - об этом оповещается какой-то другой класс, допустим, через событие в Rabbit. Чем это действие мне грозит?&lt;/h3&gt;

 &lt;h3&gt;106. У меня есть ArrayList и мне нужно распечатать элементы в обратном порядке. Какие есть варианты?&lt;/h3&gt;

 &lt;h3&gt;107. Пусть в моей коллекции ArrayList 1 млн элементов. Что происходит, когда мы удаляем элемент из середины? А как мне эффективно удалить 10000 элементов в середине в ArrayList быстро?&lt;/h3&gt;

 &lt;h3&gt;108. У меня есть лист Integer, надо найти сумму через Stream API. Как будешь реализовывать?&lt;/h3&gt;

 &lt;h3&gt;109. В TreeMap внутри тоже красно-черное дерево. Чтобы оно построилось, мы должны соблюдать контракт: либо Comparator передать, либо интерфейс Comparable реализовать. Без них контракта нет. Но в HashMap красно-черное дерево строится без них. Как?&lt;/h3&gt;

 &lt;h3&gt;110. Stream API. Есть метод findFirst(). Как бы ты реализовал найти последний элемент в стриме?&lt;/h3&gt;

 &lt;h3&gt;111. Collections. Я хочу использовать свой класс как ключ HashMap. В классе много полей. Хочу, чтобы класс был иммутабельный. Как удобнее сконструировать такой объект, если многие из этих полей опциональные (то есть могут быть NULL), а в конструктор не хочу много NULL класть?&lt;/h3&gt;

 &lt;h3&gt;112. Зачем создавать такой объект, который может по независящим от нас причинам может исчезнуть? Зачем нам нужны раззные типы ссылок? Можно примеры?&lt;/h3&gt;

 &lt;h3&gt;113. У нас есть в программе данные которые хорошо если есть но ничего страшного если они исчезнут. Есть механизм для работы с такими данными. Что это за механиз?&lt;/h3&gt;

 &lt;h3&gt;114. При проектировании системы, вы обычно отделяете в архитектуре ввод и вывод от самой бизнес функуиональности. Загрузка класса, когда вы грузите ввод-вывод может быть из разных источников, а само формирование класса у вас отдельно. Представьте, что есть метод, который берет данные и превращает их в класс. Какие у него могут быть параметры&lt;/h3&gt;

 &lt;h3&gt;115. Есть список POJO классов в которых два поля, ключ и значение. Надо преобразовать в мапу без потери данных. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;116. Как можем напечатать числа от нуля до миллиона не используя циклы? Нельзя чтобы вызвался StackOverFlow&lt;/h3&gt;

 &lt;h3&gt;117. У нас есть список, ссылки которого замкнуты сами на себя. Из вне к этому списку ссылок нет. Отработает ли GC?&lt;/h3&gt;

 &lt;h3&gt;118. Есть ArrayList и LinkedList, в каждом по 1 млн объектов. Тебе нужно добавить элемент по индексу. Индекс в рантайме вычисляется. Почему?&lt;/h3&gt;

 &lt;h3&gt;119. Представим, что у нас есть объект Car. У объекта есть ArrayList деталей. Детали тоже объекты. Какую инкапсуляцию применить в данном случае?&lt;/h3&gt;

 &lt;h3&gt;120. На вход передается массив, а на выход число. Цикл, которых ходит по каждому индексу в массиве и что-то считает. Что нужно сделать, чтобы сложность по памяти была O(n)?&lt;/h3&gt;

 &lt;h3&gt;121. Когда мы делаем new Object что будет в Stack, а что в Heap? А если используем примитив?&lt;/h3&gt;</description></item><item><title>Паттерны проектирования</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B-%D0%B8-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/design-patterns/</guid><description>&lt;h2 id="паттерны-проектирования"&gt;
 Паттерны проектирования
 &lt;a class="anchor" href="#%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-gof-паттерны"&gt;1. GOF паттерны &lt;a href="#1-gof-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;em&gt;GOF паттерны&lt;/em&gt; - это классические шаблоны проектирования, описанные в книге &amp;ldquo;Design Patterns: Elements of Reusable Object-Oriented Software&amp;rdquo;, написанной четырьмя авторами (так называемой &amp;ldquo;Бандой четырёх&amp;rdquo;): Эричем Гаммой, Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидесом. Эти паттерны решают распространённые проблемы проектирования в объектно-ориентированном программировании (ООП) и помогают создавать гибкую и поддерживаемую архитектуру.&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-что-такое-паттерн"&gt;2. Что такое паттерн? &lt;a href="#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Паттерн - проверенное и готовое к использованию решение&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-плюсы-и-минусы-использования-паттернов"&gt;3. Плюсы и минусы использования паттернов &lt;a href="#3-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d0%be%d0%b2" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>NoSQL</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/nosql/</guid><description>&lt;h2 id="nosql"&gt;
 NoSQL
 &lt;a class="anchor" href="#nosql"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-nosql-типы-бд"&gt;1. NoSQL типы БД &lt;a href="#1-nosql-%d1%82%d0%b8%d0%bf%d1%8b-%d0%b1%d0%b4" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Тип&lt;/th&gt;
 &lt;th&gt;Пример&lt;/th&gt;
 &lt;th&gt;Особенности&lt;/th&gt;
 &lt;th&gt;Когда использовать&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Документные&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;MongoDB&lt;/td&gt;
 &lt;td&gt;JSON-документы, гибкая структура&lt;/td&gt;
 &lt;td&gt;Динамические, неструктурированные данные&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Ключ-значение&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Redis, DynamoDB&lt;/td&gt;
 &lt;td&gt;Максимально быстрый доступ&lt;/td&gt;
 &lt;td&gt;Кэш, данные с уникальными ключами&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Колонко-ориентированные&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Cassandra&lt;/td&gt;
 &lt;td&gt;Хранение по колонкам&lt;/td&gt;
 &lt;td&gt;Аналитика, обработка больших данных&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Графовые&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Neo4j&lt;/td&gt;
 &lt;td&gt;Узлы и связи&lt;/td&gt;
 &lt;td&gt;Моделирование сложных связей между данными&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-для-чего-используется-redis"&gt;2. Для чего используется Redis? &lt;a href="#2-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d1%82%d1%81%d1%8f-redis" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Redis&lt;/strong&gt; — это высокопроизводительная NoSQL база данных, которая работает в оперативной памяти (in-memory), обеспечивая минимальные задержки. Основное назначение Redis — хранение данных в виде ключ-значение.&lt;/p&gt;</description></item><item><title>Spring</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/spring/</guid><description>&lt;h2 id="spring"&gt;
 Spring
 &lt;a class="anchor" href="#spring"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-зачем-мы-используем-spring-почему-его-так-любят"&gt;1. Зачем мы используем Spring? Почему его так любят? &lt;a href="#1-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%bc%d1%8b-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-spring-%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%b5%d0%b3%d0%be-%d1%82%d0%b0%d0%ba-%d0%bb%d1%8e%d0%b1%d1%8f%d1%82" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;em&gt;Spring&lt;/em&gt; — это один из самых популярных фреймворков для разработки приложений на Java. Его используют благодаря широкому набору возможностей, гибкости и модульности, что упрощает разработку корпоративных приложений.&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-inversion-of-control"&gt;2. Inversion of Control &lt;a href="#2-inversion-of-control" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Это принцип, при котором мы передаем управление созданием и настройкой объектов Spring-у&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-dependency-injection"&gt;3. Dependency Injection &lt;a href="#3-dependency-injection" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;em&gt;Dependency Injection&lt;/em&gt; (внедрение зависимостей) — это способ предоставления объекту его зависимостей извне, вместо того чтобы объект создавал их самостоятельно. DI упрощает управление зависимостями и делает код более модульным, тестируемым и легко расширяемым.&lt;/p&gt;</description></item><item><title>Исключения</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/exceptions/</guid><description>&lt;h2 id="исключения"&gt;
 Исключения
 &lt;a class="anchor" href="#%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-расскажите-про-иерархию-исключений"&gt;1. Расскажите про иерархию исключений &lt;a href="#1-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d1%8e-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;figure&gt;&lt;img src="https://krios2146.github.io/java-backend-interview-prep/exception_hierarchy.png"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Exceptions&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Class Throwable&lt;/strong&gt; - общий предок для всех исключений&lt;/p&gt;&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-что-такое-error-и-exception"&gt;2. Что такое Error и Exception? &lt;a href="#2-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-error-%d0%b8-exception" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt; - Связаны с проблемами уровня JVM&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exception&lt;/strong&gt; - Являются результатом проблем в программе&lt;/p&gt;
&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-расскажите-про-обрабатываемые-и-необрабатываемые-исключения"&gt;3. Расскажите про обрабатываемые и необрабатываемые исключения &lt;a href="#3-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b6%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%be-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%b0%d1%82%d1%8b%d0%b2%d0%b0%d0%b5%d0%bc%d1%8b%d0%b5-%d0%b8-%d0%bd%d0%b5%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%b0%d1%82%d1%8b%d0%b2%d0%b0%d0%b5%d0%bc%d1%8b%d0%b5-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;Checked&lt;/strong&gt; - Exception. Должны обрабатываться блоком catch, или описываться в сигнатуре метода (IOException)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unchecked&lt;/strong&gt; - Ошибки Error, а так же исключения времени выполнения (RuntimeException) и его наследниками. Могут не обрабатываться блоком catch и не быть описаны в сигнатуре метода&lt;/p&gt;</description></item><item><title>Многопоточность</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/multithreading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/multithreading/</guid><description>&lt;h1&gt;Многопоточность&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Переменную count хочешь быстро заинкрементировать до 10 тыс. В цикле запустил 10 тыс. потоков, которые инкрементят счетчик. Решил сделать синхронизацию. Какой способ выбрать: synchronized или atomic? Почему?&lt;/h3&gt;

 &lt;h3&gt;2. Как сделать так, если 10 потоков вызывают get() одновременно, ты не создал 10 объектов Singletone?&lt;/h3&gt;

 &lt;h3&gt;3. Может ли быть, что разные потоки всегда видят актуальное значение переменной, хотя она НЕ помечена volatile?&lt;/h3&gt;

 &lt;h3&gt;4. Есть статичный метод, в его сигнатуре пишу synchronized. На чем будет происходить синхронизация?&lt;/h3&gt;

 &lt;h3&gt;5. Есть объект, внутри синхронизированный метод, к которому могут обратиться несколько потоков. Предположите, когда синхронизированный метод не сработает и получим коллизию?&lt;/h3&gt;

 &lt;h3&gt;6. Пишем генерацию отчета. Мне надо сходить в 4 системы по HTTP и получить данные. Хотим ускорить с помощью многопоточки. Как сделать?&lt;/h3&gt;

 &lt;h3&gt;7. Есть 5 разных потоков. Есть метод объекта, который потоки хотят плюс-минус одновременно дернуть, но нужно, чтобы дернул только один. Что делать в первую очередь&lt;/h3&gt;

 &lt;h3&gt;8. На atomic переменной сделали счетчик. Изначально значение переменной 0. Два потока прибавляют 1 одновременно.&lt;/h3&gt;

 &lt;h3&gt;9. Есть несколько потоков, мы хотим, чтобы они все стартанули одновременно. Как это сделать средствами Java?&lt;/h3&gt;

 &lt;h3&gt;10. В коде нужно сделать паузу. Нельзя использовать классические способы Thread sleep, wait. Как нам реализовать паузу?&lt;/h3&gt;

 &lt;h3&gt;11. Нужно сделать систему мониторов, мьютексов, чтобы таски выполнять согласованно. Какой concurrency интерфейс использовать? Методы, классы, интерфейсы, которые предоставляют механизмы блокировок?&lt;/h3&gt;

 &lt;h3&gt;12. Есть счетчик. Запустили 100 потоков. По итогу у нас будет значение 100?&lt;/h3&gt;

 &lt;h3&gt;13. В одном потоке перебирается коллекция, а в другом потоке из коллекции что-то удаляется. Что делать, чтобы не было ошибки?&lt;/h3&gt;

 &lt;h3&gt;14. У хэшмап планируем использовать в качестве некого счетчика для действий пользователя. В качестве ключа у нас пользователь, в качестве значения счетчик. Происходит какое-то событие, мы берем пользователя, добавляем в счетчик плюс один. Таким образом у нас растет событие. Вопрос. Будет ли корректно такая мапа работать в многопоточке?&lt;/h3&gt;

 &lt;h3&gt;15. Если создать 100 потоков программа будет выполняться быстрее? Поток идет в центробанк запрашивает валюту и заносит в таблицу. Миллион значений. Если создать 5 потоков и 100 потоков. Что быстрее выполнится?&lt;/h3&gt;

 &lt;h3&gt;16. Создание потока дорогая операция. Как нам помогает ExecutorService?&lt;/h3&gt;

 &lt;h3&gt;17. У многопоточки есть 3 параметра. atomicity, visibility, happens-before. Что из этого нам обеспечивает переменная volatile&lt;/h3&gt;

 &lt;h3&gt;18. Предположим поток ничего не выделяет из памяти. Вообще не обращается к Хипу. Этот поток может жить без Стека?&lt;/h3&gt;

 &lt;h3&gt;19. Поток который обрабатывает очень большой объекм данных. Поток обращается к данным. Все данные будут закешированы к кеше этого потока?&lt;/h3&gt;

 &lt;h3&gt;20. Когда присваиваете значение в переменную это атомарное действие?&lt;/h3&gt;

 &lt;h3&gt;21. Если два потока хотят синхронизироваться, какой объект они могут использовать в качестве монитора?&lt;/h3&gt;

 &lt;h3&gt;22. Если 10 потоков, которые пришли в synchronize, кто из них первый попадет в Lock&lt;/h3&gt;

 &lt;h3&gt;23. Есть потоки. Вы стартуете на каждую задачу либо сделали threadPool или Executor. У вас ограниченное количество потоков. С точки зрения вычислений это более эффективно или просто удобно?&lt;/h3&gt;

 &lt;h3&gt;24. Как написать асинхронное приложение. Как одновременно запустить две функции и дождаться их выполнения. Например есть getTotalPrice и getBonusRubbles. Надо вычесть их в конце. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;25. В чем отличие несинхронной обработки запроса и неблокирующей реактивной обработки?&lt;/h3&gt;

 &lt;h3&gt;26. Почему в многопоточной среде выполнения из коллекции ArrayList может выброситься ConcurrentModificationException. Как это пофиксить?&lt;/h3&gt;

 &lt;h3&gt;27. Если создали в main новый поток и запустили, какой приоритет будет у потока?&lt;/h3&gt;

 &lt;h3&gt;28. Пишу код, хочу использовать чужой класс. Мой участок кода будет исполняться многопоточно. Как понять, что чужой класс будет нормально работать в многопоточной среде? Чужой класс - это Registry, там обычная HashMap, в которую что-то складываем, потом что-то достаем&lt;/h3&gt;

 &lt;h3&gt;29. Хотим вызвать три метода в параллель, объединить результаты которые они выдадут и вызвать из своего метода? Каждый из методов возвращает Set.&lt;/h3&gt;

 &lt;h3&gt;30. Создаем на Spring Initializer простое Spring Boot приложение, добавив в него всего один компонент Web. И создадим один контроллер, в рамках которого создадим один метод. Это приложение будет однопоточным или многопоточным?&lt;/h3&gt;

 &lt;h3&gt;31. Как считаете, это безопасно с точки зрения потоков, что дефолтный скоуп Singleton, а кругом многопоточка?&lt;/h3&gt;

 &lt;h3&gt;32. Как блокировать поток в многопоточной среде&lt;/h3&gt;

 &lt;h3&gt;33. Хотим вызавать три метода в параллель, объединить результаты и вернуть из своего метода. Как такое реализовать?&lt;/h3&gt;

 &lt;h3&gt;34. Есть класс Thread, в нем есть статический метод sleep(). В Sleep можем передать временное значение. У каждого объекта в Java есть метод wait(). Чем отличаются эти два метода?&lt;/h3&gt;

 &lt;h3&gt;35. Когда выполняли notifyAll и все потоки пробудились, какой поток будет выполняться?&lt;/h3&gt;

 &lt;h3&gt;36. Как проверить, что именно 20 потоков прошло через блок кода?&lt;/h3&gt;

 &lt;h3&gt;37. Есть класс Desk. Есть якобы AI и пользователь работают параллельно, а IndianAI игрок сидит из Индии и по TCP/IP общается с программой. Как бы реализовал многопоточку в этом случае?&lt;/h3&gt;

 &lt;h3&gt;38. Есть метод помеченный synchronized. И есть другой метод в том же классе, в котором критическая секция помечена через Lock объект. Что является монитором в данном случае? Относительно чего синхронизируются?&lt;/h3&gt;

 &lt;h3&gt;39. Если я напишу volatile в многопоточном инкременте обычного int, будет ли корректно считаться инкремент?&lt;/h3&gt;

 &lt;h3&gt;40. Если указали synchronized в сигнатуре метода, то кто будет там монитором?&lt;/h3&gt;

 &lt;h3&gt;41. Запустил CompletableFuture на 10 задач. И запустил Executor на 10 потоков. В чем разница?&lt;/h3&gt;

 &lt;h3&gt;42. Есть сервис. На вход ему посылаем потоки. Один сделан на синхронном потоке, другой на асинхронном. У каждого под капотом пул из 10 потоков. Ядер у процессора 10. Каждый запрос выполняется 3 мин. Кинул первый, второй, &amp;hellip;, десятый запрос, потом одиннадцатый запрос кидаю, а под капотом всего 10 потоков. Что произойдет с одиннадцатым запросом, если первые десять запросов еще не исполнились?&lt;/h3&gt;

 &lt;h3&gt;43. Есть глобально доступный счетчик public static int count = 0. Есть два потока. Каждый поток в цикле из 100 итераций делает инкремент на 1 счетчика count. Потоки запускаются одновременно. Мы дожидаемся их выполнения. Что мы увидим в счетчике count после их отработки?&lt;/h3&gt;

 &lt;h3&gt;44. Есть 1000 клиентов. Нужно каждый час проходить и выполнять какую-то работу. Есть вариант распараллелить?&lt;/h3&gt;

 &lt;h3&gt;45. У Вас есть два потока, которые считывают данные из заказа. Один поток не справлялся и Вы решили подключить второй. Может получиться, что Вы заказ считали, а он в БД не вставляется. Например, товар еще не подгрузился. Надо к этому заказу потом вернуться, а у Вас два потока работают, нужно как-то переставлять смещение, что считали, а что нет. Как бы Вы это решили?&lt;/h3&gt;

 &lt;h3&gt;46. Есть базовый трехзвенный сервис: получить пользователей, в БД все идет. Через RestController идет. Жирный pod на 20 потоков вызывает одни и те же методы, использует одни и те же классы. И в многопоточной среде все отлично работает. Мы не ставим блокировки, не используем многопоточные коллекции. Почему?&lt;/h3&gt;

 &lt;h3&gt;47. Как думаешь, будут ли проблемы с многопоточностью, если мы поменяем скоуп бина? Если поставим Prototype или Web Request?&lt;/h3&gt;

 &lt;h3&gt;48. Часто бывает, что из БД вычитал набор тасков, они обрабатываются долго, надо это сделать параллельно. Как обычно такое решаешь?&lt;/h3&gt;

 &lt;h3&gt;49. Ты пишешь приложение, в котором используется CompletableFuture, которую ты запускаешь и пытаешься прочитать что-то из SecurityContext и как-то обработать. Что будет происходить?&lt;/h3&gt;

 &lt;h3&gt;50. Многопоточка, CompletableFuture. Есть наш метод, он выполняет какую-то логику. Мы можем вносить изменения в его реализацию. Главный нюанс: если в метод закинуть много данных, то для обработки он будет потреблять много ресурсов и очень долго выполняться. Мы хотим начать вызывать его в отдельном потоке. Но с нюансом: если за 5 сек ответ, мы больше не хотим ждать его выполнения и больше не хотим потреблять ресурсы на его выполнение. Что нужно сделать?&lt;/h3&gt;

 &lt;h3&gt;51. Есть 3 потока, каждый что-то делает и мы сделали счетчик количества операций. В каждом потоке мы хотим этот счетчик инкрементировать. Как это сделать потокобезопасно?&lt;/h3&gt;

 &lt;h3&gt;52. Если через семафор: пришел поток, захватил семафор, остальные потоки сидят-курят, в ожидании, когда освободится. То есть в момент инкрементации все потоки стоят, ничего не делают, пока один не сделает. Как бы ты реализовал в таком случае?&lt;/h3&gt;

 &lt;h3&gt;53. У нас есть два потока - A и B. В какой-то момент из потока А в поток В каким-то образом нужно передать информацию, что мы заняли ресурс. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;54. У нас есть два потока, они не завершились и что-то делают. Допустим, первый поток ждет второго. Как из второго потока прокинуть в первый сообщение, чтобы его оживить?&lt;/h3&gt;

 &lt;h3&gt;55. А если мы хотим ограничить метод несколькими потоками? Например, у нас есть крупный метод, который работает с большой локальной мапой. Нужно, чтобы с ним работало максимум три потока, больше нельзя. Как это реализовать?&lt;/h3&gt;

 &lt;h3&gt;56. Соотношение Happens-before. Если мы что-то записали в волатайл переменную, а в другом потоке считали измененное значение, то&amp;hellip;? Что будет?&lt;/h3&gt;

 &lt;h3&gt;57. Когда мы используем ComplitableFuture у нас подается асинхронная задача. Асинхронная задача должна где-то выполняться. Где выполняется асинхронная задача?&lt;/h3&gt;

 &lt;h3&gt;58. Два потока зашли в один метод, при этом в методе не рассчитано, что с ним будут работать параллельно два потока. Что мы получим на выходе?&lt;/h3&gt;

 &lt;h3&gt;59. Из-за synchronized мы лишаемся преимуществ многопоточности: потоки стоят в очереди. Как можно решить эту проблему?&lt;/h3&gt;

 &lt;h3&gt;60. Пусть ExecutorService создал потоки, мы из пула взяли поток, он выполнил свою задачу. Что с ним дальше происходит?&lt;/h3&gt;

 &lt;h3&gt;61. Мы хотим написать самопальный кеш. Не использую готовые решения. Что будем использовать?&lt;/h3&gt;

 &lt;h3&gt;62. Взяли кеш и выяснили, что общий кеш нам не нужен. Нам нужен для каждого нового вызова сервиса нам нужно создавать кеш. Что будем делать? У нас есть вызов сервиса. 16 потоков, мы 16 раз вызвали сервис. Для каждого единичного вызова сервиса, нужно сделать так, чтобы создавался новый кеш&lt;/h3&gt;

 &lt;h3&gt;63. Есть сервис отправки пушей для клиентов в телефон. Пуши отправляете пакетами по 200 номеров. Хотите чтобы пакеты отправлялись параллельно. Как бы вы это сделали через Compatible Future?&lt;/h3&gt;

 &lt;h3&gt;64. Как обрабатывать ошибки в Compatible Future? У вас какие то элементы отправились, а какие то ошбику сделали. N потоков отправки. Какие то успешно, какие то нет. Надо разобраться, какие в этих потоках сообщения отправились, а какие нет. Те которые не отправились, отправить повторно&lt;/h3&gt;

 &lt;h3&gt;65. Есть main. В нем мы создаем новый поток, в котором просто в цикле со слипом выводим лог. Есть дочерний поток. Если main процесс завершится, закроется ли дочерний поток?&lt;/h3&gt;

 &lt;h3&gt;66. Есть файл, в нем хранятся key-value. Этот словарь в файле неизменен, мы его включили в сборку. Нам нужно этот словарь отдавать потребителям. Как это лучше имплементировать? Чтобы поддерживать многопоточное чтение. Надо отдавать записи по ключу из него. В каких структурах бы хранил? Сделал бы блокировки?&lt;/h3&gt;

 &lt;h3&gt;67. Есть HashMap, объявил ее volatile. Я делаю put в нее. Потом следующий поток. Это будет атомарное изменение? Поможет ли volatile в данном случае?&lt;/h3&gt;

 &lt;h3&gt;68. Есть мой кастомный поток, connection. Что нужно сделать, чтобы поместить его в try-with-resources?&lt;/h3&gt;

 &lt;h3&gt;69. Есть проблема в том, что параллельный стрим берет потоки из пула, которым пользуется весь application?&lt;/h3&gt;

 &lt;h3&gt;70. Что случится если параллельный стрим возьмет все потоки из пула?&lt;/h3&gt;

 &lt;h3&gt;71. Работаю на одноядерном процессоре. Создавать больше одного потока не имеет смысла? Можно ли создать больше одного потока?&lt;/h3&gt;

 &lt;h3&gt;72. У нас большая система. В процессе работы запустился поток и в нем произошел exception. Где мы увидем его? В логах или не увидем? В методе run, try и catch нету.&lt;/h3&gt;

 &lt;h3&gt;73. У меня идет процесс и мне нужно получить сигнал от другого потока в течении определенного времени. Какой класс использовать или механизм?&lt;/h3&gt;

 &lt;h3&gt;74. Есть функция вычисляющая новое значение на основе предыдущего. Выполнение функции требует больших ресурсов. Вызывается из многопоточного окружения. Что лучше использовать атомарные типы или блоки синхронизации?&lt;/h3&gt;</description></item><item><title>ORM</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/orm/</guid><description>&lt;h2 id="orm"&gt;
 ORM
 &lt;a class="anchor" href="#orm"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-hibernate-jpa-jdbc-orm"&gt;1. Что такое Hibernate, JPA, JDBC, ORM? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-hibernate-jpa-jdbc-orm" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;em&gt;Hibernate&lt;/em&gt; - это ORM Framework (одна из самых распространённых реализаций спецификации JPA).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JPA (Java Persistence API)&lt;/em&gt; - это Java спецификация, которая определяет правила преобразования
объектно-ориентированной модели (Java объекты) в реляционную (строки таблицы). Предоставляет набор интерфейсов/аннотаций.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ORM (Object-Relational Mapping)&lt;/em&gt; - процесс преобразования объектно-ориентированной модели в реляционную и наоборот.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JDBC (Java DataBase Connectivity&lt;/em&gt; - низкоуровневый API для взаимодействия с базами данных.&lt;/p&gt;
&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-плюсы-и-минусы-orm"&gt;2. Плюсы и минусы ORM &lt;a href="#2-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-orm" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>SQL, базы данных, индексы, ORM и миграции</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/sql-databases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/sql-databases/</guid><description>&lt;h1&gt;SQL, базы данных, индексы, ORM и миграции&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. На счету пользователя 1000 р. Первая транзакция: читает 1000 на счету, пытается снять 1000. Вторая транзакция тоже читает 1000, хочет снять еще 500 р. По результату уходим в минус. Как обойти ситуацию? -Если хотим решить ситуацию, но оставить уровень транзакции READ COMMITED?&lt;/h3&gt;

 &lt;h3&gt;2. На уровне Repeatable Read или Serializable транзакция начинает обновлять запись, но сама транзакция еще не завершается. Могут ли две транзакции друг друга заблокировать? Как называется, как с ней быть? - deadlock&lt;/h3&gt;

 &lt;h3&gt;3. По бизнес-логике нужно часто делать запросы по точному совпадению фамилии доставать пользователей. Ты хочешь повесить индекс на это поле для повышения перформанса. Какой тип индекса лучше подойдет? - А хеш-индекс подойдет? - Если поле не фамилия, а номер счета, но не primary key? - Если поле updated_at timestamp, хочу посмотреть все данные, которые были обновлены за последний час, либо за вчерашний день, какой индекс лучше подойдет? - BTree, потому что отсортированное дерево&lt;/h3&gt;

 &lt;h3&gt;4. Как резделять данные по шардам, если есть 4 инстанса, мы берем данные из uuid. А потом захотим добавить 5 инстанс, придется переложить заново? - Альтернатива координатору для распределения по шардам (если координатор упадет, потеряем данные ко всему)&lt;/h3&gt;

 &lt;h3&gt;5. Liquibase. Как действовать если не знаем, какая БД в проде. Боимся, что что-то произойдет при накатке. Хотим сделать себе возможность откатить изменения&lt;/h3&gt;

 &lt;h3&gt;6. Есть таблица, 2 поля: айди и количество лайков. Как бы ты сделал увеличение счетчиков лайков на 1?&lt;/h3&gt;

 &lt;h3&gt;7. Какой-то запрос читает данные, в это время другой изменяет данные в бд. Какие данные к нам прийдут?&lt;/h3&gt;

 &lt;h3&gt;8. Создали индекс на поле, делаем запрос на это поле, а индексы не сработали. Такое возможно?&lt;/h3&gt;

 &lt;h3&gt;9. Запрос медленно работает Что делать?&lt;/h3&gt;

 &lt;h3&gt;10. Есть атрибут state, на нем есть индекс. Подхватится ли индекс при запросе с проверкой state на Null?&lt;/h3&gt;

 &lt;h3&gt;11. Из таблицы удаляем автора. К автору прицеплено 10 книг. К кому будут прицеплены эти книги? Что будет с id автора?&lt;/h3&gt;

 &lt;h3&gt;12. Почему нельзя сделать две БД на запись и на чтение?&lt;/h3&gt;

 &lt;h3&gt;13. Как из запроса с группировкой выбрать одну группу? Например, чтобы сумма была больше чего-то?&lt;/h3&gt;

 &lt;h3&gt;14. Большая таблица на миллион записей. Обеспечить быстрый доступ к данным. В таблицу много пишем. Как совместить?&lt;/h3&gt;

 &lt;h3&gt;15. Как удалять быстро и много данных из БД? Удаление по дням. Как можно реализовать?&lt;/h3&gt;

 &lt;h3&gt;16. Как ограничить размер выборки? Запрос должен вытащить n записей. Как реализовать?&lt;/h3&gt;

 &lt;h3&gt;17. Есть таблица с данными. 10 полей. Есть выбор сделать 10 индексов по одному полю или один индекс по десяти. Как лучше?&lt;/h3&gt;

 &lt;h3&gt;18. Представь, что у нас много компаний сидят на одной БД и у нас в каждой таблице есть колонка с кодом компании. Любой WHERE начинается с наименования компании. Означает ли это что нужно повесить индекс на колонку с компаниями?&lt;/h3&gt;

 &lt;h3&gt;19. Есть два апдейта. Есть пользователь и баланс на счете. Первый апдейт снимает с него 50 рублей. Второй апдейт снимает 50 рублей. Они выполняются одновременно или последовательно? Есть ли какие то механизмы управления?&lt;/h3&gt;

 &lt;h3&gt;20. У нас есть очень длинная транзакция с большим количеством селектов. В конце один апдейт. Что сделать чтобы заблокировать данные на этапе когда я их селекчу.&lt;/h3&gt;

 &lt;h3&gt;21. Что будет если мы делаем селект в одну таблицу, но у таблицы есть много ссылок на другие таблицы. Один ко многим. Что делать, чтобы объединить таблицы и был только одни запрос&lt;/h3&gt;

 &lt;h3&gt;22. Представь, что ты проектируешь таблицу. Как ты в самом начале накидываешь индексы?&lt;/h3&gt;

 &lt;h3&gt;23. Уровень изоляции Repeatable read. Две транзакции работают. Будет Lock на чтение, на запись или на то и на другое?&lt;/h3&gt;

 &lt;h3&gt;24. Твой запрос перестал работать через некоторое время. Твои действия?&lt;/h3&gt;

 &lt;h3&gt;25. Есть таблица с данными. Кредитные заявки. Есть некий кредитный статус. 3 штуки. New, in progres, close. Нам нужно написать миграцию, которая будет доставать заявку по статусу и их мигрировать. Миграция подразумевает изменение статусов. Какие проблемы могут появиться и как их решать? Рассматриваем один поток. Данных очень много и нельзя все вытаскивать скопом.&lt;/h3&gt;

 &lt;h3&gt;26. Таблица пользователей и таблица машин. Связь один-ко-многим. Где здесь N+1 запрос?&lt;/h3&gt;

 &lt;h3&gt;27. Две простые сущности: сотрудник и телефон. О сотруднике данных мало: ФИО одной строкой. О телефоне данных мало: номер одной строкой. Сотрудник имеет много номеров, один номер принадлежит только одному сотруднику. Как организовать в БД?&lt;/h3&gt;

 &lt;h3&gt;28. Есть сущность и связанная к ней сущность. Нужно вытащить список родительских сущностей. Что произойдет в рамках запроса, если ленивая загрузка включена? Как называется эта проблема?&lt;/h3&gt;

 &lt;h3&gt;29. В БД есть справочные таблицы, которые никогда не меняются. Есть Spring MVC приложение. Нужно много ходить в эти таблицы, много запросов к БД. Как разрулить ситуацию со стороны Hibernate?&lt;/h3&gt;

 &lt;h3&gt;30. Запускаем поток 1. В этом потоке сделаю 5 раз выборку из базу по одному и тому же id. Если включить запросы в БД, что мы увидим?&lt;/h3&gt;

 &lt;h3&gt;31. Если написать дефортный OneToMany? Выберу из базы и закрою транзакцию и попробую сериализовать. Что будет?&lt;/h3&gt;

 &lt;h3&gt;32. Есть транзакция, которая состоит из 10 различных комманд. Предположим, что все вычислили правильно, уровень изоляции постален верно. Концепция ACID гарантирует на 100% что проблем не возникнет?&lt;/h3&gt;

 &lt;h3&gt;33. Когда делаем JOIN указываем по каким параметрам связываем таблицы. Чаще всего используем оператор ON. Какие еще операторы можно использовать?&lt;/h3&gt;

 &lt;h3&gt;34. Нужно делать поиск по большому количеству колонок. Не хочу делать индексы. Что можно придумать?&lt;/h3&gt;

 &lt;h3&gt;35. Есть формочка поиска в интернет магазине и надо строить динамический sql запросы в зависимости от параметров с формы. Как мы можем по запросу формировать динамические sql запросы?&lt;/h3&gt;

 &lt;h3&gt;36. Берем постгре консоль, где можно выполнять запросы. Нужно вывести первую страницу, которая содержит пять элементов. Как должен выглять запрос?&lt;/h3&gt;

 &lt;h3&gt;37. Находимся на первой страничке интернет магазина. Вывелось пять элементов. Переходим на вторую страницу, но в момент перехода добавляется еще пять элементов. Получается, что при переходе с первой страницы на вторую мы увидем информацию с первой страницы. Как решить?&lt;/h3&gt;

 &lt;h3&gt;38. Приложение супер оптимизировано, но мы уперлись в производительность в БД. Как это можно решить?&lt;/h3&gt;

 &lt;h3&gt;39. Есть индекс по нескольким полям X, Y, Z. Уcловия Y1, Z2. X - не указан. Будет ли профилировщик использовать этот индекс?&lt;/h3&gt;

 &lt;h3&gt;40. Создали Entity, неправильно переопределили hashCode(), он всегда возвращает рандомное число. Чем это опасно?&lt;/h3&gt;

 &lt;h3&gt;41. Есть две сущности. Связь One to Many. В первой сущности есть поле список второй сущности. Достаем из БД первую сущность и удаляем ее. Что будет с вложенным списком второй сущности&lt;/h3&gt;

 &lt;h3&gt;42. Почему OneToMany Lazy, а ManyToOne Eager&lt;/h3&gt;

 &lt;h3&gt;43. В БД много записей. Как настроишь отображение большого количества данных между бэком и фронтом?&lt;/h3&gt;

 &lt;h3&gt;44. Описываешь структуру сотрудника предприятия. У сотрудника есть начальник и подчиненные. Как реализовать такую структуру?&lt;/h3&gt;

 &lt;h3&gt;45. Делаешь рабочий проект. Как понять тебе нужна ORM или JDBC?&lt;/h3&gt;

 &lt;h3&gt;46. Как с помощью LEFT и RIGHT JOIN получить выборку аналогичную FULL JOIN&lt;/h3&gt;

 &lt;h3&gt;47. Можно в проде создать новое поле на работающей базе?&lt;/h3&gt;

 &lt;h3&gt;48. Как в SQL посчитать уникальные значения по нескольким полям? Без использования DISTINCT, потому что поле высчитывается, например&lt;/h3&gt;

 &lt;h3&gt;49. Где отследить миграцию, которую сделали с помощью liquibase для Postgres? Как в liquibase настраивается лог миграции?&lt;/h3&gt;

 &lt;h3&gt;50. Есть таблица. После каких значений id выборка может подтормаживать? (к примеру если 10 Id то норм, а весли десять миллионов то начинает лагать)&lt;/h3&gt;

 &lt;h3&gt;51. Микросервисная среда, много микросервисов работают. Мы обращаемся к одному сервису, а он тормозит. Год назад он отвечал за 2 сек, а сейчас за 20 сек. Какие варианты есть, чтобы понять, что происходит?&lt;/h3&gt;

 &lt;h3&gt;52. Интернет магазин и клиент ищет товар. Все характиристики товаров разложены по разным таблицам. Клиент выбирает один или два параметра. Как ты будешь формировать запрос?&lt;/h3&gt;

 &lt;h3&gt;53. Нужно хранить в БД сущности определенное количество времени, по месяцу. Как бы реализовал эту логику?&lt;/h3&gt;

 &lt;h3&gt;54. На бэке есть таблица с пользователями, где много полей (фио, телефон, тд). На фронте эта таблица выводится списком. У пользователя есть фильтр по всем полям пользователя. В запросе на бэк все фильтры передаются в объекте вместе с запросом. На бэке нужно посмотреть на выбранные фильтры и сделать SQL запрос. Динамическая фильтрация. Как сделать в рамках Spring?&lt;/h3&gt;

 &lt;h3&gt;55. Есть метод getUsers(), он возвращает все, что есть в таблице. Бизнес просит добавить пагинацию и фильтрацию по 100 колонкам. Фильтрация по каждой колонке может быть, а может не быть. Как решить задачу в Java?&lt;/h3&gt;

 &lt;h3&gt;56. Hibernate. Есть таблицы users, roles. В сущности user прописана коллекция roles ManyToMany, мы проставили @Lazy. Пришла задача сделать эндпоинт, где смогу вытащить user-а со всеми его roles. Менять @Lazy на @Eager мы не можем. Что делать?&lt;/h3&gt;

 &lt;h3&gt;57. DB. Table: employee(id, name, email). Column email is unique. But we only have SELECT query: SELECT * FROM employee WHERE id = ? Should we put index on email column? If we put index on column email, would we change smth for this query?&lt;/h3&gt;

 &lt;h3&gt;58. Хочу посчитать среднее значение по таблицам, но не хочу выводить среднее значение меньше 10. Как это будет выглядить в запросе?&lt;/h3&gt;

 &lt;h3&gt;59. Что используешь, если нужно в колонке установить значение 1, если было 5, установить значение 2, если было 10, иначе оставить прежнее?&lt;/h3&gt;

 &lt;h3&gt;60. Есть БД с крупными записями. Мы хотим читать эти записи и работать с большим объемом этих записей. Иногда падаем при чтении этих записей. Как решить с помощью Hibernate, Spring Data JPA? Какие подходы использовать?&lt;/h3&gt;

 &lt;h3&gt;61. БД, большой объем. Есть таблица весом 1 Тб. В момент обращения к таблице на диске происходят проблемы со стороны БД. Что делать, чтобы снизить нагрузку на таблицу? В таблице жирные записи. К таблице очень часто обращаются. В момент фильтраций, сортировки таблица на диске отжирает очень большое пространство&lt;/h3&gt;

 &lt;h3&gt;62. Первая транзакция стала менять строку, вторая транзакция встала в блокировку, так как ждет первую. Первая меняет условия для второй транзакции. Первая транзакция коммитется. Вторая транзакция выполнится?&lt;/h3&gt;

 &lt;h3&gt;63. Когда вылетает исключение, что не может удалить из БД какое то значение. Из-за чего такое бывает?&lt;/h3&gt;

 &lt;h3&gt;64. У нас есть B-Tree индекс по varchar столбцу. Мы делаем запрос &amp;ldquo;LIKE ? небольшой кусок текста ?&amp;rdquo;. Индекс будет работать? Какие есть варианты чтобы использовался индекс?&lt;/h3&gt;

 &lt;h3&gt;65. У нас оптимистическая блокировка, мы вытащили запись. У нее есть какая-то версия. Мы в моменте, когда нам нужно обновить эту запись в БД. Как сделать так, чтобы наш апдейт случился только тогда, когда версии совпадают? Если нет, то выкинуть ошибку.&lt;/h3&gt;

 &lt;h3&gt;66. В соцсети, которую пишем люди часто ищут пользователей по возрасту. WHERE age &amp;gt; 30 AND age &amp;lt; 40. В Postgres можем посмотреть служебную таблицу с данными о медленных запросах slow queries. И там много запросов с таким фильтром. Как побороть эту проблему?&lt;/h3&gt;

 &lt;h3&gt;67. Есть таблица, в ней есть столбцы. В какой-то момент в одном из столбцов потребовалось изменить тип данных. Предположим, что вместо целочисленного нужен строковый. Как будешь реализовывать?&lt;/h3&gt;

 &lt;h3&gt;68. У тебя есть селективная ручка, вы провели анализ и поняли, что проблема с перформансом. Как бы ты решал эту проблему? Мы пошли копать, денормализовали базу. Посмотрели в EXPLAIN ANALYZE, видим, что индексы есть, но мы туда не идем. Может ли такое быть? Дальше пошли копать. Индексы есть, система разрослась. Проблемы с перформансом есть. Что еще можем сделать?&lt;/h3&gt;

 &lt;h3&gt;69. По-умолчанию используется B-Tree дерево, в котором скорость поиска логарифмическое. А мы в начале собеса говорили, что есть структуры данных, где константный поиск. Почему HashMap не используют по-умолчанию?&lt;/h3&gt;

 &lt;h3&gt;70. Нужны специфичные операции: проверить, что у jsonb на верхнем уровне существует определенный ключ. Какой индекс использовать?&lt;/h3&gt;

 &lt;h3&gt;71. Таблица заказов. Три столбца: id заказа, статус заказа boolean и описание заказа. Хотим вытащить все незавершенные заказы. На какие столбцы будем вешать составной индекс?&lt;/h3&gt;

 &lt;h3&gt;72. Важно, в каком порядке указывать столбцы в составном индексе? Что меняется, если порядок столбцов меняется?&lt;/h3&gt;

 &lt;h3&gt;73. Если я создал составной индекс на колонки a и b, потом в запросе ссылаюсь только на b столбец в WHERE, будет ли использоваться составной индекс?&lt;/h3&gt;

 &lt;h3&gt;74. В JPA-репозитории есть какая-то сущность. У него есть id. На уровне БД это Primary Key. Мы пытаемся сохранить другую сущность с идентичным id. С помощью JPA-репозитория делаем save(). Что произойдет? Будет ли исключение?&lt;/h3&gt;

 &lt;h3&gt;75. Пишу класс JPA, который описывает Entity. В классе есть id. Достаточно ли брать hashcode() только от id? Или лучше использовать все поля?&lt;/h3&gt;

 &lt;h3&gt;76. В БД есть таблица с людьми. И нам нужно зачитать всех людей, которые родились после определенной даты. Какую технологию бы выбрали и как реализовали бы в коде?&lt;/h3&gt;

 &lt;h3&gt;77. Нужно спроектировать БД, где много операций вставки и изменения, мало операций чтения. Что удобнее использовать: нормализованные или денормализованные таблицы? Почему?&lt;/h3&gt;

 &lt;h3&gt;78. БД где есть сотрудники и история операций (действий) сотрудников. Как выглядит денормализованная и нормализованная форма такой БД? Сколько таблиц? Если денормализованная БД, как много действий одного сотрудника записать? Если нужно поменять историю действий сотрудника? Для чего делается денормализация? В случае денормализации нам нужно, чтобы у каждого сотрудника была только одна строка, вместе с историей. Как сделать? Нужна выжимка всех действий сотрудника в одну строчку&lt;/h3&gt;

 &lt;h3&gt;79. Есть таблица банковской БД. Две колонки: номер счета, значение на счету (сколько денег). Множество клиентов пытаются проводить много операций: кладут деньги на счет, снимают деньги со счета. Какие проблемы в БД могут быть? Почему? Какой уровень изоляции транзакций вы бы применили?&lt;/h3&gt;

 &lt;h3&gt;80. Есть маленькая таблица на 10 записей, у нее есть индекс. Будет ли анализатор использовать индекс? Почему? На основании чего анализатор посчитает, что Full Scan быстрее, чем Index Scan?&lt;/h3&gt;

 &lt;h3&gt;81. В Postgres была таблица на 1000 записей. Я удалил 1000 записей. У меня места на диске стало больше или меньше?&lt;/h3&gt;

 &lt;h3&gt;82. Объект находится в Persistence Context. Ты вытащил его с помощью findById(). И ты поменял что-то в объекте. В какой момент изменения будут сливаться в БД? Если знаешь, расскажи архитектуру Hibernate более детально&lt;/h3&gt;

 &lt;h3&gt;83. Используем JPA репозитории. Ты вытаскиваешь из одного репозитория, объект из БД с помощью findById() и делаешь в объекте изменения. Следующей командой с помощью findById() достаешь вторую сущность из второго репозитория. Что будет происходить с первой сущностью, которую ты уже изменил? Пример: есть два репозитория: repo1, repo2. Сначала entity1 = repo1.findById(id1); entity1.setMyValue(n); Потом entity2 = repo2.findById(id2); Какие запросы к БД будут сгенерированы под капотом?&lt;/h3&gt;

 &lt;h3&gt;84. Many-to-many связь. Есть сущность книга, есть сущность автор. Между ними связь many-to-many. Книга содержит коллекцию авторов, а автор содержит коллекцию книг. Какие типы Collections использовать? Что делать с equals() и hashCode(), если ты реализуешь эту ситуацию и используешь Set для коллекций авторов, коллекций книг? И здесь же ситуация с LazyInitializationException&lt;/h3&gt;

 &lt;h3&gt;85. Postgres. Есть система, которая занимается обработкой чего-то. Есть табличка, в ней ОЧЕНЬ много записей. У каждой записи есть статус. Модель изменения статуса линейная: &amp;ldquo;новая&amp;rdquo;, &amp;ldquo;в обработке&amp;rdquo;, &amp;ldquo;завершено&amp;rdquo;. Как оптимально быстро получить список еще незавершенных задач (которые не в статусе &amp;ldquo;завершено&amp;rdquo;)? Какие здесь есть проблемы? Как их решить? Как будешь реализовывать атомарность изменений при дублировании?&lt;/h3&gt;

 &lt;h3&gt;86. Есть сущность status. В Java это enum. Какой тип задашь полю status в таблице БД при проектировании? Почему?&lt;/h3&gt;

 &lt;h3&gt;87. На проде таблица с 1 Тб данных логов. Надо удалить все данные в этой таблице. Как сделаешь?&lt;/h3&gt;

 &lt;h3&gt;88. Нужно удалить из таблицы все данные, которые старше 3 мес. И теперь каждый месяц нужно удалять данные, которые старше 3 мес. Как?&lt;/h3&gt;

 &lt;h3&gt;89. В Hibernate в параметрах стоит lazy. Я делаю обращение к коллекции, идет еще один запрос в БД. Почему я словлю ошибку?&lt;/h3&gt;

 &lt;h3&gt;90. JPA или Hibernate. Есть сущность Заказы. У нее есть связь 1-to-many Товары для Заказа. Я хочу сделать эндпоинт, который достает большой список с Заказами и показывает их сразу с Товарами. Я делаю репозиторий и делаю findAll() по Заказам. Все ли хорошо? Какая проблема есть? Что поправить?&lt;/h3&gt;

 &lt;h3&gt;91. JPA, Hiber. Есть Заказы и я хочу по-всякому их фильтровать. На фронте есть фильтры: по имени, по заказчику, по сумме. Должен быть 1 эндпоинт. Как решить?&lt;/h3&gt;

 &lt;h3&gt;92. Как заставить Hibernate проделать оптимистическую блокировку?&lt;/h3&gt;

 &lt;h3&gt;93. БД, параллельный доступ к данным. Есть таблица, в ней строка, в которой поле isExecuted. Мы должны вычитать таски и написать лог. У нас есть 10 pod-ов, которые смотрят на эту таблицу по шедуллеру и каждые 10 сек делают SELECT. От коллеги разраба ты видишь pull request нативного запроса: SELECT * FROM table WHERE isExecuted=0. Что об этом думаешь? Какие проблемы могут быть? Если используешь ShedLock, создается прокси-таблица. И мы понимаем, что задач дофига. На проме должно работать за 1 сек большая пачка запросов. Очень интенсивная параллельная работа с таблицей. И с ShedLock теряем горизонтальную масштабируемость, завязаны на узкое горлышко в 1 pod. Что еще предложишь для масштабирования?&lt;/h3&gt;

 &lt;h3&gt;94. На UI есть таблица с пагинацией, сортировкой, фильтрацией. Мы реализовали всю логику. Это очень большой объем данных, идет на миллионы строк. Отображаем по 20 строк. Генерируется запрос SELECT &amp;hellip; FROM &amp;hellip; WHERE &amp;hellip; LIMIT 20 OFFSET &amp;hellip; Какие проблемы видишь в LIMIT, OFFSET конструкции? Spring нам сгенерировал, вроде работает норм. Если OFFSET 100000 LIMIT 10 ? Что будет сделано 100000 раз?Мы говорим базе: иди на 100000 строчку и возьми 10 значений. Как БД перемещается на строчку 100000? На чем индекс построен здесь? Как мы можем проиндексировать номера строк?&lt;/h3&gt;

 &lt;h3&gt;95. Как Postgres работает с данными в таблице: если мы UPDATE поле, то Postgres прямо идет в таблицу и меняет поле? Или что-то хитрее происходит?&lt;/h3&gt;

 &lt;h3&gt;96. Если чтений одной и той же записи на порядки больше, чем вставок, и БД говорит, что слишком много чтений, не вывозит, какие варианты разгрузить БД есть?&lt;/h3&gt;

 &lt;h3&gt;97. Есть таблица всего с одной ячейкой, в которой записано значение 1. Есть транзакция, в которой сначала Read, потом Update +1 значение в таблице, и Commit транзакции. Приложение многопоточное. Вторая транзакция начинается по времени где-то между Read и Update первой транзакции. Вторая транзакция делает Read где-то после Update и Commit первой транзакции. Вторая транзакция делает Update+1, после Commit первой транзакции (см рисунок в видео). Когда закоммитится вторая транзакция, какое число получится в ячейке таблицы в конце?&lt;/h3&gt;

 &lt;h3&gt;98. Есть таблица, есть поле. Две транзакции. Уровень Repeatable read. Одна транзакция запросила, другая поменяла, в рамках первой транзакции запросили снова и получили тоже самое - не поменянное.&lt;/h3&gt;

 &lt;h3&gt;99. Уровень Repeatable read. Есть поле и две транзакции. Транзакции одновременно стартанули. В рамках одной транзакции добавляется +10. Одна транзакция завершилась раньше, другая позже. Какое будет итоговое значение?&lt;/h3&gt;

 &lt;h3&gt;100. У нас может индекс создаваться по несколькими полям, если я сделаю индекс по полям &amp;ldquo;а&amp;rdquo; и &amp;ldquo;b&amp;rdquo; BTREE индекс и сделаю запрос по полю &amp;ldquo;а&amp;rdquo;, отработает индекс или нет?&lt;/h3&gt;

 &lt;h3&gt;101. Liquibase. You created a changeset? It can be executed from dev stage. But then you find a typo in a column name. How would you fix it?&lt;/h3&gt;

 &lt;h3&gt;102. Я вызываю список, в нем настроено 1-to-many, есть проблемы с вытягиванием этих Entit-ей. Какие проблемы? Как их можно решать?&lt;/h3&gt;

 &lt;h3&gt;103. Таблицы users и addresses. Сделал FETCH JOIN, и тогда user-ы размножатся на количество address-ов у этого user-а. Как FETCH JOIN происходит? FETCH JOIN потом соединяет user-ов c addres-ами. А если у меня много 1-to-many? Кроме связи user с address, есть еще связь user с заказом. И я напишу два FETCH JOIN, есть ли в этом подводные камни?&lt;/h3&gt;

 &lt;h3&gt;104. Postgres заблокирует строчки двух таблиц (Person и City). Есть идеи, как указать Postgres, что нужно заблокировать только строчку в Person таблице?&lt;/h3&gt;

 &lt;h3&gt;105. У меня сущность, которая имеет два атрибута, и оба они списки. Может ли Entity Graph сразу две коллекции загрузить?&lt;/h3&gt;

 &lt;h3&gt;106. SQL, пагинация. Как написать такой один SQL запрос для пагинации, чтобы общее количество записей тоже вернулось? SELECT * FROM table &amp;hellip; LIMIT OFFSET. А что еще туда добавить?&lt;/h3&gt;

 &lt;h3&gt;107. У тебя есть сервис, который что-то выгружает за сутки из таблицы. Представь, что таблица разрослась до десятков миллионов записей. Твой запрос стал работать медленно. Что можно сделать для решения этой проблемы?&lt;/h3&gt;

 &lt;h3&gt;108. Представьте, что в момент времени прилетает два апдейта последовательно. У одного апдейта, при балансе в 100р идет вычет 60р, а у второго 90р. Что на уровне БД можно сделать?&lt;/h3&gt;

 &lt;h3&gt;109. У тебя есть приложение, которое делает insert в базу, при это ты должен выстроить insert&amp;rsquo;ы таким образом, чтобы один insert шел за другим. Как это можно выстроить?&lt;/h3&gt;

 &lt;h3&gt;110. В банках часто используется таблица курсов валют. Валюты могут сыпаться из разных мест. Евро из Мосбиржы, доллар из центробанка. Источников может быть много. Нам нужно на каждый запрос получать последний курс валют. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;111. Допустим у нас есть большая жирная таблица. В таблице очень много данных. Это аналитическая таблица, значит в нее данные постоянно дописываются, а чтение происходит редко. Представь что приходит DBA и говорит, что на жестком диске заканчивается место. Удалите что нибудь. Что нужно делать? Сходили к бизнесу и узнали, что его интересуют данные за последние 30 дней, а все что старше нас не интересуются. Что будешь делать?&lt;/h3&gt;

 &lt;h3&gt;112. Сделали свое приложение. Бизнес доволен, клиенты покупают в нашем магазине вещи. В какой то момент к нам приходит бизнес и говорит, что хочет увидеть какое количество раз пользователи заходят в корзину. Снять метрики. На фронте мы не можем такое делать. На беке было бы классно поставить Прометей или Графану и визуализировать, но у нас нет денег на это. Пришли к тому, что можем считать статистику и хранить ее в базе. Приняли решение значение счетчика складывать в отдельную таблицу в которой есть отдельная колонка в которой есть значение счетчика. Учитывая, что у нас микросервисная архитектура. Каким образом ты будешь решать эту задачу, чтобы не потерять значение счетчика. Счетчик должен отображать ровно то значение, сколько раз пользователь заходил в корзину.&lt;/h3&gt;

 &lt;h3&gt;113. Допустим у нас уровень изоляции repeatable read. Есть две транзации которые вычитывают данные. Вторая транзакция уже поменяла данные, первая еще не закончила. Что будет?&lt;/h3&gt;

 &lt;h3&gt;114. Если я в каждом классе и слое начиная от Контроллера буду писать аннотацию Transactional сколько транзакций будет?&lt;/h3&gt;

 &lt;h3&gt;115. Вытащил сущность из БД. Поработал с ней, поменял ее. Транзакция открыта. Как мне сохранить сущность?&lt;/h3&gt;

 &lt;h3&gt;116. Как можно удалить все данные из таблицы?&lt;/h3&gt;

 &lt;h3&gt;117. Чем отличается в SQL COUNT(*) и COUNT(column)? Что лучше использовать?&lt;/h3&gt;

 &lt;h3&gt;118. Вы используете Hibernate, у Вас две таблицы. Одна ссылается на другую. Что Вы делали с точки зрения Hibernate и с точки зрения БД?&lt;/h3&gt;

 &lt;h3&gt;119. У вас две таблицы в БД - две сущности в Hibernate. Есть внешний ключ. С точки зрения Hibernate его нет, а в БД вы его делали?&lt;/h3&gt;

 &lt;h3&gt;120. Hibernate, EntityGraph. Есть бизнес модель: есть книжка. У книжки есть жанры и авторы. Связи many-to-many. У книжки может быть много жанров и много авторов. У жанра много книг. У автора много книг. Я делаю EntityGraph и прошу, чтобы загрузили все книжки с авторами и жанрами. К чему это приведет?&lt;/h3&gt;

 &lt;h3&gt;121. У нас книжный магаз. Есть книги и их цены. Мы три раза меняли цены у книг. Сколько записей будет в БД?&lt;/h3&gt;

 &lt;h3&gt;122. Хотим реализовать паттерн Transactional Outbox. Есть табличка событий, которые хотим отправить куда-то (в Kafka, например). В таблице есть столбик, где написано, отправили, или не отправили уже событие. Почти все события отправлены, имеют True в столбике. Каждый раз мы хотим доставать те, которые не отправились еще. Как быстро доставать такие записи? Как создать индекс удачно?&lt;/h3&gt;

 &lt;h3&gt;123. Индексы по нескольким полям. Есть поля x, y, z. Они используются в нашем составном индексе. Есть запрос с WHERE y = 1, z = 2. Будет ли планировщик использовать наш индекс?&lt;/h3&gt;

 &lt;h3&gt;124. Есть 1 млрд записей. На колонку гендер (только 2 пола) нужно ли вешать индекс? В плане скорости&lt;/h3&gt;

 &lt;h3&gt;125. Решили разбить на партиции таблицу, как будет организовано дерево индекса? Что значит разделение таблицы на партиции?&lt;/h3&gt;

 &lt;h3&gt;126. Консистентность БД. Есть больница, в ней есть доктора. В одну смену должно быть минимум 1 доктор. Сейчас в какой-то смене находятся 2 доктора, оба хотят взять отгул, друг о друге не знают. Оба одновременно запрашивают в системе: сколько докторов в смене. Одновременно каждый увидел, что 2 доктора в этой смене. Каждый из них нажал кнопку: Взять отгул. Получается так, что ни одного доктора на смене не останется, хотя в системе есть проверка на минимум 1 доктора.&lt;/h3&gt;

 &lt;h3&gt;127. У нас дана таблица city. К базе у нас подключаются два пользователя. Пользователи заметили ошибку в коде города. Две параллельные транзакции. Первый пользователь выполняет UPDATE. Второй пользователь в этот момент выполняет SELECT. Что будет в результате выполнения запросов?&lt;/h3&gt;

 &lt;h3&gt;128. У нас две таблицы и все строки совпали. В левой таблице пять записей, в правой пять записей. Сколько у нас будет всего записей, результирующей выборки с помощью JOIN&lt;/h3&gt;

 &lt;h3&gt;129. Таблица в БД. В ней одно поле целочисленное. Как нам SQL запросом найте первое пропущенное число? Найти с помощью селекта. 1, 2, 3, 5, 6&lt;/h3&gt;

 &lt;h3&gt;130. Банковская система. У нас есть деньги. К примеру рубли. Два разряда. С ними происходят операции. Какие могут быть проблемы? Например надо считать НДС и нельзя ничего потерять. Как сделать так, чтобы не округлялись. Считать в целочисленном виде или с плавующей точкой?&lt;/h3&gt;

 &lt;h3&gt;131. Есть документ. К него есть поля. От класса документ есть наследники. Как это будет выглядеть в БД?&lt;/h3&gt;

 &lt;h3&gt;132. Написал скрипт в Liquibase, он выполнился и теперь мне нужно поправить этот скрипт. Что мне сделать?&lt;/h3&gt;

 &lt;h3&gt;133. Если взять ютуб, там есть просмотр аудитории своей. И можно выбрать пол. И ютуб как-то ускоряет выборку по полу. Что там есть, как думаешь?&lt;/h3&gt;

 &lt;h3&gt;134. Есть селективный эндпоинт. Рост производительности, на селективном эндпоинте низкий перформанс. Как исправить? Навесили индексы, но не хватает производительности, что еще делать?&lt;/h3&gt;

 &lt;h3&gt;135. У меня 10 селектов и 2 пула. Как будет отрабатывать?&lt;/h3&gt;

 &lt;h3&gt;136. Нужно написать запрос к БД. Как ты это сделаешь в коде? У тебя есть сервис и тебе надо получить список машин. Как ты это напишешь в коде?&lt;/h3&gt;

 &lt;h3&gt;137. Идет релиз. В релизе есть миграция. Выпускаем релиз на прод, идет проверка и оказалось, что все плохо. Релиз надо откатить. Миграцию уже накатили и их тоже надо откатить.&lt;/h3&gt;

 &lt;h3&gt;138. В одной транзакции сделан SELECT FOR UPDATE, транзакция еще исполняется, а в другой параллельной транзакции хотим прочитать эту строку. Что будет?&lt;/h3&gt;

 &lt;h3&gt;139. Есть метод получения всех машин. Мы его можем закешировать. А есть метод, который говорит получи все машины и сделай что-то. Когда стоит кешировать, а когда нет?&lt;/h3&gt;

 &lt;h3&gt;140. В процессе Redis происходит сериализация, а в обратном происходит десериализация данных. Может возникнуть проблема, когда в кеше находится значение, а мы в коде этот объект изменили. Мы запрашиваем кеш, он приходит и у нас ошибка. С чем связана эта ошибка?&lt;/h3&gt;

 &lt;h3&gt;141. У человека в банке есть баланс. 100 рублей. Так получилось, что он одновременно переводит себя 10 рублей из другого банка. Два перевода по 10 рублей. Сколько рублей будет на балансе?&lt;/h3&gt;

 &lt;h3&gt;142. Есть таблица пользователей, в ней два пользователя и таблица баланса. В таблице баланса только один пользователь. Мы делаем INNER JOIN. Какой набор данных мы получим и сколько строк будет?&lt;/h3&gt;

 &lt;h3&gt;143. Приложение в проде крутится, все хорошо. Но пошли ситуации, что по timeout отваливаемся. Фрон ходит на бэк долго. Есть запрос в БД, он очень долгий. Как искать ошибку?&lt;/h3&gt;

 &lt;h3&gt;144. Если одна транзакция Serializable запустилась, что-то делает. И запустилась вторая транзакция, тоже что-то делает. Что случится с ними? Фактически они не в очередь выстраиваются?&lt;/h3&gt;

 &lt;h3&gt;145. Ты поставил Eager, и грузишь id-шники пользователей из одной таблицы, и список комментариев из другой таблицы так же по одному пользователю&lt;/h3&gt;

 &lt;h3&gt;146. Приложение ищет записи по ключу, id. Этот запрос будет лучше работать при партицировании?&lt;/h3&gt;

 &lt;h3&gt;147. Запрос по статусам и мы добавили селект ограничение по времени, но с одной стороны. Запрос будет сканить одну партицию или не одну? Партиционирование по неделям&lt;/h3&gt;</description></item><item><title>Web</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B8-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/web/</guid><description>&lt;h2 id="web"&gt;
 Web
 &lt;a class="anchor" href="#web"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-rest"&gt;1. REST &lt;a href="#1-rest" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;em&gt;REST&lt;/em&gt; - это архитектурный стиль взаимодействия клиент-серверного WEB-приложения. Клиент-сервер общаются через протокол HTTP (HTTPs), а формат данных - JSON (XML).&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-restful-и-restless"&gt;2. RESTful и RESTless &lt;a href="#2-restful-%d0%b8-restless" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;em&gt;RESTful&lt;/em&gt; строго следует принципам REST, используя стандартные методы HTTP и четко структурированные URL, а &lt;em&gt;RESTless&lt;/em&gt; нарушает эти принципы, делая взаимодействие менее стандартным и гибким&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-rest-vs-soap"&gt;3. REST vs SOAP &lt;a href="#3-rest-vs-soap" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;&lt;em&gt;SOAP&lt;/em&gt; и &lt;em&gt;REST&lt;/em&gt; – это два разных подхода к разработке API. Подход SOAP отличается высокой степенью структурированности и использует формат данных XML. REST более гибкий и позволяет приложениям обмениваться данными в нескольких форматах.&lt;/p&gt;</description></item><item><title>Дженерики</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/generics/</guid><description>&lt;h2 id="дженерики"&gt;
 Дженерики
 &lt;a class="anchor" href="#%d0%b4%d0%b6%d0%b5%d0%bd%d0%b5%d1%80%d0%b8%d0%ba%d0%b8"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-дженерики-для-чего-нужны"&gt;1. Что такое дженерики? Для чего нужны? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%b4%d0%b6%d0%b5%d0%bd%d0%b5%d1%80%d0%b8%d0%ba%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Дженерики - параметризованные типы в Java&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Что это? Позволяют создавать классы, интерфейсы и методы с типами, заданными как параметры&lt;/li&gt;
&lt;li&gt;Зачем нужны? Позволяют использовать один класс для разных типов данных (&lt;code&gt;List&amp;lt;String&amp;gt;&lt;/code&gt;, &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Набор 
 &lt;a href="https://docs.oracle.com/javase/tutorial/java/generics/types.html"&gt;рекомендаций&lt;/a&gt; от Oracle о том, когда какие обозначения лучше использовать в дженериках:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt; — element, для элементов параметризованных коллекций;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K&lt;/strong&gt; — key, для ключей map-структур;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V&lt;/strong&gt; — value, для значений map-структур;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&lt;/strong&gt; — number, для чисел;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T&lt;/strong&gt; — type, для обозначения типа параметра в произвольных классах;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S, U, V&lt;/strong&gt; и так далее — применяются, когда в дженерик-классе несколько параметров.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</description></item><item><title>Лайвкодинг</title><link>https://krios2146.github.io/java-backend-interview-prep/livecoding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/livecoding/</guid><description>&lt;h1 id="лайвкодинг"&gt;
 Лайвкодинг
 &lt;a class="anchor" href="#%d0%bb%d0%b0%d0%b9%d0%b2%d0%ba%d0%be%d0%b4%d0%b8%d0%bd%d0%b3"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;
&lt;h3 id="1-java"&gt;
 1. 
 &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-java/"&gt;Java&lt;/a&gt;
 &lt;a class="anchor" href="#1-java"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;hr&gt;
&lt;h3 id="2-sql"&gt;
 2. 
 &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-sql/"&gt;SQL&lt;/a&gt;
 &lt;a class="anchor" href="#2-sql"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;hr&gt;
&lt;h3 id="3-stream-api"&gt;
 3. 
 &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-stream/"&gt;Stream API&lt;/a&gt;
 &lt;a class="anchor" href="#3-stream-api"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;hr&gt;</description></item><item><title>Spring Framework</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/spring-framework/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/spring-framework/</guid><description>&lt;h1&gt;Spring Framework&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Есть Spring Boot Application, он собрался. Запускаешь получившийся jar-ник. Он падает с Runtime Exception - не может внедрить зависимости: 2 кандидата на внедрение в какое-то место. Из-за чего такое может произойти? Как решить?&lt;/h3&gt;

 &lt;h3&gt;2. Есть класс-сервис. Внутри 2 метода. Оба public, @Transactional. Первый метод внутри обращается ко второму. Инжектим класс из другого класса и обращаемся к первому методу. Будет ли второй метод транзакционным? После. бираем транзакцию у первого метода. Делаем такое же обращение через первый метод. Через 10 минут демо, надо, чтобы второй метод стал транзакционным&lt;/h3&gt;

 &lt;h3&gt;3. Можем ли мы создать несколько синглтонов, которые будут имплемитировать один и тот же класс, но будут разные параметры?&lt;/h3&gt;

 &lt;h3&gt;4. Подключаю Spring Boot Application, делаю Maven parent SpringBoot и подключаю SpringBootStarter. Веб появляется?&lt;/h3&gt;

 &lt;h3&gt;5. От стартеров абстрагируемся. Хотим сделать Spring Boot приложение. Ставим @SpringBootApplication public static void main. Передаешь класс, где main. Добавляешь зависимости, стартеры и все начинает работать. От момента, как прописал зависимости и поставил аннотацию - что происходит? - Что значит идет конфигурирование приложения?&lt;/h3&gt;

 &lt;h3&gt;6. Как поведёт себя запущенный проект на Spring без spring-boot-starter-web?&lt;/h3&gt;

 &lt;h3&gt;7. Есть метод который помеченный @Transactional, в середине нужно сохранить сохранить промежуточный результат в отдельную таблицу даже при исключении&lt;/h3&gt;

 &lt;h3&gt;8. Есть контроллер Singletone. Он торчит наружу своим API. Мы этот контроллер autowire-им в сервис. Сервис Prototype. User 10 раз дергает контроллер. Сколько будет создано сервисов?&lt;/h3&gt;

 &lt;h3&gt;9. У нас есть библиотека. В ней главный интерфейес movable. У него метод move() что-то двигает. У нас есть имплементация movableImpl() этого метода. Скомпилировали, собрали war, выложили на Nexus. Другой разраб берет нашу библиотеку, использует autowired куда-то себе, у него все работает. Менеджер попросил что-то у нас переделат. Мы решили сделать movableImpl2(), там имплементация того же интерфейса movable, который autowire-ид тот разраб у себя. Какие будут проблемы?&lt;/h3&gt;

 &lt;h3&gt;10. Junior developer повесил @Transactional так, что транзакция не открывается. Как он это сделал?&lt;/h3&gt;

 &lt;h3&gt;11. Есть аннотация, уже написана. Когда разраб помечает свой метод этой аннотацией, происходит логирование. Как реализовать такой функционал?&lt;/h3&gt;

 &lt;h3&gt;12. Приложение использует библиотеку. Библиотека реализует интерфейс. Есть две реализации бинов, одна в самой библиотеке, вторая в нашем приложении. Мы инжектим интерфейс. Как ведет себя Spring?&lt;/h3&gt;

 &lt;h3&gt;13. Есть интерфейс, который реализуют несколько классов. Я пытаюсь внедрять этот интерфейс куда-нибудь как Bean. Как Spring поймет, какую реализацию выбрать?&lt;/h3&gt;

 &lt;h3&gt;14. Один сервис отправил сообщение, что нужно сохранить несколько сущностей. Нужно сохранить всё или ничего. Как бы сделал процесс отката?&lt;/h3&gt;

 &lt;h3&gt;15. Представим что у нас есть Транзакционный метод. В нем вначале через репозиторий делаем findOne, потом изменяем ее через save и кидаем повторный запрос findOne. Сколько запросов к БД будет выполнено?&lt;/h3&gt;

 &lt;h3&gt;16. Приложение работает несколько суток, принимает HTTP трафик. Есть ли возможность в Spring закинуть туда бин, не рестартуя приложение?&lt;/h3&gt;

 &lt;h3&gt;17. Spring приложение, прикручена БД. Есть требование, что нельзя хранить login, password в Application Properties в открытом виде. Они там хранятся в зашифрованном виде. Как решить проблему, чтобы Spring расшифровывал их? Токен для расшифровки хранится на локальной машине&lt;/h3&gt;

 &lt;h3&gt;18. Создаем бины котрые реализовывают временный контейнер Файл. Файл, что то сохраняет и что то достает. Если закроем приложение то файл останется. Как уничтожить бин, для грамотного использования ресурсов.&lt;/h3&gt;

 &lt;h3&gt;19. Как создать несколько DataSource в спринг-приложении и управлять ими?&lt;/h3&gt;

 &lt;h3&gt;20. Если у нас есть несколько DataSource, создаются в нашем приложении два бина одного и того же типа. Место для инжекта только одно. Как разрулить ситуацию?&lt;/h3&gt;

 &lt;h3&gt;21. Если создаем в бине обращение к ресурсу. Нужно корректно закрыть ресурс. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;22. Есть standalone провайдер авторизации. KeyClock к примеру. Как сервис провалидирует этот токен?&lt;/h3&gt;

 &lt;h3&gt;23. Если я поменяю Service на Component. Что-то поменяется в приложении?&lt;/h3&gt;

 &lt;h3&gt;24. Можно миксовать конфигурации? Часть сделать аннотациями, а часть XML?&lt;/h3&gt;

 &lt;h3&gt;25. Что если надо заинжектить интерфейс, а у меня две реализации в Context&lt;/h3&gt;

 &lt;h3&gt;26. Есть Singleton Bean. Есть Request HTTP запрос. Нам надо из запроса получить хедеры и залогировать. Как можно это заинжектить? Есть ли готовые решения у Spring?&lt;/h3&gt;

 &lt;h3&gt;27. Что будет если на каждый запрос будет создавать новый ApplicationContext?&lt;/h3&gt;

 &lt;h3&gt;28. Что будет если будет исключение в PostConstruct&lt;/h3&gt;

 &lt;h3&gt;29. Используем SpringBootApplication, а используемые Бины лежат в библиотеке. Будут ли они подтягиваться автоматически?&lt;/h3&gt;

 &lt;h3&gt;30. Как без LAZY мы можем сделать ленивую загрузку бина?&lt;/h3&gt;

 &lt;h3&gt;31. Есть проект. В проекте есть Kafka и БД. Указываем параметры подключения к БД. Если у нас не указаны переменные в Application Properties для БД, то нам ДатаСоурс создавать не надо. Если у нас не указаны параметры application properties то нам Бин поднимать не надо. Как тогда сделать?&lt;/h3&gt;

 &lt;h3&gt;32. Если ловим OptimisticLockException, что делаем?&lt;/h3&gt;

 &lt;h3&gt;33. Есть самописная аннотация. Есть метод, который реализует определенный функционал. Как сделать так, чтобы когда мы ставили нашу самописную аннотацию вызывался наш метод с прописанным функционалом.&lt;/h3&gt;

 &lt;h3&gt;34. Проблема управления распределнной транзакцией. Какие есть подходы к решению?&lt;/h3&gt;

 &lt;h3&gt;35. Пишем интеграционный тест, который протестирует endpont, обращение в Сервис и БД. Как на Spring написать интеграционный тест?&lt;/h3&gt;

 &lt;h3&gt;36. Есть стартер и Application. В стартере определен бин датасоурс, который инжектиться аппликейшином и аппликатион с ним работает. Потом сделали вторую версию Стартера и в эту версию нужно добавить еще один бин такого же типа, чтобы в одном месте кода использовался один бин, в другом другой бин. Важно, чтобы бины были одного типа. Вопросы: 1. Как можно реализовать, чтобы использовать два бина с одинаковым типом. 2. Приложение не должно заметить изменений и должно продолжить использовать первый бин.&lt;/h3&gt;

 &lt;h3&gt;37. Есть Java интерфейс, который имплементируют два класса. На каждой имплементации висит @Service. Это корректно?&lt;/h3&gt;

 &lt;h3&gt;38. Когда подключаешь стартер, он подтягивает все зависимости. Если мне нужен стартер, но одна зависимость в нем не нужна. А переписывать стартер не хочется, что делать?&lt;/h3&gt;

 &lt;h3&gt;39. Если заменить Configuration на Component бины не будут создаваться?&lt;/h3&gt;

 &lt;h3&gt;40. Есть большое приложение. Много классов, контроллеров, сервисных слоев. В большую часть этих слоев инжектится бин, созданный из какого-то библиотечного класса, который мы менять не можем. Этот бин везде используем, он создан через Java конфигурацию. Теперь нам надо создать еще один такой же бин, но с другими параметрами. Хотим новый бин использовать в новом сервисе. А в старых местах должен инжектиться старый бин. Как это развязать? Хотим иметь два Singleton&lt;/h3&gt;

 &lt;h3&gt;41. Есть наша инфраструктурная аннотация, которая логирует Rest контроллеры (@RestLogger). Мы ее везде вешаем, но иногда забываем. Можно ли сделать, чтобы при старте приложения Spring сам проверил, что на всех классах, помеченных @RestController есть @RestLogger? И, если где-то не висит, то деплой падает с понятной ошибкой&lt;/h3&gt;

 &lt;h3&gt;42. Подключаешь старый проект через зависимости к своему проекту. Надо, чтобы все бины из старого проекта попали в Spring context. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;43. Две транзакции хотят обновить одну и туже строку. Что будет происходить?&lt;/h3&gt;

 &lt;h3&gt;44. Если первая транзакция захватила объект для изменения и изменила его. Вторая транзакция на этом объекте отработает? Какие проблемы будут? Ситуация гонки за данными&lt;/h3&gt;

 &lt;h3&gt;45. Как настроить зависимости бинов для разных сред разработки? Например нужно использовать две разные БД.&lt;/h3&gt;

 &lt;h3&gt;46. Как логировать бины при создании бинов? Если бинов больше сотни?&lt;/h3&gt;

 &lt;h3&gt;47. Почему дефолтным выбран Singleton? Кажется, что это не удобно, раз надо обращать внимание на что-то?&lt;/h3&gt;

 &lt;h3&gt;48. По всему проекту мы выбрасываем RuntimeExceptions и хотим в одном месте их ловить. Чем воспользоваться?&lt;/h3&gt;

 &lt;h3&gt;49. Каким инструментом можно гарантировать, чтобы scheduler работал только в master ноде? На уровне Spring приложения&lt;/h3&gt;

 &lt;h3&gt;50. Нормально ли в методе помеченном @Transactional кидать HTTP-запросы?&lt;/h3&gt;

 &lt;h3&gt;51. Мне нужно в программе, чтобы бин создавался при условии, что подключена определенная библиотека. Как это реализовать?&lt;/h3&gt;

 &lt;h3&gt;52. Ты подключаешь библиотеку и хочешь переопределить у этой библиотеки бин. Что для этого в библиотеке должно быть указано, чтобы ты смог это сделать? Как это возможно сделать?&lt;/h3&gt;

 &lt;h3&gt;53. Две транзакции хотят обновить одну и туже строку. Что будет происходить?&lt;/h3&gt;

 &lt;h3&gt;54. Есть 4 бина одного типа, мне нужно собрать их в одном месте. Как сделать?&lt;/h3&gt;

 &lt;h3&gt;55. У нас есть прокси. Он добавляет действие на все методы какого-то класса. Прокси должен логгировать все вызовы методов класса. Пусть в классе есть методы B, C. Оба публичные и помечены аннотацией, чтобы прокси их обрабатывал. Другой сервис вызывает метод B, а метод B вызывает метод C. Сколько в логах будет записей?&lt;/h3&gt;

 &lt;h3&gt;56. Есть сервис, в сервисе есть метод, который внутри себя вызывает метод репозитория. Над методом в сервисе я поставил @Transactional. И над методом в репозитории тоже поставил @Transactional. Вызвал метод сервиса, который внутри вызвал метод репозитория. Сколько транзакций откроется?&lt;/h3&gt;

 &lt;h3&gt;57. Есть ли отличия внутри Spring, если мы применяем @Autowired к интерфейсу или обычному классу? И отличия использования @Autowired внутри конструктора или просто в методе?&lt;/h3&gt;

 &lt;h3&gt;58. В контроллер пришел запрос из фронтенда и где-то в глубине сервиса упала ошибка. Хочется обработать ошибку и дать осмысленный ответ на фронтенд. Как это сделать средствами Spring?&lt;/h3&gt;

 &lt;h3&gt;59. У нас есть два контроллера. Они синглтоны. Туда инжектится сервис, который прототайп. Идут запросы в эти контроллеры, которые обращаются к сервису. Сколько экземпляров сервиса будет?&lt;/h3&gt;

 &lt;h3&gt;60. У нас есть бин A, который нужен в бине B и наоборот - в бине B нужен бин A. Как нам такое сделать?&lt;/h3&gt;

 &lt;h3&gt;61. Что Spring ищет с точки зрения Controller-а? Если мы хотим использовать @Component, что можно законфигурировать, чтобы Spring понял, что это Controller?&lt;/h3&gt;

 &lt;h3&gt;62. Есть транзакционный метод. Поняли, что хотим сделать его асинхронным. Что будет, если повесим на метод сразу две аннотации: @Transactional и @Async?&lt;/h3&gt;

 &lt;h3&gt;63. Есть сервис очень простой. Он читает из Kafka 2 числа. Считает сумму, складывает в Postgres. И отправляет в Kafka сообщение, что он сложил, результат записан в БД. Какие стартеры Spring Boot ты бы добавил для этого сервиса? Нужен ли Tomcat?&lt;/h3&gt;

 &lt;h3&gt;64. Создается бин, какой-то метод помечен @PostConstruct и мы вешаем над этим же методом @Transactional. Что произойдет? Создастся ли бин? Будет ли транзакция?&lt;/h3&gt;

 &lt;h3&gt;65. У нас есть интерфейс, есть две реализации его. Обе реализации одного интерфейса помечены @Component. При запуске приложения получаем ошибку, что Spring не знает, какой заинжектить. Как решить проблему?&lt;/h3&gt;

 &lt;h3&gt;66. Есть Spring Boot приложение, много зависимостей. Мы понимаем, что какой-то Spring Boot Starter нам мешает, он не прописан в Maven, он подтянулся из сторонней библиотеки. Что сделать, чтобы конкретный Spring Boot Starter не запускался? Какие варианты?&lt;/h3&gt;

 &lt;h3&gt;67. Есть класс, в нем методы a() и b(). Метод a() вызывает метод b(). На b() есть Spring аннотация любая. Будет ли аннотация работать?&lt;/h3&gt;

 &lt;h3&gt;68. Класс с @Transactional, есть public методы. Внутри одного public метода на какой-то строке код выбрасывает исключение. Что произойдет?&lt;/h3&gt;

 &lt;h3&gt;69. Над классом вешаю @Transactional. А потом внутри этого же класса над одним из public методов тоже вешаю @Transactional. Вызываем метод снаружи. Что происходит? Что происходит с остальными public методами этого класса?&lt;/h3&gt;

 &lt;h3&gt;70. Над методом висит @Transactional. В первой половине метода что-то делаем с БД (insert, update…), а во второй половине метода видим, что у нас отрицательный баланс, а такая ситуация недопустима. Можно ли откатить изменения?&lt;/h3&gt;

 &lt;h3&gt;71. У вас приложение и несколько баз данных. Можно ли в Spring Boot подключиться к двум разным базам? Как? Как настроить работу через JPA с двумя БД? Чтобы два репозитория было?&lt;/h3&gt;

 &lt;h3&gt;72. Есть метод @Transactional. Внутри него я вызываю другой метод тоже @Transactional. Как сделать вложенную транзакцию? Чтобы, если внутренний метод падал, то внешняя транзакция выполнилась бы всегда. Чтобы внешняя транзакция не откатывалась в этой ситуации. Что произойдет, когда попадаем во внутренний метод, помеченный @Transactional?&lt;/h3&gt;

 &lt;h3&gt;73. Можно ли в Singleton автоварить (autowir-ить) Prototype?&lt;/h3&gt;

 &lt;h3&gt;74. Есть Spring контекст, в котором живет два бина: Singleton и Prototype. У Prototype есть PreDestroy метод, из которого вываливается исключение. Мы пытаемся красиво закрыть Spring контекст. Удастся ли нам это сделать?&lt;/h3&gt;

 &lt;h3&gt;75. Как можно получить destroy callback бина? Например, использовать @PreDestroy. Как еще указать контексту, что какие-то методы надо вызвать при закрытии контекста?&lt;/h3&gt;

 &lt;h3&gt;76. Есть Singleton. Он раз в час требует новый инстанс Prototype бина, то есть при каждом вызове определенного метода нам нужен новый инстанс Prototype бина. Как поступишь?&lt;/h3&gt;

 &lt;h3&gt;77. Как создается Proxy в Spring? У тебя только main() и JDK 11. Напиши функцию, которая на вход принимает объект, а на выходе тот же объект, все методы которого модифицированы: в каждом методе сначала прописывается лог с названием этого метода&lt;/h3&gt;

 &lt;h3&gt;78. У нас есть бин синглтон Box, у которого зависимость прототип Color. Как сделать так, чтобы Box был всегда один и тот же, а Color всегда разным?&lt;/h3&gt;

 &lt;h3&gt;79. Механизм стартеров Spring. Иногда в application properties или в yaml файле пишем строчку cache=none, или другую имплементацию. И получаем какое-то поведение. Когда мы указываем cache=none, что происходит дальше с имплементацией этого cache manager? В pom-нике висит Spring Boot Starter, мы ожидаем, что все бины окажутся в контексте&lt;/h3&gt;

 &lt;h3&gt;80. В Spring мы пишем многопоточное Java приложение, но игнорируем многопоточность. С чем это связано? Как это работает?&lt;/h3&gt;

 &lt;h3&gt;81. У меня объявлен RestController, какой-то эндпоинт. И вызывается какой-то сервис. В сервисе я делаю разные хитрые валидации с расчетами. Если что-то не так я бросаю кастомный Exception: throw new MyCastomException. И вот, возникла ошибка. Если я ничего не настрою, будет 500 выходить. А я хочу настроить 400 Bad Request, и json с подробным описанием ошибки. Как это настроить в Spring?&lt;/h3&gt;

 &lt;h3&gt;82. Почему дефолтный GC не чистит бины в Spring?&lt;/h3&gt;

 &lt;h3&gt;83. Spring Security. Есть ли возможность настроить разные бранчи для определенной &amp;hellip; (слово не разобрать)? Идет жесткая страшная аутентификация. И у нас подключены актуаторы. Я хочу, чтобы эти актуаторы не были покрыты этой аутентификацией&lt;/h3&gt;

 &lt;h3&gt;84. Spring Security. Если в Spring Security один фильтр падает с ошибкой (настроено логирование), что при этом произойдет? Подумай логически, как работает FilterChain? Что нужно, чтобы запросы проходили, даже если возникают ошибки при логировании в фильтре FilterChain?&lt;/h3&gt;

 &lt;h3&gt;85. Порассуждай, если Singleton нарушает SOLID, может привести к Race Condition, почему в Spring сплошные Singleton?&lt;/h3&gt;

 &lt;h3&gt;86. У тебя есть три среды. test, dev, prod. Тебе нужно, чтобы программа вела себя по разному в каждой из этих сред. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;87. Есть Controller, в нем определен endpoint. Внутри сервис делает валидации и кидает кастомные ошибки. По умолчанию отдается 500-ая, а мы хотим красиво сделать, чтобы отдавал красивый 400-ый request, красиво json разложить. Как бы ты это настроил?&lt;/h3&gt;

 &lt;h3&gt;88. Есть типичная модель, RestController, Service Repository. У сервиса метод @Transactional. Как внутри Spring происходит превращение из декларативного в оперативный&lt;/h3&gt;

 &lt;h3&gt;89. У нас может быть реализовано множество интерфейсов с разными методами. Как спринг решит проблему проксирования?&lt;/h3&gt;

 &lt;h3&gt;90. Какие проблемы могут возникнуть если над классом стоит @Transactional?&lt;/h3&gt;

 &lt;h3&gt;91. У тебя есть бин в котором два метода. Метод один вызывает внутри себя метод два. Метод два обращается к БД. Метод два помечен @Cacheable. При вызове метода один у тебя обращение к БД идет в сто процентах из ста. Почему?&lt;/h3&gt;

 &lt;h3&gt;92. Если два конструктора нужна аннотация Autowired?&lt;/h3&gt;

 &lt;h3&gt;93. Является ли Spring Bean потокобезопасным? Как сделать Bean потокобезопасным? И можно ли?&lt;/h3&gt;

 &lt;h3&gt;94. Хотим что-то внедрить с помощью @Autowired. В каком порядке он начинает искать подходящий бин, который надо внедрить? С чего начинает сканировать? Какие этапы может проходить?&lt;/h3&gt;

 &lt;h3&gt;95. У нас огромная транзакция: 1.5 тыс строк. Где-то между нужно было вывести кусок кода из транзакции. Допустим, 300 строк в транзакции, следующие 5 вне транзакции, потом дальше снова в транзакции. Как можно это сделать?&lt;/h3&gt;

 &lt;h3&gt;96. У меня есть транзакция, внутри метода создаю новый thread и в нем делаю какую-то логику. Сохранится ли транзакция в этом thread&amp;rsquo;е?&lt;/h3&gt;

 &lt;h3&gt;97. Тебя попросили сделать аннотацию и сделать ее обработчик. Как ты будешь делать? На основании каких данных Spring решит, что этот класс с этим методом надо превратить в Proxy?&lt;/h3&gt;

 &lt;h3&gt;98. Ты разраб, должен написать свой Proxy для Transactional. Как реализуешь: открыть транзакцию, закрыть, сделать rollback? Аннотация висит на уровне сервиса. Оригинальный метод на уровне сервиса. Там никакого Hibernate нет. Может я вообще Elasticsearch прикрутил в качестве БД. Персистентностью может выступать любая дичь. Что у меня в реализации должно быть, чтобы эта штука не зависила от реальной моей персистентности?&lt;/h3&gt;

 &lt;h3&gt;99. JPA Repository. Есть UserRepository интерфейс. Делаю extends JPA Repository, и когда UserRepository в сервис свой инжекчу, вижу, что у меня появились методы save(), saveAll(), find(). Как это реализовано? Почему это срабатывает? Как именно Spring понимает, какие данные брать из БД? Под капотом?&lt;/h3&gt;

 &lt;h3&gt;100. Есть дефолтные методы save() и saveAll() из JPA Repository. Почему выгоднее использовать saveAll(), а не в цикле foreach использовать save(), если хотим сохранить коллекцию Entity?&lt;/h3&gt;

 &lt;h3&gt;101. Spring. Интерфейс, есть ряд реализаций. Как можно заинжектить коллекцию? И как там выстроить порядок имплементаций? Как получить имплементации в коллекции? Та же ситуация, по-другому. Есть абстракция, у нее есть несколько реализаций в виде компонентов. Нам нужно заинжектить все эти имплементации. Что сделать?&lt;/h3&gt;

 &lt;h3&gt;102. Тебе надо разработать сервис построения отчетов. Надо залезать в БД. Ты создаешь бин Repository для работы с БД. В чем разница, если ты бин создашь руками в классе, или ты его заавтоваеришь?&lt;/h3&gt;

 &lt;h3&gt;103. Есть твой сервис, есть репозиторий для работы с БД. Можем его через конструктор внедрит, или через setter, или через поле. С точки зрения использования репозитория в коде, будет ли разница? Ты постоянно пользуешься этим репозиторием&lt;/h3&gt;

 &lt;h3&gt;104. Ты решил сам написать прокси, которая будет обрабатывать транзакционную логику. Как бы ты писал?&lt;/h3&gt;

 &lt;h3&gt;105. Одна часть логики это получить значение из БД по id, а вторая это записать полученное значение. Делать это в разных транзакциях?&lt;/h3&gt;

 &lt;h3&gt;106. Мы взяли сервис на Spring Starter. Все прописали. Все оформили красиво. Почему Listener не работает?&lt;/h3&gt;

 &lt;h3&gt;107. Начитались умных учебников и понимаем как работает транзакции. Знаем как вызвать их в одном методе. Как убедиться, что вызываются две транзакции?&lt;/h3&gt;

 &lt;h3&gt;108. Приложение работает в проде. Нам сообщают, что пароль к БД поменялся. Как нам внедрить новый пароль?&lt;/h3&gt;

 &lt;h3&gt;109. Мы загрузили файл и транзакция откатилась. Когда у нас упирается физический носитель, который находится вне транзакционной модели БД. Как вы обрабатывали вещи, когда загрузили, а транзакция откатилась?&lt;/h3&gt;

 &lt;h3&gt;110. Есть сервисный класс. Есть ли смысл давать сервисному классу интерфейс?. Вариант 1: Есть просто класс DocumentService. Ms gовесили на него @Service и все везде инжектим. Вариант 2: Сначала создали интерфейс DocumentService, заимплементировали класс DocumentServiceSimple, и повесили @Service. Какие плюсы и минусы второго варианта?&lt;/h3&gt;

 &lt;h3&gt;111. Есть метод @Transactional. У него низкий перформанс. Посовещались, решили сделать его асинхронным. Можно ли навесить на метод кроме @Transactional еще и @Async?&lt;/h3&gt;

 &lt;h3&gt;112. Есть Сервис или Компонент, который Singletone, а в него загружаем Prototype, то когда мы будет внедрять родительский компонент в другие места, нам будет внутренний объект приходить новым всегда?&lt;/h3&gt;

 &lt;h3&gt;113. Если @Transactional весит одновременно и над классом и над методом, что будет? Как будет работать?&lt;/h3&gt;

 &lt;h3&gt;114. Хотим сделать свой BeanPostProcessor. Есть несколько стандартных методов. Какая у них очередность?&lt;/h3&gt;

 &lt;h3&gt;115. Если метод помечен Transactional и мы вызываем его через PostConstruct сработает ли транзакция?&lt;/h3&gt;

 &lt;h3&gt;116. В классе postConstruct прошел. Мы зашли в метод, который транзакционный и второй медот тоже транзакционный и мы вызываем из одного другой. Сколько транзакций будет?&lt;/h3&gt;

 &lt;h3&gt;117. Есть класс, который помечен @Configutation. Два метода внутри класса помечены @Bean. Если из одного метода вызываешь другой, будет таже история, что и с транзакциями или будет что-то другое?&lt;/h3&gt;

 &lt;h3&gt;118. Есть библиотека, в ней мы пишем свою конфигурацию. Есть основной проект в который включаем эту библиотеку. Что нужно сделать, чтобы эта конфигурация автоматически стартовала в нашем проекте?&lt;/h3&gt;

 &lt;h3&gt;119. У нас есть поток, который вызывает репозиторий. Репозиторий сохраняет что-то в базу. Т.е. в транзакции создается новый поток. Сколько будет транзакций?&lt;/h3&gt;

 &lt;h3&gt;120. У интерфейса 10 реализаций. Хочу в бине сразу поработать со всеми реализациями. Вызвать метод, который отработает у всех разных реализаций.&lt;/h3&gt;

 &lt;h3&gt;121. Мы указали Spring Boot Parent для Data JPA или для Security. Внутри аккумулируются несколько зависимостей. Можно провалиться через ctrl посмотреть их. Можно ли поменять версию внутри одной из зависимостей?&lt;/h3&gt;

 &lt;h3&gt;122. Приложение HelloWorld. Контроллер, сервис, репозиторий. Мы на сервис повесили @Transactional. Логику делаем: какой-то SELECT, обновить какие-то поля и сделать Save. Все работает. Высоконагруженное приложение, много вызовов по REST. Потом добавили в @Transactional метод вызов стороннего сервиса, который всегда нам возвращает результат, но стал тупить и дольше возвращать результат. Что может произойти в этом случае?&lt;/h3&gt;

 &lt;h3&gt;123. Без локов. Есть SELECT к БД. Метод приходит с фронта. Мы вызываем наш сервис. Обернули его в Transactional. Нужно сходить в 5 таблиц БД. Теоретически это можно сделать параллельно. Мы сделали ExecutorService, делаем там запросы в 5 репозиториев в потоках. В чем нюанс?&lt;/h3&gt;

 &lt;h3&gt;124. Есть набор справочников, которыми данные обогащаем. Справочники достаточно статичные. Храним их в БД. Мы хотим один раз из БД вытащить, у себя в словаре сохранить, потом использовать. Как это проще всего в Spring сделать?&lt;/h3&gt;

 &lt;h3&gt;125. Если у нас бин принимает значения null, его можно заинжектить?&lt;/h3&gt;

 &lt;h3&gt;126. Если несколько реализаций бина. @Primary и @Qualifier не прописаны, как поведет себя @Autowired?&lt;/h3&gt;

 &lt;h3&gt;127. Представь, что ты инжектишь к себе в Сервис Репозиторий. В поле написал Репозиторий, положил. Сверху Автовайред над полем. Сеттер к этому полю у тебя есть. Конструктор по умолчанию в Сервисе и ты хочешь вызвать через Конструктор Репозиторий и сделать getAll. Какие подводные камни?&lt;/h3&gt;</description></item><item><title>Миграции</title><link>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/migrations/</guid><description>&lt;h2 id="миграции"&gt;
 Миграции
 &lt;a class="anchor" href="#%d0%bc%d0%b8%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-liquibase-что-это-и-для-чего"&gt;1. Liquibase. Что это и для чего? &lt;a href="#1-liquibase-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;em&gt;Liquibase&lt;/em&gt; — это инструмент для управления миграциями базы данных, который помогает разработчикам и администраторам баз данных поддерживать синхронизацию структуры базы данных с кодом приложения. Liquibase позволяет версионировать изменения в базе данных, отслеживать их и автоматически применять при обновлениях.&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-какие-записи-создаёт-liquibase-во-время-миграции"&gt;2. Какие записи создаёт liquibase во время миграции? &lt;a href="#2-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b8-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%91%d1%82-liquibase-%d0%b2%d0%be-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%bc%d0%b8%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%b8" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Liquibase автоматически создаёт и использует несколько служебных таблиц для отслеживания состояния миграций в базе данных.&lt;/p&gt;</description></item><item><title>Функциональные интерфейсы</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/functional-interface/</guid><description>&lt;h2 id="функциональные-интерфейсы"&gt;
 Функциональные интерфейсы
 &lt;a class="anchor" href="#%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d1%8b"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-функциональный-интерфейс"&gt;1. Что такое функциональный интерфейс? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Функциональный интерфейс – интерфейс с одним абстрактным методом. Помимо одного абстрактного, может содержать любое количество статических и дефолтных методов.&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-для-чего-нужна-аннотация-functionalinterface"&gt;2. Для чего нужна аннотация @FunctionalInterface &lt;a href="#2-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d0%b0-%d0%b0%d0%bd%d0%bd%d0%be%d1%82%d0%b0%d1%86%d0%b8%d1%8f-functionalinterface" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;Для гарантии того, что интерфейс является функциональным. Она не даст создать еще один абстрактный метод&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="3-какие-встроенные-функциональные-интерфейсы-вы-знаете"&gt;3. Какие встроенные функциональные интерфейсы вы знаете? &lt;a href="#3-%d0%ba%d0%b0%d0%ba%d0%b8%d0%b5-%d0%b2%d1%81%d1%82%d1%80%d0%be%d0%b5%d0%bd%d0%bd%d1%8b%d0%b5-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d1%84%d0%b5%d0%b9%d1%81%d1%8b-%d0%b2%d1%8b-%d0%b7%d0%bd%d0%b0%d0%b5%d1%82%d0%b5" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt; – принимает объект типа T и проверяет соблюдение некоторого условия и возвращает результат типа Boolean&lt;/p&gt;</description></item><item><title>Kafka и брокеры сообщений</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/kafka-message-brokers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/kafka-message-brokers/</guid><description>&lt;h1&gt;Kafka и брокеры сообщений&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Со стороны consumer-а. Топик очень высоконагруженый. 8 партиций. Хотим масшрабироваться на стороне consumer-а, читать сообщения побыстрее. Какой способ? Чтобы читать сообщения с одной бизнес-логикой несколькими Spring-приложениями&lt;/h3&gt;

 &lt;h3&gt;2. Три машины в кафке и одна упала. Что с нашей инфой? Инфа постарадает?&lt;/h3&gt;

 &lt;h3&gt;3. Было 2 сервиса (producer, consumer), общались по Kafka. Consumer на каждое сообщение должен проходить большой процесс обогащения, поэтому стали копиться сообщения. Решили в двух pod-ах поднять consumer. Но второй pod не видит сообщений. В чем проблема?&lt;/h3&gt;

 &lt;h3&gt;4. Если у нас несколько брокеров как будут распологаться partition?&lt;/h3&gt;

 &lt;h3&gt;5. У нас есть n partition. Есть ли смысл настроить Spring приложение для увеличения partition?&lt;/h3&gt;

 &lt;h3&gt;6. Consumer group. 10 партиций и консьюмеры не справляются. Что делать?&lt;/h3&gt;

 &lt;h3&gt;7. Есть producer, consumer, consumer record. Consumer record несет в себе key-value. Есть топик, в нем 3 партиции. Мы продьюсим сообщения. Вкакую патртицию попадают сообщения? По каким принципам?&lt;/h3&gt;

 &lt;h3&gt;8. Топик и 3 партиции. Мы создаем одного consumer-a. К каким партициям прицепится consumer? - цепляется ко всем 3 партициям. Создаем еще одного consumera. С такой же group id. И цепляем его к такому же топику. Он тоже подцепится к этим трем партициям? - Kafka ребалансируется, один консьюмер получит 2 партиции, а второй консьюмер получит 1 партицию&lt;/h3&gt;

 &lt;h3&gt;9. Есть 5 консьюмеров. Хотим ими параллельно читать из Kafka, чтобы каждому доставались уникальные сообщения. Можно ли такого достичь?&lt;/h3&gt;

 &lt;h3&gt;10. Есть два сервиса, им нужно общаться между собой. Два топика. Что должно быть реализовано на сервисах?&lt;/h3&gt;

 &lt;h3&gt;11. Есть consumer group c одним consumer-ом и топик с одной партицией, есть задержка в чтении как можно исправить?&lt;/h3&gt;

 &lt;h3&gt;12. Есть брокер и сервис который отправляет в него сообщения. Нужно сделать чтобы сообщения отправлялись всегда даже при сбое, потере питания и т.д&lt;/h3&gt;

 &lt;h3&gt;13. Несколько микросервисов читают из одного топика. Как обеспечить, что один топик, один producer и 3 consumer-а, и все 3 гарантированно должны забрать одно и то же сообщение?&lt;/h3&gt;

 &lt;h3&gt;14. Возможно в Kafka послать сообщения так, чтобы они были получены в том же порядке, как отправлены?&lt;/h3&gt;

 &lt;h3&gt;15. Один сервис продуцирует сообщеня, по сути является продьюсером. Публикует результаты экзаменов учеников. Есть 3 системы, которые потребляют сообщения. Сколько нужно сделать Топиков и Партиций? Если сделаем 1 партицию, что случится? А если 10?&lt;/h3&gt;

 &lt;h3&gt;16. Возможно обрабатывать несколькими консьюмерами одну партицию?&lt;/h3&gt;

 &lt;h3&gt;17. Как на стороне консьюмера обрабатывать сообщения, чтобы не обрабатывать дубли?&lt;/h3&gt;

 &lt;h3&gt;18. Консьюмер отвалился, продьюсер есть, сообщения идут в топик. Консьюмеров на топике нет. Потеряются ли сообщения? Когда консьюмер поднимется, придут ли к нему пропущенные сообщения?&lt;/h3&gt;

 &lt;h3&gt;19. Consumer не существует. Топик существует, Продюсеры что-то туда откидывают. Создаю нового Консьюмера. Есть ли возможность получить все сообщения, которые были до этого? Скажем так, остались в этом Топике&lt;/h3&gt;

 &lt;h3&gt;20. Консьюмер подключился к Топику и считывает сообщения. В одном из сообщений вылетело необработанное исключение. Что будет с ним?&lt;/h3&gt;

 &lt;h3&gt;21. 1 продьюсер, 1 топик, 2 консьюмера. Продьюсер посылает ивент. Кто из консьюмеров получит ивент?&lt;/h3&gt;

 &lt;h3&gt;22. Что делать если у нас 1000 listener в kafka?&lt;/h3&gt;

 &lt;h3&gt;23. Есть топик. 2 партиции. Отправляем одно сообщение. Есть два потребителя. Есть два варианта. Первый, у них одна консьюмер группа. Второй, у них разные консьюмер группы. В каком случае оба микросервиса прочитают одно и тоже сообщение.&lt;/h3&gt;

 &lt;h3&gt;24. Что будет если консьюмеров будет больше чем партиций?&lt;/h3&gt;

 &lt;h3&gt;25. Что будет если партиций будет больше чем консьюмеров?&lt;/h3&gt;

 &lt;h3&gt;26. 1000 сообщений в секундку, как нам определить, что пришедший ответ из kafka тот, который нам нужен.&lt;/h3&gt;

 &lt;h3&gt;27. Можно в RabbitMQ послать сообщение напрямую или нужно вводить промежуточные сущности?&lt;/h3&gt;

 &lt;h3&gt;28. Как будет вести себя консьюмеры, если количество консьюмеров меньше чем количество партиций в топике? А если 10 Консьюмеров а Партиций пять. Как распределятся?&lt;/h3&gt;

 &lt;h3&gt;29. Несколько Consumer в группе читает из одного Топика. Какой то Consumer отказал. Нужно чтобы другой Consumer стал читать из Топика вместо отказавшего.&lt;/h3&gt;

 &lt;h3&gt;30. Есть Consumer зависает, какие последствия могут возникнуть?&lt;/h3&gt;

 &lt;h3&gt;31. Если два контейнера будут в одной сети, какие будут проблемы?&lt;/h3&gt;

 &lt;h3&gt;32. Есть однопоточный лиснер Kafk-и, но нужно параллельно обрабатывать то, что оттуда приходит. Как бы ты это сделал? Нельзя использовать батчевый лиснер Kafk-и&lt;/h3&gt;

 &lt;h3&gt;33. Нужно, чтобы один консьюмер всегда обрабатывал один и тот же тип сообщений. Как реализовать?&lt;/h3&gt;

 &lt;h3&gt;34. У нас 4 партиции и 4 консьюмера. Потом добавляется еще один Консьюмер. Что будет?&lt;/h3&gt;

 &lt;h3&gt;35. Два топика, три партиции, два консьюмера из одной группы. Как распределятся партиции по консьюмерам?&lt;/h3&gt;

 &lt;h3&gt;36. Что если выставил batch size условно 10 кб. В итоге рейт очень маленький. Пишешь по одному сообщению в минуту. Как это исправить?&lt;/h3&gt;

 &lt;h3&gt;37. Есть Консьюмер группа. 2 консьюмера читают из топика из 4 партиций. Что произойдет если один из консьюмеров в группе сдохнет?&lt;/h3&gt;

 &lt;h3&gt;38. Можно сделать, чтобы несколько консюмеров читали несколько партиций?&lt;/h3&gt;

 &lt;h3&gt;39. У тебя 3 партиции и 1 консюмер. В первую ты закидываешь миллион, во вторую тысячу сообщений, а в третью десять. Как будет происходить чтение этим консюмером?&lt;/h3&gt;

 &lt;h3&gt;40. K8s, контейнеризованное приложение. Есть Kafka топик, в нем 40 партиций. Есть сервис, поднят один под. Ты захотел сделать 5 подов. У всех 5 подов одна консьюмер группа. Все они подписаны на этот топик Kafka. Какой под из какой партиции будет читать?&lt;/h3&gt;

 &lt;h3&gt;41. Kafka. We have one topic. Producer produces temperature updates into topic. On the other side we want to have one app that reads temp updates and shows them. And second app that also reads the same temp updates and send the email. We want both apps to recieve all the updates. What should we do?&lt;/h3&gt;

 &lt;h3&gt;42. Kafka. What should you do if you want to create Load Balancer: we want to have 3-4 apps that can process tasks from one topic? Different apps should process different messages. How many partitions? How many consumer groups?&lt;/h3&gt;

 &lt;h3&gt;43. Kafka. Если нужно сделать паузу в Consumer Kafka, что использовать? Как остановить Consumer на 5 сек? Какие способы остановки потока знаешь? Какой будет хороший?&lt;/h3&gt;

 &lt;h3&gt;44. Kafka. В Consumer Group большой лаг. Как будешь исследовать проблему? В топике 1 млн невычитанных сообщений, и их количество только увеличивается&lt;/h3&gt;

 &lt;h3&gt;45. Есть топик, в который публикуется информация, которая нужна разным микросервисам. Если два микросервиса оба подключатся, как сделать так, чтобы каждое сообщение попало в каждый микросервис. Как правильно объединить или не объединять в консьюмер группу в этом случае?&lt;/h3&gt;

 &lt;h3&gt;46. Система публикует статусы заказа: создан, оплачен, еще что-то. Второй сервис принимает сообщения, у него консьюмер группа из двух консьюмеров, которые поделили партиции топика на себя. В продьюсере создали заказ, отправили сообщение - оно попало первому консьюмеру. Создали второе сообщение по этому же заказу - оно попало второму консьюмеру, который оказался быстрее, чем первый. И сообщения прочитались в неверном порядке. Как этого избежать?&lt;/h3&gt;

 &lt;h3&gt;47. У нас есть два сервиса, которые общаются по кафке. Один отправляет команду второму на запуск симуляции. Второй ее получил и ответил первому, что он получил команду и запустил симуляцию. Но произошла проблема с сетью и первый сервис не получил это сообщение, из-за чего повторно отправил команду второму на запуск симуляции. Как настроить все так, чтобы не происходил повторный запуск?&lt;/h3&gt;

 &lt;h3&gt;48. Есть два сервиса: serviceA, serviceB. serviceB занимается обработкой платежей, например, есть команда: переведи от Пети к Васе 100 руб. serviceA получает от пользователя запрос: переведи от Пети к Васе 100 руб. И serviceA отправляет через Kafka этот запрос в serviceB. Сервис важный, мы хотим, чтобы деньги переходили ровно один раз при одном запросе. Как обеспечить семантику обработки exactly once для этого взаимодействия между сервисами?&lt;/h3&gt;

 &lt;h3&gt;49. Есть топик, в него кто-то пишет. Есть два независимых микросервиса, которые не знают друг про друга. Они должны к топику подключиться. Как настроить микросервисы так, чтобы они не подворовывали друг у друга сообщения из топика?&lt;/h3&gt;

 &lt;h3&gt;50. Если видео ролики нельзя пережать до нужного размера. Какой может быть обходной вариант с пересылкой в Kafka?&lt;/h3&gt;

 &lt;h3&gt;51. Есть топик с 5 партициями. И есть consumer group с одним консьюмером. Как он будет читать топик? Все партиции? Только одну партицию? Мы используем subscribe&lt;/h3&gt;

 &lt;h3&gt;52. Консьюмеров стало 10 в одной consumer group. А партиций пять в топике. Как распределятся консьюмеры?&lt;/h3&gt;

 &lt;h3&gt;53. Есть два сервиса: serviceA, serviceB. serviceB занимается обработкой платежей, например, есть команда: переведи от Пети к Васе 100 руб. serviceA получает от пользователя запрос: переведи от Пети к Васе 100 руб. И serviceA отправляет через Kafka этот запрос в serviceB. Сервис важный, мы хотим, чтобы деньги переходили ровно один раз при одном запросе. Как обеспечить семантику обработки exactly once для этого взаимодействия между сервисами?&lt;/h3&gt;

 &lt;h3&gt;54. Много партиций, таски накидали. Мы их вычитываем консьюмерами. Хотим как можно больше консьюмеров добавить, чтобы они в параллель все больше вычитывали. В какой момент надо остановиться в количестве консьюмеров?&lt;/h3&gt;

 &lt;h3&gt;55. Есть 2 инстанса приложения, которые читают один и тот же топик. Один из инстансов это просто реплика, которая хочет получать те же самые сообщения, что и первый инстанс&lt;/h3&gt;

 &lt;h3&gt;56. Есть 1 продюсер, есть 1 консьюмер. Несколько партиций топика. Продюсер в некотором порядке записывает сообщения в топик. Гарантируется ли, что консьюмер вычитает в том же порядке?&lt;/h3&gt;

 &lt;h3&gt;57. В техническом стеке проекта Kafka и Postgres. Нам говорят, что мы не можем оставить Postgres, только Kafka. Как нам придумать решение, когда только в Kafka храним и состояние объектов, и реальные запросы. На сколько далеко можем продвинуться в использовании Kafka как БД? Какие механизмы Kafka нам помогут? Есть топик Kafka. Сервис накидал туда сообщений со счетами на оплату. Их кто-то может вычитать. Сообщения в Kafka не хранятся вечно. Состояние утеряно. Другие счета прилетели. Пользователей тоже храним, у них фамилии, статусы хранятся. Что делать? Увеличили время хранения сообщений в Kafka. Записи копятся, память сильно растет, когда-то точно закончится. Сущности часто меняются, в топике сто тыс состояний каждого пользователя. Что делать с историчностью, чтобы система не слегла? Нужно только несколько конечных состояний каждого пользователя&lt;/h3&gt;

 &lt;h3&gt;58. Работает брокер, в топике 3 партиции. Подняли 3 приложения (консьюмера). Поняли, что 3 приложения не справляются. Как не выключая ничего, добавить еще консьюмеров, чтобы они быстрее читали из топика? Какие есть возможности, чтобы 5 консьюмеров читали из 3 партиций?&lt;/h3&gt;

 &lt;h3&gt;59. Ты разрабатываешь консьюмера для системы с доставкой минимум 1 раз. Что он должен учитывать?&lt;/h3&gt;

 &lt;h3&gt;60. Может ли быть в Kafka такая проблема, что каждый раз при запуске приложения оно будет идти по всем опубликованным сообщениям с нуля? Если неправильно настроена гарантия доставки. А еще какие проблемы могут быть, что каждый перезапуск приложения заново читаются с нуля все сообщения?&lt;/h3&gt;

 &lt;h3&gt;61. Допустим в транзакции мы записали в outbox таблицу слушатель получил данные и отправил их в kafka соответственно он помечает что отправил и ему не удалось записать, потом сервис мы переподняли у него есть outbox он смотрит не доставленные сообщения видит это сообщение которое не пометил и заново доставляет разве это exactly once?&lt;/h3&gt;

 &lt;h3&gt;62. Одно и то же приложение ставится в два контура: промышленный и резервный. Нужно, чтобы каждый контур получал какое-то уведомление. Приложение одно и то же, читает одну и ту же Kafka. Что нужно сделать, чтобы оба контура получали уведомление?&lt;/h3&gt;

 &lt;h3&gt;63. Есть 5 партиций в топике. Мы вычитываем его каким-то сервисом и хотим максимально ускорить. Сначала сделали 1 consumer, поняли, что медленно, добавили второй consumer. До скольки consumer-ов имеет смысл увеличивать? Почему?&lt;/h3&gt;

 &lt;h3&gt;64. Продюсер один, он пишет сообщения в топик в каком-то порядке. Консьюмер один, читает сообщения. Партиций много. Гарантируется ли, что консьюмер будет сообщения в том же порядке, в каком продюсер пишет?&lt;/h3&gt;

 &lt;h3&gt;65. Есть несколько инстансов микросервиса. Они читают один и тот же топик. Какой механизм позволит избежать дублирования обработки сообщений из топика?&lt;/h3&gt;

 &lt;h3&gt;66. За счет чего происходит то, что каждый консьюмер находит свою партицию?&lt;/h3&gt;

 &lt;h3&gt;67. У тебя есть интегратор, который читает данные из Kafka. Он один. Поняли, что нас не устраивает скорость обработки данных и добавили еще пять экземпляров. Опиши, что произойдет. Поможет ли это нам? По умолчанию одна партиция.&lt;/h3&gt;

 &lt;h3&gt;68. С какой проблемой можем столкнуться. Если засунем в обработчик Kafka допустим, параллельную обработку. Многопоточность. Решили засунуть в метод чтения данных многопоточность&lt;/h3&gt;

 &lt;h3&gt;69. Со стороны Consumer ты вычитываешь сообщение, по сообщению тебе надо сходить, несколько интеграций сделать. Ты идешь в первую интеграцию, и получаешь ошибку. Что можно сделать, чтобы еще раз это сообщение обработать? Как это организовать? Как это в коде это сделать (сдвигать offset в Kafka назад)? Как автоматизировать? Читаешь сообщение, у нее идет 3 интеграции. Всегда есть шанс, что одна из интеграций приляжет&lt;/h3&gt;

 &lt;h3&gt;70. У тебя стоит @Listener, ты получил сообщение, десериализовал его в какой то объект. Что в этот момент сразу произошло в кафке?&lt;/h3&gt;

 &lt;h3&gt;71. В топик Kafka попадает 10 сообщений, из топика читают два консьюмера с разными консьюсер группами. Сколько сообщений считает каждый консьюмер. А если в одной консьюмер группе?&lt;/h3&gt;

 &lt;h3&gt;72. Настроили Kafka. Обмен пошел. Перегоняем JSON между сервисами. Потом я пришел и послал в этот топик String. Что будет?&lt;/h3&gt;

 &lt;h3&gt;73. Есть топик в нем пять партиций. Есть 10 слушателей у каждого топика. Каждый из них сможет прочитать?&lt;/h3&gt;

 &lt;h3&gt;74. Пусть у нас min.insync.replicas на топике 5, брокеров у нас 6. При этом настроим на consume&amp;rsquo;е acks=all. Что это будет означать?&lt;/h3&gt;

 &lt;h3&gt;75. Пусть у нас 10 партиций. Какое количество pod имело бы смысл масшатибровать горизонтально?&lt;/h3&gt;

 &lt;h3&gt;76. Есть PaymentService и TransactionHistoryService. После каждого проведения оплаты, тебе нужно передавать в Kafka информацию о транзакции. В TransactionHistoryService должен быть kafka-listner, который примет это сообщение и сохранит в БД. Нам нельзя терять информацию. Как бы ты реализовал гарантию доставки и гарантию обработки сообщений?&lt;/h3&gt;

 &lt;h3&gt;77. Есть один producer, он пулит сообщения в Kafka. Как сделать так, чтобы два разных сервиса прочитали сообщения из этого топика?&lt;/h3&gt;

 &lt;h3&gt;78. Есть топик, мы консьюмером что-то из него читаем. У нас микросервисы. Нагрузка увеличилась. Датчики стали много всего писать. Наш один консьюмер не справляется все вычитывать. Как в Kafka с этим справляются?&lt;/h3&gt;

 &lt;h3&gt;79. В outbox лежит запись, шедулер пытается отправить ее в Kafka. У нас лежит запись в базе. Мы отправляем событие в Kafka, запись в базу не прошла. Шедулер считает, что событие не отправлено, отправляем его повторно. Запись в БД проходит и мы считаем что событие отправлено. Получается, что в Kafka происходят два события, по одной и той же записью. Как это решить?&lt;/h3&gt;

 &lt;h3&gt;80. По организации топиков, консьюмеров. Есть 50 консьюмеров. Что нужно сделать, чтобы все консьюмеры что-то вычитывали с одного топика?&lt;/h3&gt;

 &lt;h3&gt;81. Есть 2 сервиса, которые параллельно обрабатывают одни и те же сообщения и пишут в разные места. Тогда сколько консьюмер групп?&lt;/h3&gt;

 &lt;h3&gt;82. Неблокирующую обработку в Kafka можно создать двумя способами. Какими?&lt;/h3&gt;

 &lt;h3&gt;83. Есть топики, есть партиции, допустим две. Каждая партиция это отделный набор сообщений по своим offset. В двух партиция может быть одинакой offset. Если для каждой консюмер группы хранить один offset на топик, то мы не знаем к какой партиции этот offset относится.&lt;/h3&gt;

 &lt;h3&gt;84. Есть пять топиков. Каждый из них считается отдельной Consumer Group. И мы в один топик добавляем еще одного Консюмера. Где будет происходить ребалансировка и что с чем?&lt;/h3&gt;

 &lt;h3&gt;85. Есть 3 брокера. Есть 3 партиций, или 6 партиций. За счет чего достигается отказоустойчивость?&lt;/h3&gt;

 &lt;h3&gt;86. Есть много реплик в Kafka. Мы хотим гарантировать сохранение сообщения, но не записывать на все реплики. Что сделать? В топике 100 партиций&lt;/h3&gt;

 &lt;h3&gt;87. У тебя есть сообщение с одним и тем же ключом. Ты можешь записать их в несколько партиций?&lt;/h3&gt;</description></item><item><title>Stream API</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/stream-api/</guid><description>&lt;h2 id="stream-api"&gt;
 Stream API
 &lt;a class="anchor" href="#stream-api"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-stream-api-и-для-чего-нужны-stream"&gt;1. Что такое Stream API и для чего нужны Stream? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-stream-api-%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b5%d0%b3%d0%be-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b-stream" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Представляет собой последовательность элементов, над которой можно производить различные операции. Его задача - упростить работу с наборами данных , в частности, упростить операции фильтрации, сортировки и другие манипуляции данными&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;С какими типами данных может работать?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Объектами&lt;/strong&gt; — &lt;code&gt;Stream&amp;lt;T&amp;gt;&lt;/code&gt;, где &lt;code&gt;T&lt;/code&gt; — любой ссылочный тип (например, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Integer&lt;/code&gt;, пользовательские классы).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Примитивами&lt;/strong&gt; — существуют специализированные стримы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IntStream&lt;/strong&gt; для работы с &lt;code&gt;int&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LongStream&lt;/strong&gt; для работы с &lt;code&gt;long&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DoubleStream&lt;/strong&gt; для работы с &lt;code&gt;double&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для других примитивов стримы не предусмотрены, их нужно упаковывать в объекты-обёртки (например, &lt;code&gt;Byte&lt;/code&gt; для &lt;code&gt;byte&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Микросервисы, REST, дизайн систем, деплой</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/microservices-system-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/microservices-system-design/</guid><description>&lt;h1&gt;Микросервисы, REST, дизайн систем, деплой&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Сервис в рамках транзакции сохранил в БД и должен еще записать в Kafka, но отключили свет. Как предусмотреть, что в БД закомичены данные, которые не дошли до конца?&lt;/h3&gt;

 &lt;h3&gt;2. Сервис закупок хранит количества остатка товара на складе. Пользователь выбирает товары в приложении и видит, сколько товаров осталось. Этот сервис проскалирован и используется кеширование для количества остатка товара. Какой кеш лучше локальный или распределенный? - Если сделаем локально, будут ли проблемы? - С другой стороне, если товар в одном экземпляре, у каждого клиента это записано. Что может случиться?&lt;/h3&gt;

 &lt;h3&gt;3. Стратегии деплоя. Сервис работает в проде, новый релиз с серьезным багом. Если такой релиз выкатим, а предыдущий убьем, будет больно. Какие более плавные подходы деплоя?&lt;/h3&gt;

 &lt;h3&gt;4. У тебя был монолит, билдился 40 минут. Если надо раскатить предыдущую версию, придется ждать 40 минут. Есть ли менее болезненные подходы?&lt;/h3&gt;

 &lt;h3&gt;5. Есть веб-сервис на Tomcat, Spring Boot. Ты написал Controller получения имени пользователя по id. За именем пользователя идешь в БД Postgres. Запускаешь этот сервис на одноядерной системе, ожидаешь нагрузку около 100 запросов в секунду. Будет ли это работать?&lt;/h3&gt;

 &lt;h3&gt;6. Одноядерная система. Запускаем сервер, но ручка вычисляет числа Фибоначчи. Что-то изменится? - Как это будет выглядеть со стороны метрик? - Со стороны пользователей это будет выглядеть так, что запрос очень долго выполняется? Что будет с CPU? На сколько он будет нагружен?&lt;/h3&gt;

 &lt;h3&gt;7. Нужно передать на сервер логин и пароль. Через что будем делать? Почему?&lt;/h3&gt;

 &lt;h3&gt;8. Есть сервис, который вызывает другой сервис по http. Мы используем RestTemplate или Feign Client. Мы должны взять метод, что-то сделать, обработать, в базу положить. И хотим весь процесс сделать асинхронным, чтобы метод не блочил систему. Как это реализовать?&lt;/h3&gt;

 &lt;h3&gt;9. Есть API, мы торчим наружу get запросом, с помощью которого туда передается команда. В рамках API выбираются очень большие данные, их нужно будет отправить в Kafka. За месяц накапливается 2 млн записей таблицы и их нужно выгрузить в Kafka. Какие подводные камни могут быть, если наружу торчим get запросом? На фронт нужно отправить количество записей&lt;/h3&gt;

 &lt;h3&gt;10. Одно и то же приложение нужно запустить в двух разных окружениях. Как это сделать проще всего?&lt;/h3&gt;

 &lt;h3&gt;11. Пишешь приложение, на локалке все работает, отдаешь в сборку. DevOps запускает на проде, там все падает, не подключается к БД, не подключается к Kafka. Что делать?&lt;/h3&gt;

 &lt;h3&gt;12. Хотим запускать приложение на нескольких стендах: dev, prod. Есть выбор: использовать Spring, либо собственную Статическую Фабрику. Где будет удобнее? Продолжение ситуации. Есть подключение к БД. В Абстрактной Фабрике есть конфиги, объекты, я сам создаю инстанс. На другом стенде придется создать другой класс с другими конфигами. И подкладывать нужный объект для каждого стенда. Как это в Spring реализовано?&lt;/h3&gt;

 &lt;h3&gt;13. Синхронизация микросервисов, чтобы только один микросервис отправил запрос, а остальные не отправляли. Есть монолит, есть Sheduled, который идет в БД, строит отчет, отправляет сообщение в Kafka. Если есть второй инстанс, то оба отправят в Kafka сообщение, а нам нужно только одно сообщение.&lt;/h3&gt;

 &lt;h3&gt;14. Один сервис вызывает другой сервис. Где может возникнуть задержка? На что обратить внимание, что бы уменьшить время задержки?&lt;/h3&gt;

 &lt;h3&gt;15. Работа с БД в микросервисах. Используем подход Database per Microservice. Как добиться той же ситуации, как с транзакциями?&lt;/h3&gt;

 &lt;h3&gt;16. Работает только синхронно и в диалоговом режиме. Посылает гет запрос и должен получить ответ. Сложность в том, что данные которые нужно получить собираются асинхронно. Как совместить асинхронность и синхронность?&lt;/h3&gt;

 &lt;h3&gt;17. Есть приложение, навешал туда Lock-ов, все работает четко. По бизнесу конфликтов нет. Начал горизонтально масштабировать свое приложение, и полезли проблемы. Почему Lock-и перестали спасать после горизонтального масштабирования? Горизонтальное масштабирование - приложение работало в одном экземпляре, стало в двух экземплярах работать&lt;/h3&gt;

 &lt;h3&gt;18. Есть запрос от клиента в какой-то из наших контроллеров, через что проходит запрос?&lt;/h3&gt;

 &lt;h3&gt;19. У тебя есть бизнес процессы, есть микросервисы. Микросервис отправки сообщений и микросервис бизнесс логики. Как ты будешь их интегрировать? Какой протокол и какую технологию выберешь?&lt;/h3&gt;

 &lt;h3&gt;20. Тебе запрещено работать с Kafka. Есть только REST. Микросервис который отвечает за работу оборудования. Он оставляет заявку сервису, который регистрирует и составляет расписание проверок. Как это реализовать по REST. Составление расписания раз в 8 часов&lt;/h3&gt;

 &lt;h3&gt;21. Внедрение гарантий доставки. Если мы добавляем запись в БД, то как проверять, что случилось с клиентом? Клиент тоже должен взаимодействовать с БД?&lt;/h3&gt;

 &lt;h3&gt;22. Есть сервис, который по эндпоинту обновляет что то в базе. В эндпоинт могут одновременно обратиться с разных мест. По умолчанию Spring boot может добавить в базу сразу два одинаковых запроса. В итоге мы ломаем логику. Как решить эту проблему?&lt;/h3&gt;

 &lt;h3&gt;23. У нас нет REST, пришел менеджер, хочет ввести REST. Точно ли нам надо, хорошо ли? Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;24. Как завернуть Java приложение в Docker? Есть JAR. Расскажи пошагово&lt;/h3&gt;

 &lt;h3&gt;25. Если у нас злоумышленник сворует рефреш токен, он не сможет получить новый access?&lt;/h3&gt;

 &lt;h3&gt;26. REST. Ты сделал Get запрос, как он получает данные? Что тебе надо сделать, чтобы получить определенные данные?&lt;/h3&gt;

 &lt;h3&gt;27. Есть старый монолит и новые микросервисы. Старую БД мигрировать не хотим. Если нагрузка повышается, то старый монолит начинает отказывать. Каскадно микросервисы начинают отключаться. Фронт отключился. Как сделать так, чтобы старый микросервис не особо влиял на текущую реализацию? Как выжить в периоды пиковой нагрузки?&amp;hellip;Продолжение ситуации. Circuit Breaker отрубил микросервис, хорошо все заработало. Но нас начали DDOS-ить. Реальные клиенты начинают получать timeout. Что делать?&lt;/h3&gt;

 &lt;h3&gt;28. Как написать интеграцию с другими сервисами? С чего начнешь?&lt;/h3&gt;

 &lt;h3&gt;29. Есть Сервис который принимет http запрос и этому Сервису нужно сходить в другой Сервис и принять от него запрос и передать первому Сервису. Запросы через Kafka в синхронном режиме. Код должен принять http запрос и дать синхронно ответ и в промежутке вызвать Kafka.&lt;/h3&gt;

 &lt;h3&gt;30. Банковское приложение. Есть несколько фронтендов. Браузерый и мобильный. Есть общее API. Есть общее ядро, которому все равно откуда приходят запросы. Фронтенды ожидают свои JSON.&lt;/h3&gt;

 &lt;h3&gt;31. Что сделать для создания endpoint для POST запроса?&lt;/h3&gt;

 &lt;h3&gt;32. В Сервисе есть обращение к Google api. Как сделать так, чтобы при тестах не отсылались запросы в сторонние сервисы?&lt;/h3&gt;

 &lt;h3&gt;33. Предположим, разработали микросервис на спринге и есть бизнес-логика по забору данных, есть &amp;ldquo;тонкое место&amp;rdquo;. Что делать будем, как решать проблему?&lt;/h3&gt;

 &lt;h3&gt;34. Есть бизнес, где функционал очень связан. Микросервис большой. Он может оставаться микросервисом? Или это уже монолит?&lt;/h3&gt;

 &lt;h3&gt;35. Есть сервис, который нужно протестировать. В сервисе есть внедрение стороннего компонента, хочу этому компоненту придать определенное поведение. Тест с какой аннотацией нужно сделать заглушкой?&lt;/h3&gt;

 &lt;h3&gt;36. Нужно разработать систему уведомлений, которая поддерживает несколько каналов доставки. Например email, смс, пуш уведомления. Нужно спроектировать так, чтобы система поддерживала расширение в виде добавления новых каналов доставки.&lt;/h3&gt;

 &lt;h3&gt;37. Есть некоторый эндпоинт, к обращению к которому происходит 500 ошибка и пользователь получает StackTrace. Не хотим, чтобы пользователь это видел. Нужно сделать, чтобы при ошибке пользователь получал осмысленное сообщение. Как это сделать средствами Rest и Spring MVC&lt;/h3&gt;

 &lt;h3&gt;38. Разрабатываешь новый Hello сервис. Есть один get метод. Поднимаем в Спринг Сервис. Из Постмана посылаем запрос Get. Опиши что происходит на пути следования запроса. От нажатия кнопки до того как запрос пришел в Сервис&lt;/h3&gt;

 &lt;h3&gt;39. Представь, что проектируем приложение. Нужно сохранить объект. Например сессию пользователя или покупку пользователя. Какую БД выбрать?&lt;/h3&gt;

 &lt;h3&gt;40. В k8s поднимаем более одного экземпляра микросервисного приложения. Возможны подводные камни, связанные с синхронизацией. Были ли такие ситуации? Какие проблемы?&lt;/h3&gt;

 &lt;h3&gt;41. Есть два сервера, ты хочешь подружить их по TLS. Что для этого нужно?&lt;/h3&gt;

 &lt;h3&gt;42. Банковское приложение. Пользователь хочет сделать перевод. В БД надо поменять запись и отправить сообщение в очередь. Как это сделать транзакционно?&lt;/h3&gt;

 &lt;h3&gt;43. Банковское приложение. Хотим сделать вызов на перевод денег. Отваливается сеть. Как сделать запрос только один раз? Как точки зрения приложения сделать так, чтобы ничего не задублировалось из-за падения сети. т.е. запрос от пользователя ушел и сразу потерялась связь, но запрос отработал. Что делать?&lt;/h3&gt;

 &lt;h3&gt;44. Есть запрос, который должен возвращать разные ответы. Например, запрос должен сохранять данные по ИП. Если данные сохранились, ответ 200. Если данные уже есть, то возвращается код 409 и полностью другой ответ. Как реализуешь такую логику?&lt;/h3&gt;

 &lt;h3&gt;45. Архитектура приложения, потенциальный Highload. Пришла задача от бизнеса. Есть данные на входе, например ИНН, что-то с ними делаем. На выходе генерируем excel файлы с данными. При этом, в запросе нам могут отправлять другие файлы из внешних API. В полученном запросе может быть от 1 до массива из тысяч ИНН-ов. За сутки может быть от 100 до 10 млн запросов к сервису. Нам выделили не мощный сервис. Нужно выдерживать нагрузку. Когда происходит генерация excel, не должен блокироваться сервис с REST. Как архитектурно это реализовать?&lt;/h3&gt;

 &lt;h3&gt;46. Существует горизонтально масштабируемый сервис на базе Spring. В его зоне ответственности есть реляционная БД с таблицей пользователей. Необходимо реализовать scheduler, который раз в месяц будет отправлять пользователям некоторый email. Допустимая задержка отправки - 1 час. Опциональное усложнение - инстансы приложения должны делить между собой список рассылки. Задача: гарантировать, что каждый пользователь получает ровно один email&lt;/h3&gt;

 &lt;h3&gt;47. На Gateway приходит запрос /user , запрос авторизуется. У вас один сервис, у него 3 инстанса. Как Gateway поймет, куда ему закинуть запрос? Какие есть варианты?&lt;/h3&gt;

 &lt;h3&gt;48. Retry. Есть сервис A и сервис B. Мы хотим из A пойти в B. Делаем запрос. ConnectionTimeout, либо сервис B лежит. И мы делаем Retry. В чем минус такого подхода? Как бы ты сам реализовал Retry, если нет Kafka, и мы идем по REST к сервису, чтобы получить данные?&lt;/h3&gt;

 &lt;h3&gt;49. Микросервис активно работает с Kafka: много пишет в нее, много читает из нее. И с БД работает микросервис. Как решить проблему с Data Race без блокировок на таблицу? Есть набор данных, который передается в Kafka: объекты с каким-то содержанием. Объекты принадлежат разным родительским типам. Как использовать Kafka для оптимизации? Пример: есть датчик погоды, который очень активно шлет информацию об изменениях погоды. Мы эту инфу сохраняем в БД. Как обеспечить, чтобы эта инфа сохранялась последовательно, чтобы было консистентное состояние БД, ничего не терялось, ничего не перезаписывалось? На один объект может приходить 10 тыс изменений. Потоковая обработка, не хотим ничего ждать&lt;/h3&gt;

 &lt;h3&gt;50. Проектируем банковское приложение. Есть кнопка для перевода с одного счета на другой. Хотим, чтобы во время обрыва связи, перевод выполнился только один раз. Как нам такое организовать?&lt;/h3&gt;

 &lt;h3&gt;51. Массовая рассылка. Нужно разослать 200 тыс. push уведомлений. Какое простое решение без Kafka, без RabbitMQ? Как это организовать без влияния на инфраструктуру?&lt;/h3&gt;

 &lt;h3&gt;52. Реальная первая задача будет на проекте. Есть Web, Android, iOS. Это нативные клиенты. Нам нужно прогрузить excel размером 2Gb. У клиента есть этот файл, а у нас есть ingress controller, который принимает эти файлы. Перед ним NGINX, после него NGINX. И Ingress-ов 20 штук. Но инфраструктуру сейчас не обсуждаем. Тебе нужно донести этот тяжелый excel документ до некоторого сервиса, которого пока не существует. Этот excel в базу мы положим уже со столбцами, с определенными типами, ячейки будем процессить. Может млрд ячеек придется процессить. Как будешь решать задачу?&lt;/h3&gt;

 &lt;h3&gt;53. У вас небольшой сервис. Если завтра поток возрастет в 10 раз, какие ваши действия? Архитектурный взгляд&lt;/h3&gt;

 &lt;h3&gt;54. Есть приложение, работает в проде, все хорошо. В одном из бизнес-процессов приложения мы отправляем email клиенту. Своего email-сервиса у нас нет, мы купили внешнюю API, в которую мы отправляем POST запрос, email адрес и текст, а внешний сервис отправляет email. За каждый вызов API мы платим 10р. Еще мы любим писать тесты, есть много тестов, есть ночные тесты, билды на новые коммиты. Оказывается, что в тестах мы тоже используем внешний API и платим деньги. А в тестах не хочется это делать. Как решить эту проблему?&lt;/h3&gt;

 &lt;h3&gt;55. У тебя есть сервис, который откидывает в кафку изменения сущности. С другой стороны есть сервис, который читает эти сущности. Как сделать так, чтобы у них эти сущности были в том же состоянии, что и в master-системе? Как ты это реализуешь, при условии, что сущности могут обновляться очень много раз в короткий промежуток времени. Также нужно обеспечить, чтобы у потребителя не получилось так, что более старые данные перезатирают более новые?&lt;/h3&gt;

 &lt;h3&gt;56. У нас есть контроллер, который вызывает сервис, который вызывает сохранения сущности в БД. У сущности есть поле автор. Приходит запрос на сохранение от какого-то пользователя. Мы хотим узнать что это за пользователь и записать его username в поле автор. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;57. У меня есть виртуалка (kuber не берем). В чем разница двух подходов? Первый вариант: я в рамках виртуалки пишу docker start container1, docker start container2. Второй вариант: я просто пишу java -jar свой_jar_файл&lt;/h3&gt;

 &lt;h3&gt;58. Есть микросервисы. Есть только один лог. Хочу подтянуть еще логи. Как это сделать в Grafana?&lt;/h3&gt;

 &lt;h3&gt;59. Есть твой микросервис, он хорошо законфигурирован. В application.yml указан определенный порт, законфигурировано общение с Redis. И на твоей локальной машине установлен тоже Redis. И у DevOps-а на сервисе, где он делал тестирование тоже что-то есть на этом же порту. Ты используешь Testcontainers. Берешь Redis. Но, если ты просто будешь поднимать тестовое окружение, то будет ругаться, говорить, что у тебя на таком-то порту что-то стоит. Ты хочешь сохранить application.yml, не хочешь делать отдельный profile. Что будешь делать, чтобы тест запустился? Какой мощный механизм у Spring Boot Test есть, чтобы показать, что ты игноришь определнный порт?&lt;/h3&gt;

 &lt;h3&gt;60. Есть два сервера. На первом сервере запускаем две виртуальных машины. На втором сервере linux с запущенным Docker-ом с несколькими контейнерами. На первом сервере на одной виртуалке запускаем приложение, которое умеет убивать операционную систему. И на втором сервере в докере тоже запускаем то же приложение. Выживет ли на первом сервере вторая виртуалка? Выживут ли остальные контейнеры на втором сервере после того, как в одном контейнере убили ОС?&lt;/h3&gt;

 &lt;h3&gt;61. Grafana. Есть счетчик, он растет от 1 до 5. Потом инстанс перезагрузился, счетчик опять начинает расти с нуля. Если такой трафик вывести в Grafana, он будет расти и падать. Как это решить?&lt;/h3&gt;

 &lt;h3&gt;62. Расскажи как ты будешь добавлять клиента в приложение магазина. Расскажи по слоям&lt;/h3&gt;

 &lt;h3&gt;63. У меня появился новый микрос, хочу с ним определить feign взаимодействие. Что представляет из себя Feign? Что мне надо определить? На Feign клиенте наверху указываешь путь до сервера, который вызываешь. У меня может оказаться, что путь разный на разных стендах (test, dev, prom). Как настраиваете стендозависимые пути на проекте?&lt;/h3&gt;

 &lt;h3&gt;64. Где в k8s наш Docker контейнер с приложением? Мы собрали jar-ник. Как его довести до pod? Где здесь сущность service и deployment? Если в k8s открыли вкладку с нашим pod-ом, то какая инфа содержится в deployment? Есть pod, мы говорим, что там крутится наше приложение. А pod это и есть наше приложение? Что находится в самом pod-е? Может ли там 10 приложение находиться, абсолютно разных, между собой не связанных?&lt;/h3&gt;

 &lt;h3&gt;65. Есть 2 сервиса (один из них user_service). Используется feign-client. И написано в k8s user_service:port_8080. Как второй java сервис находится просто по именованию? Мы пишем user_service и вся инфраструктура знает, как по IP открыть TCP соединение с ним? Где что указано в k8s?&lt;/h3&gt;

 &lt;h3&gt;66. Есть микросервис для списания денег со счета для оплаты Заказа. Его через REST вызывает другой сервис. Наш микросервис высоконагруженный, иногда много заказов приходит, два заказа от одного клиента может прийти. Какие проблемы могут быть? Как бы ты спроектировал?&lt;/h3&gt;

 &lt;h3&gt;67. Есть голосовой ассистент, который выдает востребованные вещи пользователю. Это диалоговая система. Пользователь что-то говорит ему, тот ему отвечает. Ассистент сам не может инициализировать взаимодействие с пользователем, только отвечает на его вопросы. Внутри есть платформа для взаимодействия на человеческом языке, и вызываются API. Система какие-то данные получает и отвечает пользователю. По факту это классический REST API. Но данные, которые нужны системе, собираются асинхронно. Есть отдельно запрос, который стартует сбор данных. И есть отдельно запрос, который ты дергаешь и получаешь либо ответ, либо просьбу ожидать. Какой алгоритм работы нужен, чтобы поженить между собой эти системы, и дать возможность голосовому ассистенту отвечать в синхронном режиме, получая данные из асинхронной системы?&lt;/h3&gt;

 &lt;h3&gt;68. If we delete container and recreate it from the image, will we have data from the previous run?&lt;/h3&gt;

 &lt;h3&gt;69. Микросервис. К нему пришло сто тыщ запросов. Где могут быть проблемы? По базе все ок, по памяти тоже все ок и по процессорному времени все ок. С чем еще могут быть проблемы?&lt;/h3&gt;

 &lt;h3&gt;70. Допустим у тебя есть очень медленный сервис и ему иногда прилетает прилетает миллионы записей и сервис неделю переваривает данные, как бы ты сделал по другому?&lt;/h3&gt;

 &lt;h3&gt;71. Как бы ты организовал обработку больших сложных JSON файлов? Какие библиотеки будешь использовать?&lt;/h3&gt;

 &lt;h3&gt;72. Тебе надо реализовать, чтобы на основную страницу мог зайти кто угодно, а на определенную страницу, смог заходить только человек с определенной ролью. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;73. User profile (User Service) is smth often requested by many services, and we don&amp;rsquo;t want to overwhelme such micro service. What we can do?&lt;/h3&gt;

 &lt;h3&gt;74. Есть 2 микроса. Первый микрос формирует заказы и хочет списать со счета клиента их оплату. Он передает номер счета и количество денег второму микросу. Второй микрос списывает с конкретного счета конкретную сумму. Работа сервиса интенсивная. Может оказаться, что у одного и того же клиента подряд быстро идут две оплаты. Что нужно сделать на втором микросе, чтобы все было хорошо? Может даже одновременно от первого сервиса прийти запрос: спиши с этого счета 500 р. Какие могут быть проблемы?&lt;/h3&gt;

 &lt;h3&gt;75. Есть класс. У него 2 метода: первый и второй. Ты повесил @Retryable на второй метод класса. Вызываешь из первого метода класса второй метод класса. Будет ли работать этот @Retryable?&lt;/h3&gt;

 &lt;h3&gt;76. Нужно написать клиентский сервис. Что бы ты писал в части строки запроса, или в ресурсах, property, yaml? Как бы указывал, что нужно сделать обращение к интеграции?&lt;/h3&gt;

 &lt;h3&gt;77. Мы реализовали сервис. Наша задача в нем реализовать функционал, который будет говорить о том, что сервис жив. Какие идеи?&lt;/h3&gt;

 &lt;h3&gt;78. Ты хочешь поднять локально БД. Она хранится в контейнере. Что нужно прописать, чтобы данные в БД не потерялись при дропе контейнера?&lt;/h3&gt;

 &lt;h3&gt;79. У тебя один микрос должен сохранять в две БД. Помимо Outbox, как еще можно реализовать, контролировать?&lt;/h3&gt;

 &lt;h3&gt;80. Есть сервис. Мы его масштабируем в K8s. Это же может привести к проблемам. Каким?&lt;/h3&gt;

 &lt;h3&gt;81. Ты сделал REST API для пагинации с выводом еще общего кол-ва страниц. Какие параметры ты бы выставил на вход? Или вообще никакие параметры не нужны?&lt;/h3&gt;

 &lt;h3&gt;82. Идемпотентный POST. Как будешь в коде проверять? К тебе приходит на создание сущность. Что будешь с ней делать?&lt;/h3&gt;

 &lt;h3&gt;83. С мобильного интернета хочешь оплатить домашний интернет. Нажимаешь кнопку Оплатить. С мобильной сетью неполадки, происходит Сетевая Ошибка. Еще раз нажимаешь Оплатить, еще раз отправляется запрос. И запрос обрабатывается 2 раза, ты 2 раза оплачиваешь домашний интернет. Это норм?&lt;/h3&gt;

 &lt;h3&gt;84. У тебя есть какой-то вызов, тебе надо прикрутить Retry, чтобы при определенных ошибках еще раз вызывал сервис. Как это сделать?&lt;/h3&gt;

 &lt;h3&gt;85. У пользователя есть аккаунт и он поделился им со своим родственником. Теперь они делают заказы вдвоем с этого аккаунта. Что плохого может случиться в нашем коде в таком случае?&lt;/h3&gt;

 &lt;h3&gt;86. У нас n-ое реплик запущено и каждый поднимает планировщик, в outbox пишем и все реплики читают и отправляют одно и то же событие. Как эту проблему решить?&lt;/h3&gt;

 &lt;h3&gt;87. У тебя есть какой-то сервис, он может обращаться к разным экземплярам другого сервсиса. Был ли у вас какой нибудь сервис discovery в инфраструктуре, который мог регистрировать обращения и каким образом в этом случае происходила балансировка?&lt;/h3&gt;

 &lt;h3&gt;88. Тебе приходит задача написать crud микросервис. Расскажи, как инициализируешь проект, как назовешь пакеты, классы?&lt;/h3&gt;

 &lt;h3&gt;89. Допустим простых вариантов у нас нету. Тогда application event. В спринге application event бросается в самой поде, в том же самом инстенсе. Соответственно у тебя где то внутри будет обработчик. Таким образом задача доступа, когда у тебя много инстансов заходит в одну и туже таблицу в базе остается. Каким образом будешь решать?&lt;/h3&gt;

 &lt;h3&gt;90. У тебя поднято 3 инстанса, а тебе нужно обращаться по одному хосту. Как это реализовать?&lt;/h3&gt;

 &lt;h3&gt;91. Нам нужно реализовать сервис лайков, например, во ВКонтакте или Instagram. Нам фронт присылает по REST, что такой-то пользователь поставил лайк. Нужно запроектировать backend так, чтобы уметь сохранять лайк, показывать количество лайков у конкретного поста и показывать, какой пользователь поставил этот лайк. При этом нагрузка 100 тыс RPC или более. С учетом такой нагрузки нужно придумать, как запроектировать такую систему используя современные средства разработки?&lt;/h3&gt;

 &lt;h3&gt;92. Мы написали какое-то большое приложение по документообороту. Мы сделали журналирование над документами. Загрузили документ - зажурналировали. Все операции (предосмотр файла, загрузка) логируются в таблицу. Мы вывели это в продакшен. Задача от бизнеса - сделать одностраничный сайт с таблицей журнала. Разработчик не заморачивался, сделал findAll() и отдал на фронтенд. На фронте сделал логику. Пока пользователей было мало - работало все хорошо. Появилось 100 пользователей и перекладывают около 100ГБ файлов в месяц. Прошло полгода и таблица весит 500МБ. На фронтенд передается 500МБ данных, браузер ломается. С нашей стороны нужно решить проблему на бэкенде. Какой метод бы предложил?&lt;/h3&gt;

 &lt;h3&gt;93. Есть RESTController метод GET в Spring Boot приложении. Возвращает метод модель книжек. Пишу get &amp;hellip;book_id, предполагаю, что вернется книжка по id. От чего будет зависеть, в каком формате будет отдавать RESTController? Я написал BookDTO. У нее какие-то атрибуты. Те атрибуты, которые нужны для фронта я отдаю&lt;/h3&gt;

 &lt;h3&gt;94. У тебя есть микросервис взаимодействия с фронтендом. Как сделать так, чтобы условно больше 50 запросов в секунду сервис не принимал.&lt;/h3&gt;

 &lt;h3&gt;95. Как спроектировать систему. У вас REST сервис, который вы можете вызвать одновременно не больше пяти раз. Если больше пяти раз то выбрасывается 429 ошибка. Как вы спроектируете систему если у вас есть Kafka? Как настроиться консьюмер, чтобы не превышал количество разрешенных вызово?&lt;/h3&gt;

 &lt;h3&gt;96. Есть большая сущность. Она хранит внутри подсущности key-value. Нужно обновлять ее. Приходит часть сущностей. Как избежать потерянных update-ов?&lt;/h3&gt;

 &lt;h3&gt;97. Есть виртуальная машина. У нас есть 2 сервиса, для них есть 2 images, и делаем для них docker run. Это первый вариант. Второй вариент: выкачали с Nexus артифактори наши jar-ники. И на этой же виртаульной машине делаем java-jar без Docker. В чем разница этих двух вариантов?&lt;/h3&gt;

 &lt;h3&gt;98. У тебя есть репозиторий, он используется для получения данных. Какие шаги применяются для получения данных? По шагам&lt;/h3&gt;

 &lt;h3&gt;99. Ты пишешь микросервис для получения статистики продаж. Как бы ты выставил процесс аутентификации и авторизации? Как ты будешь защищать сервис?&lt;/h3&gt;

 &lt;h3&gt;100. Представим, что падает заявка на получение кредита и когда вы получаете кредит, у вас есть четкая последовательность. Это скоринг клиента, двинуть его на другую операцию и выдать ему кредит и пополнить его карту. Как вы это реализовали?&lt;/h3&gt;

 &lt;h3&gt;101. JWT Token. Сервис выдал нам токен, от фронта пошел на бэк, передал токен. Как понять, что фронт передал нам нормальный токен?&lt;/h3&gt;

 &lt;h3&gt;102. JWT Token. Я посмотрел токен, исправил его поля. Токен будет испорчен?&lt;/h3&gt;

 &lt;h3&gt;103. Есть приложение HelloWorld. Контроллер, сервис. Сервис вызывает JPA репозиторий. Интерфейс получается. Аннотации Transactional нигде нет. По репозиторию делаем GET. Получаем сущность, у которой есть Lazy поле. Мы это Lazy поле делаем GET, но делаем в контроллере. Получим ли мы ошибку?&lt;/h3&gt;

 &lt;h3&gt;104. Микросервисы. Есть два сервиса, которые общаются между собой только через REST. Сервис А запрашивает у сервиса B какую-то информацию. Если берем классический REST-запрос, то мы должны получить от сервиса B ответ, чтобы двигаться дальше, это синхронное взаимодействие. Как мы можем организовать через REST асинхронное взаимодействие. С командой, которая разрабатывает сервис B мы можем о чем-то договориться&lt;/h3&gt;

 &lt;h3&gt;105. Есть два инстанса. Есть клиент должнен заплатить по запросу. Гейтвей перенаправляет на первый инстанс, он работает долго и гейтвей решает, что там таймаут и перенаправляет реквест на второй инстанс. Второй инстанс его успешно процессит и все удачно выполняет. После просыпается первый инстанс, видит тот же самый реквест, делает коммит. По факту деньги у юзера списались два раза. Как решить проблему?&lt;/h3&gt;

 &lt;h3&gt;106. В одно и тоже время купили два мороженных. Все одинаково, но по факту надо списать деньги два раза. Что делать? Как раздеять идентичность и разность?&lt;/h3&gt;

 &lt;h3&gt;107. Есть инстанс юзеров. Два микросервиса. Чтобы создать полностью юзера, ему нужно присвоить роль. Мы получаем реквест на создание юзера, все проходит, мы создаем юзера и по какой то причине роли падают и юзер удаляется. До ошибки, кто-то запросил всех юзеров. Как избежать ситуацию, чтобы возвращались польностью сконфигурированные юзеры?&lt;/h3&gt;

 &lt;h3&gt;108. Есть клиент и сервер. Клиент у нас продвинутый, на клиенте регистрируются продажи. Продажа формируется на клиенте, отсылается на бекенд, бекенд ее принимает, валидирует, сохраняет, 200 ОК. На клиенте реализована логика, что если у нас бек не доступен или 500, то он хранит ее в локадж сторедже и когда очередь отправки он все неуспешные отправляет. Если клиент не получил 200 ОК по причине сеть оборвалась. Положили в очередь, повторно отправили и случился дубль. Как решить эту ситуацию&lt;/h3&gt;

 &lt;h3&gt;109. Если применить хореографию к 10 сервисам, какие проблемы могут возникнуть?&lt;/h3&gt;</description></item><item><title>Многопоточность</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/multithreading/</guid><description>&lt;h2 id="многопоточность"&gt;
 Многопоточность
 &lt;a class="anchor" href="#%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-многопоточность"&gt;1. Что такое многопоточность? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Возможность программы выполнять несколько блоков одновременно&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Что такое поток?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Поток&lt;/strong&gt; (thread) — это независимая последовательность выполнения инструкций в рамках одной программы. Потоки позволяют выполнять несколько задач одновременно, используя возможности многоядерных процессоров.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Основные характеристики потока&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Поток выполняется в рамках одного процесса и использует его память.&lt;/li&gt;
&lt;li&gt;У каждого потока есть своё выполнение&lt;/li&gt;
&lt;li&gt;Имеет доступ к общей памяти.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зачем нужны потоки?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Потоки нужны для реализации &lt;strong&gt;многозадачности&lt;/strong&gt;, то есть выполнения нескольких операций одновременно. Это особенно полезно для:&lt;/p&gt;</description></item><item><title>ООП</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-java/oop/</guid><description>&lt;h2 id="ооп"&gt;
 ООП
 &lt;a class="anchor" href="#%d0%be%d0%be%d0%bf"&gt;#&lt;/a&gt;
&lt;/h2&gt;







 
 

 &lt;h4 id="1-что-такое-ооп"&gt;1. Что такое ООП? &lt;a href="#1-%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-%d0%be%d0%be%d0%bf" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;ООП - методология программирования, центральное место в которой занимает объект. Программа же в целом - совокупность объектов (экземпляров классов). Класс в свою очередь представляет собой шаблон и состоит из:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Полей&lt;/li&gt;
&lt;li&gt;Конструктора&lt;/li&gt;
&lt;li&gt;Методов&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
 &lt;hr&gt;



 
 

 &lt;h4 id="2-плюсы-и-минусы-ооп"&gt;2. Плюсы и минусы ООП &lt;a href="#2-%d0%bf%d0%bb%d1%8e%d1%81%d1%8b-%d0%b8-%d0%bc%d0%b8%d0%bd%d1%83%d1%81%d1%8b-%d0%be%d0%be%d0%bf" class="anchor"&gt;#&lt;/a&gt;&lt;/h4&gt;
 &lt;p&gt;&lt;p&gt;Плюсы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Делим программу на «модули»-классы, ОБЪЕКТЫ каждый из которых делает свою часть работы.&lt;/li&gt;
&lt;li&gt;Код можно повторно использовать в любом месте программы, это экономит время (не нужно писать однотипные функции для разных сущностей).&lt;/li&gt;
&lt;li&gt;«Более естественная» декомпозиция ПО существенно облегчает его разработку (код легко читается и быстро пишется).&lt;/li&gt;
&lt;li&gt;Возможность создавать расширяемые системы (extensible systems), именно это отличает ООП от традиционных методов программирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Минусы:&lt;/p&gt;</description></item><item><title>Отладка и производительность</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/debugging-performance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/debugging-performance/</guid><description>&lt;h1&gt;Отладка и производительность&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Действия при OutOfMemory. Сервис перезагружается каждые несколько часов&lt;/h3&gt;

 &lt;h3&gt;2. ЦПУ улетел вверх. Твои действия.&lt;/h3&gt;

 &lt;h3&gt;3. Приходил запрос от саппорта. Клиент жалуется, что у него тормозит конкретная страница. Как будешь начинать копать задачу и куда будешь двигаться.&lt;/h3&gt;

 &lt;h3&gt;4. Есть микросервис. Есть ендпоинт. Ендпоинт не укладывается по времени работы на какой то ступени нагрузочного тестирования. Нужно ускорить его работу. Как приступить к этой задаче? Предположим у нас нет БД. Какие болевые точки могут быть?&lt;/h3&gt;

 &lt;h3&gt;5. Есть java сервер. Сервер завис. Как подойти к этой проблеме?&lt;/h3&gt;

 &lt;h3&gt;6. Микросервис уходит в рестарт по памяти. Твои дейстия? OutOfMemoryException&lt;/h3&gt;

 &lt;h3&gt;7. Авторизация. Есть запрос. Как бэкэнд может узнать, какой пользователь делает запрос: из браузера или API? Как информация об авторизации, сессии передается в запросе? В каком заголовке эта инфа может передаваться?&lt;/h3&gt;

 &lt;h3&gt;8. В проде все было хорошо. И вдруг бэкэнд стал отвечать с длительностью 1.5 сек. Решили добавить кэш, добавили, а время ответа возрасло до 1.6 сек. Почему такое могло случиться?&lt;/h3&gt;

 &lt;h3&gt;9. Деплоим версию сервиса (делаем выкатку на прод). Сервис поднимается, но спустя 20-60 сек падает по ошибке &amp;ldquo;Не хватает памяти OOM (Out of memory)&amp;rdquo;. Kuber убивает старый под, поднимает новый под, снова сервис поднимает. Но снова сервис падает, и снова. Куда бы ты посмотрел? Что бы сделал?&lt;/h3&gt;

 &lt;h3&gt;10. Есть микросервис, который сохраняет файлы в S3. Есть API загрузки файла. Какой-то микросервис дергает этот метод, передает файл, и микросервис, который сохраняет файл падает по OutOfMemoryError. Что будешь делать? Падает микросервис до сохранения файла на S3&lt;/h3&gt;

 &lt;h3&gt;11. Написали код, код возможно будет меняться. Есть риск возникновения ошибки при изменении кода. Какую стратегию тестирования выбрать?&lt;/h3&gt;

 &lt;h3&gt;12. Java сервер. Работал работал и завис. Как нам разобраться, что пошло не так?&lt;/h3&gt;

 &lt;h3&gt;13. Надо протестировать какой то объект. В него инжектится другой объект. На другой объект кидаем мок. Как проверить вызывается ли объект?&lt;/h3&gt;

 &lt;h3&gt;14. Мы сидим в k8s и никто не даст нам снять heap dump. Что делать? Есть Grafana. На какие метрики будем обращать внимание?&lt;/h3&gt;

 &lt;h3&gt;15. Написали сервис, в нем есть (а?)синхронный запрос. Flux, GraphQL. К нам в сервис приходит сущность. Мы должны записать ее в БД и сверить expected и received сущности. Тебе надо написать тест этого сравнения. Как будешь делать?&lt;/h3&gt;

 &lt;h3&gt;16. Идёт загрузка клиентов, большое количество данных. Нам хочется, чтобы грузилось 5-10 тысяч записей в секунду. Это данные передают пакетами. Они могут быть в базе данных, а могут и не быть. Какой быстрый алгоритм Вы бы организовали для добавление/обновление данных?&lt;/h3&gt;

 &lt;h3&gt;17. Есть приложение по заказу такси. Пользователь едет в метро, связь работает не очень хорошо. Он нажимает кнопку Заказать машину, а в ответ прилетает ошибка, второй раз нажимает - тоже ошибка. В третий раз нажимает - успех. Выходит из метро, его ждут 3 машины. Как такое могло произойти? Что надо переделать в приложении, чтобы избежать такой ситуации?&lt;/h3&gt;

 &lt;h3&gt;18. What happens if you create a changeset that runs on the development environment, but then you realize there’s a typo in a column name? How would you fix it?&lt;/h3&gt;

 &lt;h3&gt;19. Есть наш сервис. Мы из него делаем HTTP запрос во внешний источник (ВИ) в диком интернете. Каждый запрос во ВИ для нас платный. В логах видим, что от ВИ периодически приходят ошибки в течение определенного времени. Потом восстанавливается, потом снова ошибки. Может связано с часами пиковых нагрузок. Как избежать переплат? Мы переживем без ответа от ВИ, но хотелось бы получать ответ от него&lt;/h3&gt;

 &lt;h3&gt;20. Представьте, что вы fullstack разработчик и кто-то за Вас написал одностраничное приложение (бэк и фронт). У нас есть несколько графиков – это векторная графика, некий &amp;ldquo;пирог&amp;rdquo; для отображения данных и некая заключительная таблица, которая показывает полную информацию по всем данным, которые у нас есть. Они отображают действия на странице. Произошел большой наплыв активности, аналитика заполнилась и таблицы стали весить по 500 мегабайт, стало все зависать. Как оптимизировать запрос получения данных аналитики?&lt;/h3&gt;

 &lt;h3&gt;21. Мы хотим реализовать класс, который пишет логи. Он должен выдерживать большую нагрузку, допустим, 5000 записей в секунду. Хочу иметь возможность для каждого экземпляра логгера указывать имя файла, куда будут писаться логи. Как будем реализовывать? У нас есть метод, который принимает строку и пишет ее в файл. А если у Вас будет дикая запись днем, а ночью не наберется и 50 для чанка? Тогда эти элементы останутся висеть, пока не соберется чанк?&lt;/h3&gt;

 &lt;h3&gt;22. Вот к тебе пришли тестировщики и сказали, что нагрузочное тестирование провалилось. С чего ты начинаешь работать?&lt;/h3&gt;

 &lt;h3&gt;23. Есть веб сервис написанный на Java. Сервис отдает расписание чего нибудь. Допустим футбольные матчи. При частои обращении пользователя сервис начинает деградировать. Какие твои шаги решения?&lt;/h3&gt;

 &lt;h3&gt;24. Интеграционный тест. В проде есть огромный справочник. Ты хочешь в тестах использовать часть данных из справочника на проде. При прогонке тестов этот справочник должен быть внутри БД. Как бы реализовал? Чем больше вариантов решения, тем лучше&lt;/h3&gt;

 &lt;h3&gt;25. Пришли DevOps, говорят, на проме OutOfMemory. Как будешь диагностировать, смотреть? Есть Grafana или другой аггрегатор метрик. На какие метрики можно обратить внимание? Дамп с прома в банке снять нельзя&lt;/h3&gt;

 &lt;h3&gt;26. Есть тест на сервис. В случае тестирования сервисного слоя не так важно, что вернется, важно понимать, что бизнес-логика отработала корректно. Как понять?&lt;/h3&gt;

 &lt;h3&gt;27. Датчики очень часто заливают данные в таблицу. Таблица индексируется, из-за этого тормозит, какие-то датчики могут не залиться. Как можно решить проблему?&lt;/h3&gt;

 &lt;h3&gt;28. Ваша задача сделать REST API. С помощью каких инструментов будете его проверять?&lt;/h3&gt;

 &lt;h3&gt;29. Вам нужно протестировать взаимодействие двух сервисов. Один эталонный, второй вы разрабатываете. Какой подход к тестированию выбрать?&lt;/h3&gt;

 &lt;h3&gt;30. У нас есть сервис с двумя репликами. В какой то момент пользователей стало много и нагрузка на сервисы стала возрастать. Что нужно сделать, чтобы выдержать эту нагрузку?&lt;/h3&gt;

 &lt;h3&gt;31. У нас есть форма, через которую заводим пользователей в систему. Оператор нажимает на кнопку добавить пользователя и нечаянно нажимает два раза. Как на беке отобразиться эта ситуация? Как исправить проблему?&lt;/h3&gt;

 &lt;h3&gt;32. У тебя произошел SteckOverFlow или OutOfMemory. Представим, что у тебя продакшен сервис. Эти ошибка происходят в проде. Твои действия?&lt;/h3&gt;

 &lt;h3&gt;33. Система работает 24/7, нельзя ее останавливать. Микросервисы. 5 подов поднято (экземпляров одного сервиса). Они работают с одной БД. Поступила задача переименовать колонку в БД. Как можно выстроить процесс без остановки приложения?&lt;/h3&gt;

 &lt;h3&gt;34. На продакшене упало в логах OutOfMemory, но приложение продолжило работу дальше. Что будем делать?&lt;/h3&gt;

 &lt;h3&gt;35. Приложение работает штатно, но упал прод с OutOfMemory. Поняли, что из за реализации на двух коллекциях. Элементы монотонно возрастающие и х2 по памяти. Что будем делать?&lt;/h3&gt;</description></item><item><title>Чистый код, SOLID, паттерны и рефакторинг</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/clean-code-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/clean-code-design/</guid><description>&lt;h1&gt;Чистый код, SOLID, паттерны и рефакторинг&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Есть один монолит на Java 11. Он содержит системы, которые надо вынести. С чего бы начал?&lt;/h3&gt;

 &lt;h3&gt;2. У нас есть SOLID и есть множественная имплементация. С одной стороны говорят дробите, с другой принцип единой ответственности, как решить этот диссонанс?&lt;/h3&gt;

 &lt;h3&gt;3. Метод, в котором 150 if-ов, где сравниваются строки. Как отрефакторить?&lt;/h3&gt;

 &lt;h3&gt;4. Сервис А должен сходить в Сервис Б. Они не знают API друг друга. Какой паттерн помогает им понять?&lt;/h3&gt;

 &lt;h3&gt;5. Планирование архитектуры между несколькими сервисами. (нужно смотреть фотографию) Как бы ты создал Контракт взаимодействия между сервисом egrn и внутренними клиентами. И между egrn и внешним сервисом Росреестр.&lt;/h3&gt;

 &lt;h3&gt;6. В первом сервисе произошло событие, закоммитили в БД, нужно отправить сообщение в кафку. Кафка реализует мост at least once т.е. может много сообщений в кафку. Если транзакция закоммителась мы должны гарантированно другому сервису сообщать, что событие произошло. Какие паттерны реализовать?&lt;/h3&gt;

 &lt;h3&gt;7. Общаемся с сервисом по REST, получили сетевую ошибку, кажется, что можно вызывать заново. Что настроить на своей стороне? - паттерн Retry - Если соседний сервис очень слабый, то постоянный retry еще больше его положит - увеличить промежутки времени между retry или паттерн circuit breaker&lt;/h3&gt;

 &lt;h3&gt;8. Какие концепции в SOLID вы считаете самыми важными? А какими иногда в угоду бизнеса, скорости можно пренебречь?&lt;/h3&gt;

 &lt;h3&gt;9. Принцип Open-closed подразумевает изменение не только через наследование или имплементацию интерфейсов. Он про то, что старый код не надо трогать, но можно расширять. Кроме Enum, как еще можно расширить старый код? (адаптеры, декораторы собесещующему не подошли)&lt;/h3&gt;

 &lt;h3&gt;10. Создали абстрактный терминал класс и у него есть метод по работе с картой. Нужно реализовать этот абстрактный класс?&lt;/h3&gt;</description></item><item><title>Git и системы сборки</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/git-build-systems/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/git-build-systems/</guid><description>&lt;h1&gt;Git и системы сборки&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Есть Петя и Вася пишут каждый пишет в своей ветке, Пети понадобился один из комитов Васи как это сделать?&lt;/h3&gt;

 &lt;h3&gt;2. Есть maven репозиторий с API и репозиторий с вашим сервисом который подключен как зависимость, после обновления API и сервиса - обновленния не произошло, почему? Загрузиться ли в репозиторий изменения при использовании package?&lt;/h3&gt;

 &lt;h3&gt;3. Как в консоле скомпилировать и запустить класс?&lt;/h3&gt;

 &lt;h3&gt;4. Есть две зависимости А и Б. Каждая завист от библиотеки С. Первая от первой версии, вторая от второй. Какая версия библиотеки С подтянется в проект?&lt;/h3&gt;

 &lt;h3&gt;5. Есть Maven проект. В pom есть блок dependencies. У каждой зависимости можно указать scope. Какие scope существуют?&lt;/h3&gt;

 &lt;h3&gt;6. Ты локально разрабатываешь. Сделал коммит, но не пушил. Понимаешь в моменте, что есть лишний файл в коммите. Что нужно предпринять, чтобы убрать лишнее?&lt;/h3&gt;

 &lt;h3&gt;7. Шаги разработки. Вам поступила задача. Какие шаги у вас как у разраба от начала задачи до выкатки на dev стенд? От чего создаете ветку? Как ее меняете?&lt;/h3&gt;

 &lt;h3&gt;8. Ты локально разрабатываешь у себя в IDE. Понимаешь, что закоммитил пару файлов, которые не хотел коммитить. Но еще никуда не пушил их. Они локально закоммичены. Что делать?&lt;/h3&gt;

 &lt;h3&gt;9. У тебя есть фича, ты ее закоммитил, запушил. Развернули на тестовом стенде. Тестировщик тебе пишет, что у какого-то слова всего 1 символ неправильный. Надо поправить 1 букву. Как ты исправишь это с точки зрения git? Не хочешь плодить коммиты&lt;/h3&gt;

 &lt;h3&gt;10. Добавляешь в проект dependency, видишь, что оно тянет еще транзитивные dependencies. Одна зависимость мешает. Можно ли отключить ее?&lt;/h3&gt;

 &lt;h3&gt;11. Открыл Pull Request, решил свою задачу, тебе все зааппрувили. Но, пока аппрувили, поменяли те же файлы и у тебя возник конфликт, не можешь замержить.&lt;/h3&gt;

 &lt;h3&gt;12. Maven. Ты добавил себе dependency. Эта dependency несет транзитивную зависимость, ты хочешь от нее избавиться. Как бы ты избавился от нее?&lt;/h3&gt;

 &lt;h3&gt;13. Ты сделал задачу, закинул pull request (merge request). Тебе его зааппрувили, но пока аппрувили, случился конфликт, замержить ты не можешь. Как ты обычно решаешь такую проблему?&lt;/h3&gt;

 &lt;h3&gt;14. Ты пришел на новое место работы. Тебе дают ссылку на репозиторий, ты скачиваешь проект. Начинаешь собирать проект и у тебя не выкачиваются библиотеки из репозитория. С чем это может быть связано? Зависимости из мавен репы не скачиваются.&lt;/h3&gt;

 &lt;h3&gt;15. Библиотеки у тебя скачались, но при поднятии проекта у тебя падает приложение с ошибкой, что версии библиотек конфликтуют. Как решить эту проблему?&lt;/h3&gt;

 &lt;h3&gt;16. Есть коммит, был предыдущий коммит, нам надо откатиться до предыдущего коммита так, чтобы git отслеживал изменения и более позднего коммита тоже&lt;/h3&gt;

 &lt;h3&gt;17. У вас новый сервис и несколько разработчиков будут контребьютить. Как бы вы организовали процесс в гите?&lt;/h3&gt;

 &lt;h3&gt;18. Если кто-то уже влил в develop ветку свои изменения, а вы поправили какой-то класс и делаете pull request (merge request). И происходит конфликт. Как решаете конфликты?&lt;/h3&gt;</description></item><item><title>Командные процессы</title><link>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/team-processes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/thought-exercises/team-processes/</guid><description>&lt;h1&gt;Командные процессы&lt;/h1&gt;
&lt;hr&gt;


 &lt;h3&gt;1. Ты делаешь задачу и не успеваешь к дедлайну, какие твои действия?&lt;/h3&gt;

 &lt;h3&gt;2. Сервис интеграции с платежным шлюзом. Два метода. Как бы вы оценили эту таску и какой срок реализации таски?&lt;/h3&gt;

 &lt;h3&gt;3. Есть куб. Он состоит из тысячи маленьких кубиков. То есть у нас куб со стороной 10 на 10 на 10. Нужно найти количество кубиков, находящихся на внешнем слое этого куба. То есть мы можем крутить-вертеть, сколько мы можем в сумме увидеть на внешнем слое кубиков&lt;/h3&gt;

 &lt;h3&gt;4. Есть два микросервиса. Ты работаешь на одном из них. Пришли коллеги с другого сервиса и говорят, что они подготовили api и просят дать комментарий, может надо что-то подправить?&lt;/h3&gt;

 &lt;h3&gt;5. У тебя есть большое, сложное приложение. Десятки тысяч строк. К тебе приходит бизнес аналитик и ставит задачу. В интерфейсе должна появиться красивая кнопка с определенной логикой. Как ты будешь анализировать этот запрос и как ты будешь понимать куда писать, что писать?&lt;/h3&gt;

 &lt;h3&gt;6. Пришла новая технология и ты хочешь внедрить ее в команду или проект. Как бы ты это делал или как это у вас делается?&lt;/h3&gt;

 &lt;h3&gt;7. Представьте, что к вам пришел стажер. Чтобы вы рассказали ему о бинах?&lt;/h3&gt;</description></item><item><title/><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-java/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-java/</guid><description>&lt;h1 id="java"&gt;
 Java
 &lt;a class="anchor" href="#java"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;






 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 





 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-first-unique-element/"&gt;Найти первый неповторяющийся элемент в массиве&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-check-palindrome/"&gt;Проверить, является ли строка палиндромом&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-sorted/"&gt;Найти 2 элемента упорядоченного массива, сумма которых равна заданному числу&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-unsorted/"&gt;Найти 2 элемента неупорядоченного массива, сумма которых равна заданному числу&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-thread-sync-tick-tock/"&gt;Реализовать код для отображения &amp;#34;Тик&amp;#34; и &amp;#34;Так&amp;#34; с разницей в одну секунду, используя два потока&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-decorator-pattern/"&gt;Реализовать паттерн Decorator&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-url-shortener-service/"&gt;Спроектировать и реализовать класс-сервис для сокращения URL-адресов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-api-user-management/"&gt;Спроектировать REST API для управления пользователем и его атрибутами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-token-limited-usage/"&gt;Реализовать класс-сервис для работы с токенами с ограничением на количество использований&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-partition-list/"&gt;Разделить список на подсписки фиксированного размера&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-get-contract/"&gt;Спроектировать REST Controller, возвращающий договор по номеру&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-post-contract/"&gt;Спроектировать REST Controller, создающий новый договор&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-person-by-name/"&gt;Написать реализацию метода findPersonByName()&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-top-five-integers/"&gt;Реализовать структуру данных, которая принимает поток целых чисел и в любой момент времени позволяет получить топ-5 наибольших значений&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-singleton-pattern/"&gt;Реализовать паттерн Singleton&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-spring-auto-robot/"&gt;Спринг сервис. Идеи по улучшению кода. Как сделать так, чтобы при добавлении нового робота Spring сразу создавал нового робота и нам не пришлось работать ручками&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-printformattedtext/"&gt;Реализовать форматирование текста в консоли&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-personservice/"&gt;Рефакторинг кода PersonService&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-shoes-service/"&gt;Разработать сервиса поиска обуви&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fibonacci-sequence/"&gt;Генерация ряда Фибоначчи&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name/"&gt;Поиск Person по имени&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-fixes/"&gt;Code-review и исправление ошибок&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-unique-char/"&gt;Поиск первого уникального символа&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-message-building/"&gt;Исправление проблем в коде&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-crud-books/"&gt;Реализовать CRUD для сущностей &amp;#34;Книги&amp;#34; и &amp;#34;Авторы&amp;#34;&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rename-attribute/"&gt;Изменение названия атрибута в API&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-spring-app-code-errors/"&gt;Исправление ошибок в Spring Boot приложении&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sort-array/"&gt;Сортировка массива чисел&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-binary-tree/"&gt;Реализация двоичного дерева&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fib-refactor/"&gt;Рефакторинг функции Фибоначчи&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-number/"&gt;Инверсия числа&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-contract-service/"&gt;Ревью и улучшение Spring-сервиса работы с контрактами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-singleton/"&gt;Реализация паттерна Singleton в Java&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-string-repetition/"&gt;Проверка повторяющихся символов в строке&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;35. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-repeated-string/"&gt;Решение задачи HackerRank &amp;#34;Repeat String&amp;#34;&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;36. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-users-in-place/"&gt;Фильтрация списка пользователей in-place&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;37. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-non-repeating-element/"&gt;Поиск первого неповторяющегося элемента в массиве&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;38. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-string/"&gt;Реверс строки&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;39. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-point-hashcode/"&gt;Реализация `hashCode` для класса Point&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;40. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-min-stack/"&gt;Реализация стека с поддержкой получения минимума за O(1)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;41. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-notification-service/"&gt;Гибкий NotificationService с Spring&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;42. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-check-prime/"&gt;Проверка простого числа&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;43. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-rare-word/"&gt;Поиск наименее частого слова в строке&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;44. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-word-count-map/"&gt;Подсчет повторений слов в строке&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;45. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transaction-proxy/"&gt;Собственный прокси для обеспечения отдельной транзакции&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;46. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-trucks/"&gt;Распределение загрузки на грузовики&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;47. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-best-seat-distance/"&gt;Поиск оптимального места в кинотеатре&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;48. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-vertical-symmetry/"&gt;Проверка вертикальной симметрии набора точек&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;49. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-heavydata-repo/"&gt;Получение только ID через Spring Data JPA&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;50. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-money-transfer/"&gt;Потокобезопасный перевод денег между счетами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;51. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-someservice/"&gt;Рефакторинг SomeServiceImpl для асинхронности и корректности&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;52. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transfer-amount/"&gt;Перевод средств между аккаунтами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;53. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-compress-consecutive/"&gt;Сжатие подряд идущих символов по ключу&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;54. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-foobar-alternate/"&gt;Чередование вывода `foo` и `bar`&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;55. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-self-injection/"&gt;Self‑inject для корректного создания транзакций&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;56. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-document-service/"&gt;Рефакторинг DocumentService с паттерном Стратегия&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;57. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name_1/"&gt;Поиск человека по имени&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;58. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe/"&gt;Консольная игра «Крестики-нолики»&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;59. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-collating-iterator/"&gt;Итератор объединённого упорядоченного обхода двух источников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;60. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-average-age-males/"&gt;Средний возраст мужчин в списке&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;61. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-filter-strategy/"&gt;Фильтрация заказов через стратегию с лямбдами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;62. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-even-index/"&gt;Удаление нечётных элементов списка&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;63. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-booking-service-refactor/"&gt;Рефакторинг BookingService для корректного бронирования&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;64. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-cat4-fix/"&gt;Исправление класса Cat4&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;65. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-print-tree/"&gt;Вывод дерева в виде иерархии&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;66. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome/"&gt;Проверка строки на палиндром&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;67. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe-console/"&gt;Консольная игра «Крестики-нолики»&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;68. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-expiring-map/"&gt;Реализация класса с истекающими ключами&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;69. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review/"&gt;Code Review: OrderService&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;70. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review2/"&gt;Code Review: OrderService&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;71. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-loop/"&gt;Проверка палиндрома в цикле без методов строк&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;72. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-fix-status/"&gt;Исправление ошибок: OrderService&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;73. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-merge-arrays-unique/"&gt;Объединить массивы без дубликатов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;74. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-tests/"&gt;Покрытие тестами метода calc&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;75. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-if-else-can-sell/"&gt;Реализация проверки продажи товара по времени и типу с условиями if-else&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;76. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-big-sequence/"&gt;Алгоритм фильтрации большой последовательности чисел&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;77. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-count-elements/"&gt;Алгоритм подсчёта вхождений элементов списка&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;78. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-products-review/"&gt;Code Review: Метод find в сервисе интернет-магазина&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;79. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sync-critical-section/"&gt;Code Review: Синхронизация критической секции в двух потоках&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;80. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-inmemory-user-service-review/"&gt;Code Review: In-memory UserService: код-ревью и правки&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;81. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-youngest-user-by-name/"&gt;Младший пользователь для каждого имени&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;82. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-cart-screen-dto/"&gt;BFF: экран корзины с рекомендациями&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;83. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-parallel-cart-and-recommendations/"&gt;Ускорение BFF: параллельные вызовы корзины и рекомендаций&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;84. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-transactional-http-call/"&gt;Code Review: @Transactional &amp;#43; внешний HTTP вызов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;85. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-permutations-of-strings/"&gt;Являются ли строки перестановками друг друга&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;86. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-generic-first-element/"&gt;Дженерик: получить первый элемент коллекции произвольного типа&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;87. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-group-anagrams/"&gt;Группировка анаграмм&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;88. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-implement-myarraylist/"&gt;Реализация собственного MyArrayList по аналогии с ArrayList&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;89. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-make-class-immutable/"&gt;Как сделать класс immutable&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;90. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-missing-number/"&gt;Поиск отсутствующего числа в массиве от 0 до n&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;91. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payment-service-code-review/"&gt;Code review PaymentService: транзакции, DI и логические баги&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;92. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payroll-system-review-and-fix/"&gt;Code review системы расчёта зарплат &amp;#43; бизнес-вопросы&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;93. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rest-get-all-demands/"&gt;REST эндпоинт: получить все записи из таблицы Demands&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;94. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-client-controller-code-review/"&gt;Code review ClientController и связанных классов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;95. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-single-number/"&gt;Найти число, которое встречается один раз&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;96. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transactions-self-invocation/"&gt;Транзакции: сколько будет при вызове b() и как сделать a() транзакционным&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;97. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-document-service-code-review/"&gt;Code review: DocumentService и DocumentReader&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;98. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-stat-service/"&gt;Code review сервиса подсчёта статистики по заказам клиента&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;99. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-atomic-integer-and-threads/"&gt;Потоки, синхронизация и реализация AtomicInteger&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;100. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-unique-words-by-anagram-signature/"&gt;Уникальные слова по признаку анаграмм (оставить по одному представителю)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;101. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-doaction-code-review/"&gt;Code review doAction(): проблемы и рефакторинг&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;102. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-stackoverflow-error/"&gt;Простейший метод, который приводит к StackOverflowError&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;103. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-max-stack/"&gt;Реализация стека с `push`, `pop`, `peekMax` за O(1)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;104. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-file-rename-code-review/"&gt;Переименование файла (ФС &amp;#43; Postgres) в транзакции&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;105. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-set-ball/"&gt;Работа с Set: объект Ball, equals / hashCode&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;</description></item><item><title/><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-sql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-sql/</guid><description>&lt;h1 id="sql"&gt;
 SQL
 &lt;a class="anchor" href="#sql"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;






 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 





 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-units-sold-after-time/"&gt;Найди id юнитов, которые были проданы на сумму более 1000 рублей после 10:00 сегодняшнего дня. &amp;gt; &amp;#34;2024-06-03 10:00&amp;#34;&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-cars-users/"&gt;Написать SQL-запрос, чтобы вывести пользователей, у которых более одного автомобиля?&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-students-names-c/"&gt;Написать SQL-запрос для вывода имен студентов и университетов, где имена студентов начинаются на букву C?&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-profiles-more-than-10-posts/"&gt;Выбери профили, у которых больше 10 постов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-persons-payments/"&gt;Даны две таблицы Persosn и Payments. Один-ко-многим. Справа описание. Напишите запрос, который выводит name и value&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary/"&gt;Необходимо написать sql запрос, который вернет минимальную и максимальную зарплату по всем отделам среди не уволенных сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-empty-classes/"&gt;Вывести id классов, у которых нет ни одного студента (без подзапросов)?&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-big-spenders/"&gt;Получить id пользователей, потративших более 1 000 000 рублей (без подзапросов)?&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicate-names/"&gt;БД таблица users, два столбца: id number autoincrement unique, name varchar not unique. Написать запрос, чтобы вывелись имена, которые встречаются 2 и более раз&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-customers-multiple-orders/"&gt;Выбрать всех клиентов, у которых больше трех заказов с ценой &amp;gt; 10&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-missing-users/"&gt;Написать запрос.Всего 10 пользователей. В выводе 5 пользователей в статусе Новый, 3 пользователя в статусе Работает. Куда делось еще 2 пользователя?&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-company-department-employee-count/"&gt;Покажите название компании, название отдела и количество сотрудников в отделе&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-user-car-relationship/"&gt;Пользователь и его машины: связь в базе данных&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;14. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-multiple-cars/"&gt;Поиск пользователей, у которых больше одной машины&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;15. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-max-price-by-category/"&gt;Товары с максимальной ценой в каждой категории товаров&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;16. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-clients-by-inn-kpp/"&gt;Поиск клиентов в базе данных по INN и KPP&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;17. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-delegates-by-inn-kpp/"&gt;Делегаты клиентов: найти по INN/KPP, вывести имя и телефон&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;18. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-sms-recipients/"&gt;Топ-10 телефонов, получивших больше всего SMS&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;19. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-orders/"&gt;Пользователи без заказов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;20. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-n-last-news-with-comments/"&gt;Получение последних N новостей и всех их комментариев&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;21. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-export-news-with-comments/"&gt;Выгрузка всех новостей с комментариями при большом объеме данных&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;22. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-3-visitors-by-visit-count/"&gt;Топ-3 посетителя по числу визитов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;23. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-services-january-2021-week/"&gt;Названия и цены услуг, проданных с 1 января 2021 по следующую неделю&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;24. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-groups-without-services/"&gt;Группы без услуг&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;25. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-authors-books/"&gt;Таблицы для авторов и книг (многие-ко-многим)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;26. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-fish-with-catch-less-than/"&gt;Рыбы с суммарным уловом на дату d менее n&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;27. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-trips/"&gt;Пользователи без поездок&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;28. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-names-occurring-more-than-5/"&gt;Имена, встречающиеся более 5 раз&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;29. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-most-frequent-value/"&gt;Самые повторяющиеся значения `value`&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;30. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-select-top-5/"&gt;Выбор пяти верхних записей&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;31. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-pink-cars-and-color-count/"&gt;Машины розового цвета и количество по цветам&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;32. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-and-high-salary-employees/"&gt;Отделы с числом сотрудников и сотрудники с окладом выше руководителя&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;33. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-match-strings-with-masks/"&gt;Строки, соответствующие любому шаблону&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;34. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-purchases-per-day/"&gt;Пользователи с более чем одной покупкой в день&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;35. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-mutual-followers/"&gt;Взаимные подписки (mutual follows)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;36. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-folders-with-avi-or-empty/"&gt;Папки с AVI-файлами и пустые папки&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;37. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-employee-count/"&gt;Отделы с количеством сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;38. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-deduplicate-client-email/"&gt;Устранение дублирования записей из-за регистра в email&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;39. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-leftjoin-equivalent/"&gt;Эквивалент LEFT OUTER JOIN без использования OUTER JOIN&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;40. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-second-highest-salary/"&gt;Второй по величине оклад&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;41. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicated-emails/"&gt;Поиск дублированных email&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;42. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salary-count-per-department/"&gt;Число сотрудников с одинаковой зарплатой в каждом департаменте&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;43. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-stats/"&gt;Статистика по отделам&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;44. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-refactor-slow-query/"&gt;Оптимизация медленного SQL‑запроса&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;45. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-employee-per-department/"&gt;Сотрудник с максимальной зарплатой в каждом департаменте&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;46. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-design-product-inventory/"&gt;Проектирование таблиц «Продукты» и «Наличие товаров по магазинам»&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;47. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salespersons-revenue/"&gt;Сумма выручки по продавцам&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;48. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-latest-by-foreign-key/"&gt;Последняя запись по каждому col2&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;49. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit_2/"&gt;Минимальная и максимальная зарплата по отделам среди неуволенных&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;50. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-delete-duplicates-emails/"&gt;Удаление дублей из таблицы emails&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;51. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-add-index-for-slow-query/"&gt;Оптимизация запроса с помощью индексов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;52. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-employees-higher-salary-than-chief/"&gt;Сотрудники, получающие зарплату выше своего руководителя&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;53. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-with-few-employees/"&gt;Отделы, где число сотрудников не превышает трёх человек&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;54. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-email-duplicates/"&gt;Найти дубли email среди клиентов-мужчин&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;55. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-example/"&gt;Пример синтаксиса запроса с HAVING&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;56. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-active-employees/"&gt;Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;57. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-vs-where-example/"&gt;Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;58. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-employees-aggregation/"&gt;Количество сотрудников по отделам и отделы с &amp;gt;3 сотрудниками с ЗП &amp;gt; 100к&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;59. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-org-directory-schema/"&gt;Схема БД для иерархического справочника организаций&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;60. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-bom-products-schema/"&gt;Проектирование базы изделий (ведомость состава / BOM)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;61. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-only-economy/"&gt;Найти пользователей, которые летали только экономом&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;62. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit-active/"&gt;Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;63. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-without-employees/"&gt;Найти департаменты без сотрудников&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;64. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-avg-salary-gt-90/"&gt;Отделы по алфавиту с количеством сотрудников, где средняя зарплата &amp;gt; 90&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;65. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-more-than-three-users/"&gt;Департаменты с количеством сотрудников больше трёх&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;</description></item><item><title/><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-stream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/main-livecoding-stream/</guid><description>&lt;h1 id="stream-api"&gt;
 Stream API
 &lt;a class="anchor" href="#stream-api"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;






 

 

 

 

 

 

 

 

 

 

 

 

 





 
 

 &lt;h4&gt;1. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-active-item-names/"&gt;Создать уникальную коллекцию (типа String) активных (атрибут Item.active со значением true) имен (атрибут Item.name), используя в качестве входных данных список items&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;2. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-avoid-complex-lambdas/"&gt;Упростить вложенные лямбда-выражения&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;3. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-get-employee-by-tabnomer/"&gt;Поиск сотрудника по табельному номеру&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;4. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-filter-sort-surnames/"&gt;Фильтр по фамилии&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;5. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-stream/"&gt;Палиндром с помощью Stream API&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;6. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-odd-doubled/"&gt;Stream API — удвоенные нечётные числа&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;7. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-values-in-storages/"&gt;Уникальные значения на складах&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;8. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-cities-streams/"&gt;Пройти по коллекции и вывести уникальные значения городов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;9. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-find-person-by-name/"&gt;Поиск человека по имени (Stream API)&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;10. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-books-by-author-streams/"&gt;Получить список наименований книг по каждому автору&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;11. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-reverse-every-second-char/"&gt;Вывести строку в обратном порядке, каждую вторую букву&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;12. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-stream-group-names/"&gt;Фильтрация и группировка имён&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;

 
 

 &lt;h4&gt;13. &lt;a href="https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-skip-limit/"&gt;Получить список без первых и последних трёх элементов&lt;/a&gt;&lt;/h4&gt;
 &lt;hr&gt;</description></item><item><title>[Изменение названия атрибута в API]</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rename-attribute/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rename-attribute/</guid><description>&lt;h4&gt;26. Изменение названия атрибута в API&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Организовать переход на изменение названия принимающего атрибута с &lt;strong&gt;title&lt;/strong&gt; на &lt;strong&gt;name&lt;/strong&gt;. Нужно обеспечить обратную совместимость, чтобы клиенты, использующие старый формат (&lt;code&gt;&amp;quot;title&amp;quot;: &amp;quot;...&amp;quot;&lt;/code&gt;), могли продолжать работать, а новые — использовать &lt;code&gt;&amp;quot;name&amp;quot;: &amp;quot;...&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Исходный JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Новый JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте аннотацию &lt;strong&gt;@JsonAlias&lt;/strong&gt; для поддержки старого названия атрибута.&lt;br&gt;
💡 Основное имя атрибута задается с помощью &lt;strong&gt;@JsonProperty&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; com.fasterxml.jackson.annotation.JsonAlias;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; com.fasterxml.jackson.annotation.JsonProperty;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BookDTO&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Новое основное имя &amp;#34;name&amp;#34;, поддерживаем также &amp;#34;title&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@JsonProperty&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@JsonAlias&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Геттер&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Сеттер&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setName&lt;/span&gt;(String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>BFF: экран корзины с рекомендациями</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-cart-screen-dto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-cart-screen-dto/</guid><description>&lt;h4&gt;82. BFF: экран корзины с рекомендациями&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Livecoding. Мы с тобой пишем свой стартап. Типо озона. Фишка нашего стартапа будет допродажа. Это когда, я как пользователь вижу новенький айфончик, кидаю его в корзину, перехожу на экран корзины и там вместе с айфоном вижу экран с рекомендациями, что подходит к моему выбранному айфону. Для того, чтобы это осуществить мы строим свой BFF. Наша задача вернуть DTO. Для задачи всегда приходят релевантные данные.&lt;/p&gt;</description></item><item><title>Code review ClientController и связанных классов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-client-controller-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-client-controller-code-review/</guid><description>&lt;h4&gt;94. Code review ClientController и связанных классов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан REST-контроллер, который должен вернуть полисы клиента. Нужно провести code review:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;найти проблемы (как технические, так и логические),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;предложить, как переписать код более корректно.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RestController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ClientController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Value&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;policy.limit&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; policyLimit;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; PolicyService policyService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@RequestMapping&lt;/span&gt;(path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;client/{clientId}/policies&amp;#34;&lt;/span&gt;, method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; RequestMethod.&lt;span style="color:#a6e22e"&gt;POST&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Response &lt;span style="color:#a6e22e"&gt;getClientPolicies&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;@PathVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;clientId&amp;#34;&lt;/span&gt;) String clientId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;PolicyDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; policies &lt;span style="color:#f92672"&gt;=&lt;/span&gt; getPolicies().&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;limit&lt;/span&gt;(policyLimit)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(p &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;getClientIds&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(clientId))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(p &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;isPaid&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Response(policies);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;PolicyDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPolicies&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; policyService.&lt;span style="color:#a6e22e"&gt;getPolicies&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Response&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;PolicyDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; policies;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PolicyDTO&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; clientId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Boolean isPaid;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PolicyService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; PolicyDbRepository repository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Читает полисы из БД
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;PolicyDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPolicies&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; repository.&lt;span style="color:#a6e22e"&gt;getPolicies&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PolicyDbRepository&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;PolicyDTO&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPolicies&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;@Value(&amp;quot;policy.limit&amp;quot;)&lt;/code&gt; — строка, а не property placeholder. Нужно &lt;code&gt;@Value(&amp;quot;${policy.limit}&amp;quot;)&lt;/code&gt;.&lt;br&gt;
💡 Поля с &lt;code&gt;@Autowired&lt;/code&gt; → лучше конструкторная инъекция (&lt;code&gt;@RequiredArgsConstructor&lt;/code&gt;).&lt;br&gt;
💡 &lt;code&gt;@RequestMapping POST&lt;/code&gt; на метод, который фактически &lt;strong&gt;читает&lt;/strong&gt; данные — по REST лучше &lt;code&gt;GET&lt;/code&gt;.&lt;br&gt;
💡 В контроллере вызывается &lt;code&gt;getPolicies()&lt;/code&gt; с &lt;code&gt;@Transactional&lt;/code&gt;, но метод &lt;code&gt;private&lt;/code&gt; + self-invocation → транзакция не сработает.&lt;br&gt;
💡 &lt;code&gt;limit(policyLimit)&lt;/code&gt; стоит делать &lt;strong&gt;после&lt;/strong&gt; фильтрации, а ещё лучше — на уровне БД.&lt;br&gt;
💡 &lt;code&gt;PolicyDTO&lt;/code&gt;: поле &lt;code&gt;clientId&lt;/code&gt; (в коде вызывается &lt;code&gt;getClientIds()&lt;/code&gt;) и &lt;code&gt;Boolean isPaid&lt;/code&gt; (Lombok сгенерирует &lt;code&gt;getIsPaid()&lt;/code&gt;, а не &lt;code&gt;isPaid()&lt;/code&gt;) → не скомпилируется.&lt;br&gt;
💡 Внутренний класс &lt;code&gt;Response&lt;/code&gt; не &lt;code&gt;static&lt;/code&gt; → держит ссылку на контроллер, хуже для сериализации/тестов.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="1-основные-проблемы-в-текущем-коде"&gt;
 1. Основные проблемы в текущем коде
 &lt;a class="anchor" href="#1-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-%d0%b2-%d1%82%d0%b5%d0%ba%d1%83%d1%89%d0%b5%d0%bc-%d0%ba%d0%be%d0%b4%d0%b5"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Неправильное использование &lt;code&gt;@Value&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Code review doAction(): проблемы и рефакторинг</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-doaction-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-doaction-code-review/</guid><description>&lt;h4&gt;101. Code review doAction(): проблемы и рефакторинг&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан метод &lt;code&gt;doAction(Object source)&lt;/code&gt;, который возвращает строку в зависимости от типа объекта (&lt;code&gt;Car&lt;/code&gt;, &lt;code&gt;Train&lt;/code&gt;, &lt;code&gt;Jet&lt;/code&gt;). Нужно проанализировать проблемы и предложить улучшения/рефакторинг с кодом.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Set;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.function.Predicate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.function.UnaryOperator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Stream;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Car&lt;/span&gt;(String engine) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Train&lt;/span&gt;(String engine) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Jet&lt;/span&gt; (String engine) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Book&lt;/span&gt;(String author, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; names) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Задание 1: Проанализировать метод doAction(..), предложить возможный рефакторинг, исправления, оптимизацию.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String doIt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; doAction(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Jet(&lt;span style="color:#e6db74"&gt;&amp;#34;Jet&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(doIt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Например, в данном случае вызов для Jet будет после проверки всех условий (плохо).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Какие могут быть еще проблемы в этом коде ?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;doAction&lt;/span&gt;(Object source) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String doIt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Just action &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (source &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Car car) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; doIt &lt;span style="color:#f92672"&gt;+&lt;/span&gt; car.&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (source &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Train train) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; doIt &lt;span style="color:#f92672"&gt;+&lt;/span&gt; train.&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; doIt &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ((Jet) source).&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;else&lt;/code&gt; делает &lt;code&gt;((Jet) source)&lt;/code&gt; без проверки — если придёт другой тип (или null), будет &lt;code&gt;ClassCastException&lt;/code&gt; / NPE.&lt;br&gt;
💡 Метод принимает &lt;code&gt;Object&lt;/code&gt; — слабый контракт: непонятно, что допустимо.&lt;br&gt;
💡 Лишние импорты (&lt;code&gt;Set&lt;/code&gt;, &lt;code&gt;Predicate&lt;/code&gt;, &lt;code&gt;UnaryOperator&lt;/code&gt;, &lt;code&gt;Stream&lt;/code&gt;) и лишний &lt;code&gt;Book&lt;/code&gt; — шум.&lt;br&gt;
💡 Замечание про «плохо, что Jet проверяется последним» спорное: обычно это нормально, но проблема масштабируемости реальна (цепочка if/else растёт).&lt;br&gt;
💡 Лучше использовать sealed interface + pattern matching switch, либо полиморфизм (общий интерфейс).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="проблемы-в-текущем-doaction"&gt;
 Проблемы в текущем doAction()
 &lt;a class="anchor" href="#%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b-%d0%b2-%d1%82%d0%b5%d0%ba%d1%83%d1%89%d0%b5%d0%bc-doaction"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Опасный каст в else&lt;/strong&gt;&lt;br&gt;
Если &lt;code&gt;source&lt;/code&gt; не &lt;code&gt;Jet&lt;/code&gt;, будет &lt;code&gt;ClassCastException&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; doIt &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ((Jet) source).&lt;span style="color:#a6e22e"&gt;engine&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Нет обработки null&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;source == null&lt;/code&gt; → ветки &lt;code&gt;instanceof&lt;/code&gt; не сработают → упадём на касте.&lt;/p&gt;</description></item><item><title>Code review PaymentService: транзакции, DI и логические баги</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payment-service-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payment-service-code-review/</guid><description>&lt;h4&gt;91. Code review PaymentService: транзакции, DI и логические баги&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан сервис &lt;code&gt;PaymentService&lt;/code&gt;. Нужно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;провести &lt;strong&gt;code review&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;указать проблемы,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;показать, &lt;strong&gt;как исправить код&lt;/strong&gt; (структуру оставить примерно ту же).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PaymentService&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; ComissionServiceImpl comissionService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; NotificationService notificationService &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; NotificationServiceImpl();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; AccountRepository accountRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;makePayment&lt;/span&gt;(AccountDto acc1, AccountDto acc2, Integer moneyAmount){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Start payment&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; account1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; accountRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(acc1.&lt;span style="color:#a6e22e"&gt;getAccountId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; account2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; accountRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(acc1.&lt;span style="color:#a6e22e"&gt;getAccountId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transfer(account1, account2, moneyAmount);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;sendNotification&lt;/span&gt;(account1.&lt;span style="color:#a6e22e"&gt;getAccountId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;sendNotification&lt;/span&gt;(account2.&lt;span style="color:#a6e22e"&gt;getAccountId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;End payment&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transfer&lt;/span&gt;(Account acc1, Account acc2, Integer moneyAmount){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; account1.&lt;span style="color:#a6e22e"&gt;setMoneyAmount&lt;/span&gt;(account1.&lt;span style="color:#a6e22e"&gt;getMoneyAmount&lt;/span&gt;() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; moneyAmount);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; account2.&lt;span style="color:#a6e22e"&gt;setMoneyAmount&lt;/span&gt;(account2.&lt;span style="color:#a6e22e"&gt;getMoneyAmount&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; moneyAmount);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AccountDto&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; UUID accountId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Integer moneyAmount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Entity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Account&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; UUID accountId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Integer moneyAmount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Инъекция зависимостей: не используем &lt;code&gt;new&lt;/code&gt;, лучше &lt;strong&gt;constructor injection&lt;/strong&gt; + интерфейсы, а не конкретные классы.&lt;br&gt;
💡 &lt;code&gt;findById&lt;/code&gt; в Spring Data возвращает &lt;code&gt;Optional&amp;lt;Account&amp;gt;&lt;/code&gt;, а не &lt;code&gt;Account&lt;/code&gt;. Нужна обработка.&lt;br&gt;
💡 Во втором &lt;code&gt;findById&lt;/code&gt; используется &lt;code&gt;acc1&lt;/code&gt;, а должно быть &lt;code&gt;acc2&lt;/code&gt;.&lt;br&gt;
💡 В &lt;code&gt;transfer&lt;/code&gt; параметры называются &lt;code&gt;acc1/acc2&lt;/code&gt;, но внутри используются &lt;code&gt;account1/account2&lt;/code&gt; — код не компилируется.&lt;br&gt;
💡 &lt;code&gt;@Transactional&lt;/code&gt; не сработает, если аннотированный метод вызывается &lt;strong&gt;из этого же класса&lt;/strong&gt; (self-invocation). Транзакцию нужно ставить на entrypoint (&lt;code&gt;makePayment&lt;/code&gt;) или вынести &lt;code&gt;transfer&lt;/code&gt; в отдельный сервис.&lt;br&gt;
💡 Логирование лучше делать через &lt;code&gt;Logger&lt;/code&gt;, а не &lt;code&gt;System.out.println&lt;/code&gt;.&lt;br&gt;
💡 Денежные суммы лучше хранить в &lt;code&gt;BigDecimal&lt;/code&gt;, но для livecoding можно оставить &lt;code&gt;Integer&lt;/code&gt; и хотя бы проверить баланс и неотрицательность суммы.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Ниже пример исправленного варианта с комментариями:&lt;/p&gt;</description></item><item><title>Code review сервиса подсчёта статистики по заказам клиента</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-stat-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-stat-service/</guid><description>&lt;h4&gt;98. Code review сервиса подсчёта статистики по заказам клиента&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан сервис, который собирает статистику по заказам пользователей. Нужно провести code review: что ок, что не ок, и как бы ты исправил.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StatService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; UserRepository userRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; StatRepository statRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; KafkaService kafkaService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculate&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users &lt;span style="color:#f92672"&gt;=&lt;/span&gt; userRepository.&lt;span style="color:#a6e22e"&gt;findAll&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(u &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; u.&lt;span style="color:#a6e22e"&gt;isActive&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;users.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(User user : users) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; orders &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;findByUser&lt;/span&gt;(user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (orders.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;У пользователя нет заказов&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; totalOrders &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; totalCost &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(Order order : orders) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; totalOrders&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; totalCost &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; order.&lt;span style="color:#a6e22e"&gt;getCost&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; save(user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;(), totalOrders, totalCost);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(Long userId, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; totalOrders, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; totalCost) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kafkaService.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(userId, totalOrders, totalCost, Instant.&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нельзя одновременно &lt;code&gt;@RequiredArgsConstructor&lt;/code&gt; и field injection &lt;code&gt;@Autowired&lt;/code&gt; — выбери одно (лучше constructor injection).&lt;br&gt;
💡 &lt;code&gt;findAll()&lt;/code&gt; и фильтрация в памяти — плохо для производительности, лучше &lt;code&gt;findAllByActiveTrue()&lt;/code&gt; или query.&lt;br&gt;
💡 N+1 проблема: на каждого пользователя отдельный запрос &lt;code&gt;findByUser(...)&lt;/code&gt;. Лучше агрегировать на уровне БД.&lt;br&gt;
💡 &lt;code&gt;@Transactional&lt;/code&gt; на &lt;code&gt;private&lt;/code&gt; методе не сработает (self-invocation).&lt;br&gt;
💡 Метод &lt;code&gt;save&lt;/code&gt; не сохраняет в &lt;code&gt;statRepository&lt;/code&gt;, а только шлёт в Kafka — название вводит в заблуждение.&lt;br&gt;
💡 &lt;code&gt;System.out.println&lt;/code&gt; → заменить на логгер.&lt;br&gt;
💡 Сумма стоимости в &lt;code&gt;int&lt;/code&gt; может переполниться, деньги лучше &lt;code&gt;BigDecimal&lt;/code&gt;/&lt;code&gt;long&lt;/code&gt; (копейки).&lt;br&gt;
💡 &lt;code&gt;Instant.now()&lt;/code&gt; лучше вычислять один раз на запуск/пользователя и передавать явно.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="что-ок"&gt;
 Что ок
 &lt;a class="anchor" href="#%d1%87%d1%82%d0%be-%d0%be%d0%ba"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ Идея разделить «расчёт» и «побочные эффекты» (отправка/сохранение) правильная.&lt;/p&gt;</description></item><item><title>Code review системы расчёта зарплат + бизнес-вопросы</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payroll-system-review-and-fix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-payroll-system-review-and-fix/</guid><description>&lt;h4&gt;92. Code review системы расчёта зарплат &amp;#43; бизнес-вопросы&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть «наследованный» класс &lt;code&gt;PayrollSystem&lt;/code&gt;, который считает зарплаты сотрудников.&lt;br&gt;
Данные приходят из внешней системы в виде &lt;code&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;&lt;/code&gt; (мы на них повлиять не можем).&lt;/p&gt;
&lt;p&gt;Жалобы бухгалтерии:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;В отчётах &lt;strong&gt;иногда пропадают сотрудники&lt;/strong&gt; (особенно новые).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В ведомости &lt;strong&gt;появляются отрицательные суммы зарплат&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;При &lt;strong&gt;изменении оклада&lt;/strong&gt; система не всегда обновляет данные.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В цифрах много &lt;strong&gt;дробных значений&lt;/strong&gt; (5234.56789 вместо 5234.57).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;При ошибке в данных (&lt;strong&gt;текст вместо цифр&lt;/strong&gt;) система «зависает» без объяснения.&lt;/p&gt;</description></item><item><title>Code Review: @Transactional + внешний HTTP вызов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-transactional-http-call/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-transactional-http-call/</guid><description>&lt;h4&gt;84. Code Review: @Transactional &amp;#43; внешний HTTP вызов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть сервис, который делает внешний HTTP-вызов и сохраняет результат в БД. Нужно провести код-ревью: какие проблемы в этом коде и как их исправить.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RestClient&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; obj &lt;span style="color:#f92672"&gt;=&lt;/span&gt; restTemplate.&lt;span style="color:#a6e22e"&gt;postForObject&lt;/span&gt;(...);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dbService.&lt;span style="color:#a6e22e"&gt;saveObj&lt;/span&gt;(obj);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Не держите транзакцию БД во время сетевого запроса — это блокирует ресурсы и увеличивает риск длительных блокировок.&lt;br&gt;
💡 Обработайте ошибки/таймауты внешнего вызова (timeouts, retries/circuit breaker, фолбэки).&lt;br&gt;
💡 Сделайте &lt;code&gt;RestTemplate&lt;/code&gt;/клиент биновым и внедряйте через конструктор.&lt;br&gt;
💡 Разделите ответственность: внешний вызов отдельно, сохранение — в отдельной транзакции.&lt;br&gt;
💡 Продумайте идемпотентность: если внешний вызов прошёл, а транзакция откатилась — возможны дубли/несогласованность.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HttpClientConfig&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Bean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RestTemplate &lt;span style="color:#a6e22e"&gt;restTemplate&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; factory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HttpComponentsClientHttpRequestFactory();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factory.&lt;span style="color:#a6e22e"&gt;setConnectTimeout&lt;/span&gt;(2_000);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factory.&lt;span style="color:#a6e22e"&gt;setReadTimeout&lt;/span&gt;(3_000);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RestTemplate(factory);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RestClientService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; RestTemplate restTemplate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; DbService dbService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1) Внешний HTTP-вызов ВНЕ транзакции БД&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResponseDto obj &lt;span style="color:#f92672"&gt;=&lt;/span&gt; callRemote();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2) Отдельная короткая транзакция только на запись в БД&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; save(obj);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; ResponseDto &lt;span style="color:#a6e22e"&gt;callRemote&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// пример: добавьте идемпотентный ключ, если поддерживается провайдером&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; headers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HttpHeaders();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Idempotency-Key&amp;#34;&lt;/span&gt;, UUID.&lt;span style="color:#a6e22e"&gt;randomUUID&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; request &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HttpEntity&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(buildRequest(), headers);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; restTemplate.&lt;span style="color:#a6e22e"&gt;postForObject&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;https://remote/api&amp;#34;&lt;/span&gt;, request, ResponseDto.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (RestClientResponseException ex) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// HTTP 4xx/5xx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ExternalServiceException(&lt;span style="color:#e6db74"&gt;&amp;#34;Remote error: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ex.&lt;span style="color:#a6e22e"&gt;getRawStatusCode&lt;/span&gt;(), ex);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (ResourceAccessException ex) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// таймауты/сети&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ExternalServiceException(&lt;span style="color:#e6db74"&gt;&amp;#34;Remote timeout/unavailable&amp;#34;&lt;/span&gt;, ex);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(ResponseDto obj) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// валидация данных перед сохранением&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (obj &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Remote response is null&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dbService.&lt;span style="color:#a6e22e"&gt;saveObj&lt;/span&gt;(obj);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; RequestDto &lt;span style="color:#a6e22e"&gt;buildRequest&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// сконструируйте DTO запроса&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RequestDto(&lt;span style="color:#75715e"&gt;/* ... */&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/** Пример доменных исключений — не даём &amp;#34;прятать&amp;#34; сетевые ошибки как SQL */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ExternalServiceException&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; RuntimeException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ExternalServiceException(String msg, Throwable cause) { &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;(msg, cause); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/** Пример DbService — транзакция может жить здесь, если хочется инкапсулировать слой */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DbService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ObjRepository repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;(propagation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Propagation.&lt;span style="color:#a6e22e"&gt;MANDATORY&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;saveObj&lt;/span&gt;(ResponseDto obj) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repo.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(map(obj));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; ObjEntity &lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(ResponseDto dto) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// mapper DTO -&amp;gt; Entity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ObjEntity(&lt;span style="color:#75715e"&gt;/* ... */&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Что исправлено и почему (кратко):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Code review: DocumentService и DocumentReader</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-document-service-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-document-service-code-review/</guid><description>&lt;h4&gt;97. Code review: DocumentService и DocumentReader&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан сервис &lt;code&gt;DocumentService&lt;/code&gt;, который читает документы разных типов с помощью самописного &lt;code&gt;DocumentReader&lt;/code&gt;.&lt;br&gt;
Нужно провести &lt;strong&gt;code review&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;что в коде &lt;strong&gt;ок&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;что &lt;strong&gt;не ок&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;что и &lt;strong&gt;как улучшить&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; InputStream &lt;span style="color:#a6e22e"&gt;readDocument&lt;/span&gt;(String type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DocumentReader reader &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; DocumentReader();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PDF&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readPdf&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;DOCX&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readDocx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;XLSX&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readXlsx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;new DocumentReader()&lt;/code&gt; внутри сервиса — нарушение DI, усложняет тестирование.&lt;br&gt;
💡 &lt;code&gt;type.equals(&amp;quot;PDF&amp;quot;)&lt;/code&gt; может привести к &lt;code&gt;NullPointerException&lt;/code&gt;.&lt;br&gt;
💡 &lt;code&gt;else return null&lt;/code&gt; — плохой контракт метода.&lt;br&gt;
💡 Условная логика плохо масштабируется (нарушение OCP).&lt;br&gt;
💡 Лучше использовать &lt;code&gt;enum&lt;/code&gt;, &lt;code&gt;Map&lt;/code&gt; или стратегию.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="что-в-коде-ок-"&gt;
 Что в коде &lt;strong&gt;ок&lt;/strong&gt; ✅
 &lt;a class="anchor" href="#%d1%87%d1%82%d0%be-%d0%b2-%d0%ba%d0%be%d0%b4%d0%b5-%d0%be%d0%ba-"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Простота и читаемость&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Code Review: In-memory UserService: код-ревью и правки</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-inmemory-user-service-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-inmemory-user-service-review/</guid><description>&lt;h4&gt;80. Code Review: In-memory UserService: код-ревью и правки&lt;/h4&gt;
 &lt;p&gt;🔥 Нужно быстро запустить хранение пользователей в памяти сервиса, чтобы использовать из контроллеров и других сервисов. Разберём проблемы и улучшим код для продового использования под нагрузкой.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; usersCache &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addUser&lt;/span&gt;(User user) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; usersCache.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;(), user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; User &lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; usersCache.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getAllUsers&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(usersCache.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Потокобезопасность: &lt;code&gt;HashMap&lt;/code&gt; не потокобезопасен — возьми &lt;code&gt;ConcurrentHashMap&lt;/code&gt;.&lt;br&gt;
💡 Контракты методов: валидация &lt;code&gt;user&lt;/code&gt;/&lt;code&gt;id&lt;/code&gt;, поведение при дубликате (id уже существует).&lt;br&gt;
💡 Иммутабельность: если &lt;code&gt;User&lt;/code&gt; изменяемый, лучше возвращать копии/DTO, чтобы не ломать инварианты.&lt;br&gt;
💡 Возвраты: для чтения — &lt;code&gt;Optional&amp;lt;User&amp;gt;&lt;/code&gt; вместо &lt;code&gt;null&lt;/code&gt;, для пустых коллекций — &lt;code&gt;List.of()&lt;/code&gt;.&lt;br&gt;
💡 API полнота: часто нужны &lt;code&gt;create/update/delete&lt;/code&gt;, &lt;code&gt;exists&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;.&lt;br&gt;
💡 Производительность: возвращай неизменяемую копию списка без лишних аллокаций.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Потокобезопасное, финализированное хранилище&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ConcurrentMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Создаёт пользователя. Бросает исключение, если id уже занят.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; User &lt;span style="color:#a6e22e"&gt;create&lt;/span&gt;(User user) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; validateUser(user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; User prev &lt;span style="color:#f92672"&gt;=&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;putIfAbsent&lt;/span&gt;(user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;(), user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (prev &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalStateException(&lt;span style="color:#e6db74"&gt;&amp;#34;User with id=&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; already exists&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; user;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Обновляет или создаёт (upsert) пользователя.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; User &lt;span style="color:#a6e22e"&gt;upsert&lt;/span&gt;(User user) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; validateUser(user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; users.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;(), user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; user;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Возвращает пользователя по id.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Optional.&lt;span style="color:#a6e22e"&gt;ofNullable&lt;/span&gt;(users.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(id));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Удаляет пользователя по id. Возвращает true, если удалён.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;delete&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;(id) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Возвращает неизменяемый снимок списка пользователей.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Важно: элементы могут быть изменяемыми, продумай иммутабельность User.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getAll&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Быстрый снимок без лишних копий значений&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;copyOf&lt;/span&gt;(users.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;exists&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;containsKey&lt;/span&gt;(id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validateUser&lt;/span&gt;(User user) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (user &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;user must not be null&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (user.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;user.id must not be null&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Дополнительно к улучшениям:&lt;/p&gt;</description></item><item><title>Code Review: OrderService</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review/</guid><description>&lt;h4&gt;69. Code Review: OrderService&lt;/h4&gt;
 &lt;p&gt;🔥 Посмотри код и ответь:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Что бы ты в нём исправил?&lt;/li&gt;
&lt;li&gt;По задаче: как сделал бы валидацию? Допустим, по REST’у пришла &lt;code&gt;OrderDto&lt;/code&gt;. Как бы её валидировал?&lt;/li&gt;
&lt;li&gt;Где делать проверки на &lt;code&gt;null&lt;/code&gt; параметров метода?&lt;/li&gt;
&lt;li&gt;Смотря на &lt;code&gt;OrderService&lt;/code&gt;, что бы ты тут оставил?&lt;/li&gt;
&lt;li&gt;При каком сценарии транзакция в &lt;code&gt;processOrder&lt;/code&gt; откатится?&lt;/li&gt;
&lt;li&gt;Как изменить класс, чтобы соблюдалось &lt;strong&gt;SRP&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Что будем записывать в таблицу?&lt;/li&gt;
&lt;li&gt;Какие риски могут возникнуть при сохранении в БД?&lt;/li&gt;
&lt;li&gt;Допустим, &lt;code&gt;saveOrder&lt;/code&gt; выкинул exception — что произойдет?&lt;/li&gt;
&lt;li&gt;В методе &lt;code&gt;updateInventory&lt;/code&gt; мы увеличиваем или уменьшаем инвентарь?&lt;/li&gt;
&lt;li&gt;Что делает метод &lt;code&gt;decreaseStock&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;countByCustomerType&lt;/code&gt; будет работать? Реализация сформируется?&lt;/li&gt;
&lt;li&gt;Где писать SQL в интерфейсе?&lt;/li&gt;
&lt;li&gt;Реализация &lt;code&gt;findByOrderId&lt;/code&gt; сформируется?&lt;/li&gt;
&lt;li&gt;Какие ещё моменты выделил бы?&lt;/li&gt;
&lt;li&gt;Какие паттерны нарушены в этом сервисе?&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; InventoryRepository inventoryRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; NotificationService notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processOrder&lt;/span&gt;(Order order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; validateOrder(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; calculateTotalPrice(order.&lt;span style="color:#a6e22e"&gt;getItems&lt;/span&gt;(), order.&lt;span style="color:#a6e22e"&gt;getCustomerType&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; saveOrder(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notifyCustomer(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; updateInventory(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculateTotalPrice&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;OrderItem&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; items, String customerType) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; total &lt;span style="color:#f92672"&gt;=&lt;/span&gt; items.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;mapToDouble&lt;/span&gt;(item &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; item.&lt;span style="color:#a6e22e"&gt;getPrice&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt; item.&lt;span style="color:#a6e22e"&gt;getQuantity&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;VIP&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(customerType)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; 0.&lt;span style="color:#a6e22e"&gt;9&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;LOYALTY&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(customerType)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; 0.&lt;span style="color:#a6e22e"&gt;85&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (orderRepository.&lt;span style="color:#a6e22e"&gt;countByCustomerType&lt;/span&gt;(customerType) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 10) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; 0.&lt;span style="color:#a6e22e"&gt;95&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Доп. скидка для постоянных клиентов&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; total;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;saveOrder&lt;/span&gt;(Order order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;updateInventory&lt;/span&gt;(Order order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;getItems&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(item &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inventoryRepository.&lt;span style="color:#a6e22e"&gt;decreaseStock&lt;/span&gt;(item.&lt;span style="color:#a6e22e"&gt;getProductId&lt;/span&gt;(), item.&lt;span style="color:#a6e22e"&gt;getQuantity&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderRepository&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; JpaRepository&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order, Long&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countByCustomerType&lt;/span&gt;(String customerType);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Order &lt;span style="color:#a6e22e"&gt;findByOrderId&lt;/span&gt;(Long id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для DTO можно использовать &lt;code&gt;javax.validation&lt;/code&gt; (&lt;code&gt;@NotNull&lt;/code&gt;, &lt;code&gt;@Size&lt;/code&gt;, &lt;code&gt;@Positive&lt;/code&gt;).&lt;br&gt;
💡 Проверки на &lt;code&gt;null&lt;/code&gt; лучше делать на границах (например, в контроллере или слое валидаторов).&lt;br&gt;
💡 В &lt;code&gt;OrderService&lt;/code&gt; стоит оставить только orchestration (координацию), вынеся бизнес-логику в отдельные сервисы.&lt;br&gt;
💡 Транзакция откатится, если внутри метода возникнет неперехваченное &lt;code&gt;RuntimeException&lt;/code&gt; или &lt;code&gt;Error&lt;/code&gt;.&lt;br&gt;
💡 SRP нарушен: класс одновременно валидирует, считает скидки, сохраняет и уведомляет. Нужно разделить.&lt;br&gt;
💡 Риски в БД: дедлоки, нарушение ограничений, частичные изменения при падении.&lt;br&gt;
💡 &lt;code&gt;decreaseStock&lt;/code&gt; уменьшает количество на складе. Если нужно увеличение — другой метод.&lt;br&gt;
💡 &lt;code&gt;countByCustomerType&lt;/code&gt; и &lt;code&gt;findByOrderId&lt;/code&gt; корректно сгенерируются Spring Data JPA. SQL писать не нужно, но можно через &lt;code&gt;@Query&lt;/code&gt;.&lt;br&gt;
💡 Нарушен паттерн &lt;strong&gt;Single Responsibility&lt;/strong&gt; и &lt;strong&gt;Separation of Concerns&lt;/strong&gt;. Код &amp;ldquo;толстого&amp;rdquo; сервиса.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; InventoryService inventoryService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; PricingService pricingService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; NotificationService notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; OrderValidator orderValidator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt;(OrderRepository orderRepository,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; InventoryService inventoryService,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PricingService pricingService,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NotificationService notificationService,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OrderValidator orderValidator) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;orderRepository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;inventoryService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; inventoryService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pricingService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pricingService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;notificationService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;orderValidator&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderValidator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processOrder&lt;/span&gt;(Order order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderValidator.&lt;span style="color:#a6e22e"&gt;validate&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; totalPrice &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pricingService.&lt;span style="color:#a6e22e"&gt;calculateTotalPrice&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getItems&lt;/span&gt;(), order.&lt;span style="color:#a6e22e"&gt;getCustomerType&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setTotal&lt;/span&gt;(totalPrice);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inventoryService.&lt;span style="color:#a6e22e"&gt;decreaseInventory&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getItems&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;notifyCustomer&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;OrderValidator&lt;/code&gt; отвечает за валидацию DTO (&lt;code&gt;@NotNull&lt;/code&gt;, &lt;code&gt;@Size&lt;/code&gt; и т. д.).&lt;/p&gt;</description></item><item><title>Code Review: OrderService</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-review2/</guid><description>&lt;h4&gt;70. Code Review: OrderService&lt;/h4&gt;
 &lt;p&gt;🔥 Сделай ревью кода ниже. На что обратить внимание, что исправить, какие риски и улучшения возможны?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Inject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; AuditRepository auditRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(Order order) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; OrderValidationException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; saveOrderInternal(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (Throwable e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.&lt;span style="color:#a6e22e"&gt;printStackTrace&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; OrderSaveException(e, order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;saveOrderInternal&lt;/span&gt;(Order order) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; OrderValidationException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; auditRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (order.&lt;span style="color:#a6e22e"&gt;getClient&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; OrderValidationException(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Поле клиент не заполнено.&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderValidationException&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Не смешивай разные DI-аннотации: выбери &lt;code&gt;@Autowired&lt;/code&gt; или &lt;code&gt;@Inject&lt;/code&gt;.&lt;br&gt;
💡 Не используй &lt;code&gt;Throwable&lt;/code&gt; в &lt;code&gt;catch&lt;/code&gt;: лучше &lt;code&gt;Exception&lt;/code&gt; или более узкий тип.&lt;br&gt;
💡 Валидацию лучше делать &lt;strong&gt;до сохранения&lt;/strong&gt;, а не посреди транзакции.&lt;br&gt;
💡 Для строк используй &lt;code&gt;isEmpty()&lt;/code&gt; или &lt;code&gt;StringUtils.isBlank()&lt;/code&gt;, а не &lt;code&gt;== &amp;quot;&amp;quot;&lt;/code&gt;.&lt;br&gt;
💡 Метод &lt;code&gt;saveOrderInternal&lt;/code&gt; приватный, но аннотация &lt;code&gt;@Transactional&lt;/code&gt; не подействует на внутренние вызовы.&lt;br&gt;
💡 &lt;code&gt;auditRepository.save(order)&lt;/code&gt; до валидации — может оставить “грязные” записи.&lt;br&gt;
💡 Лучше работать с кастомными исключениями: checked vs unchecked. Обычно для бизнес-исключений делают &lt;code&gt;RuntimeException&lt;/code&gt;.&lt;br&gt;
💡 Логирование через &lt;code&gt;logger.error(...)&lt;/code&gt;, а не &lt;code&gt;printStackTrace()&lt;/code&gt;.&lt;br&gt;
💡 Нарушение SRP: класс одновременно отвечает за валидацию, сохранение и аудит.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; AuditRepository auditRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; OrderValidator orderValidator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Logger log &lt;span style="color:#f92672"&gt;=&lt;/span&gt; LoggerFactory.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(OrderService.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt;(OrderRepository orderRepository,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AuditRepository auditRepository,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OrderValidator orderValidator) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;orderRepository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;auditRepository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; auditRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;orderValidator&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderValidator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(Order order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderValidator.&lt;span style="color:#a6e22e"&gt;validate&lt;/span&gt;(order); &lt;span style="color:#75715e"&gt;// валидация до сохранения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; auditRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (OrderValidationException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log.&lt;span style="color:#a6e22e"&gt;warn&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Ошибка валидации заказа: {}&amp;#34;&lt;/span&gt;, order, e);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; e;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (Exception e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Ошибка сохранения заказа: {}&amp;#34;&lt;/span&gt;, order, e);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; OrderSaveException(e, order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderValidator&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validate&lt;/span&gt;(Order order) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; OrderValidationException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (order.&lt;span style="color:#a6e22e"&gt;getClient&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;getClient&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;getClient&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;isBlank&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; OrderValidationException(&lt;span style="color:#e6db74"&gt;&amp;#34;Поле клиент не заполнено.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Валидация вынесена в отдельный класс.&lt;/p&gt;</description></item><item><title>Code Review: Метод find в сервисе интернет-магазина</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-products-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-products-review/</guid><description>&lt;h4&gt;78. Code Review: Метод find в сервисе интернет-магазина&lt;/h4&gt;
 &lt;p&gt;🔥 Пользователь заходит на страничку магазина, выбирает фильтры для отображения товаров. Фильтров больше 5. Когда пользователь выбрал фильтры и нажал Найти, к нам на бэк поступает запрос, и прилетает в этот участок кода, в метод find(Filter filter). Мы ищем кол-во товаров, которые удовлетворяют фильтру. Если их больше 0, то загружаем товары, иначе возвращаем пустой список. Этот метод вызывается 200 раз в секунду. В 50 процентах случаев count = 0&lt;/p&gt;</description></item><item><title>Code Review: Синхронизация критической секции в двух потоках</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sync-critical-section/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sync-critical-section/</guid><description>&lt;h4&gt;79. Code Review: Синхронизация критической секции в двух потоках&lt;/h4&gt;
 &lt;p&gt;🔥 В текущем коде создаётся новый &lt;code&gt;Object&lt;/code&gt; для синхронизации при каждом вызове &lt;code&gt;doSome()&lt;/code&gt;, поэтому потоки синхронизируются на &lt;strong&gt;разных&lt;/strong&gt; мониторах — критическая секция фактически не защищена. Кроме того, вызов &lt;code&gt;new Service.doSome()&lt;/code&gt; некорректен по синтаксису, а &lt;code&gt;main&lt;/code&gt; должен быть &lt;code&gt;static&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; execute(()&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Service.&lt;span style="color:#a6e22e"&gt;doSome&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; execute(()&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Service.&lt;span style="color:#a6e22e"&gt;doSome&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doSome&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Object obj &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Object();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt;(obj){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Не создавай монитор внутри метода — он будет разным для каждого вызова. Держи общий &lt;code&gt;lock&lt;/code&gt; в поле экземпляра (или используй &lt;code&gt;synchronized&lt;/code&gt; на &lt;code&gt;this&lt;/code&gt;).&lt;br&gt;
💡 Запускай оба потока на &lt;strong&gt;одном и том же&lt;/strong&gt; экземпляре &lt;code&gt;Service&lt;/code&gt;, иначе будут разные мониторы.&lt;br&gt;
💡 Исправь сигнатуру &lt;code&gt;main&lt;/code&gt; на &lt;code&gt;public static void main(String[] args)&lt;/code&gt; и вызовы лямбд (&lt;code&gt;service::doSome&lt;/code&gt;).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение (альтернатива с synchronized-методом)&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Service service &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Service();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; execute(service::doSome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; execute(service::doSome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;execute&lt;/span&gt;(Runnable r) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Thread(r).&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doSome&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; critical(); &lt;span style="color:#75715e"&gt;// критическая секция вызовом синхронизированного метода&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;critical&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// code (критическая секция)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Синхронизация на &lt;code&gt;this&lt;/code&gt; через &lt;code&gt;synchronized&lt;/code&gt;-метод обеспечивает взаимное исключение между потоками на одном экземпляре.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>CRUD для сущностей "Книги" и "Авторы"</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-crud-books/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-crud-books/</guid><description>&lt;h4&gt;25. Реализовать CRUD для сущностей &amp;#34;Книги&amp;#34; и &amp;#34;Авторы&amp;#34;&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Опишите CRUD операции для сущностей, используя формат &amp;ldquo;GET /some/path 200;&amp;rdquo;.&lt;br&gt;
Нужно реализовать следующие операции для сущности книги (BookEntity) с учётом таблиц: books, authors, books_authors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Получение всех книг&lt;/li&gt;
&lt;li&gt;Получение конкретной книги&lt;/li&gt;
&lt;li&gt;Обновление книги&lt;/li&gt;
&lt;li&gt;Создание книги&lt;/li&gt;
&lt;li&gt;Удаление книги&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте принципы REST для формирования эндпоинтов.&lt;br&gt;
💡 Подбирайте соответствующие HTTP методы для каждой операции: GET для получения, POST для создания, PUT для обновления и DELETE для удаления.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. Получение всех книг: GET /books
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Этот эндпоинт возвращает список всех книг из таблицы &amp;#34;books&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. Получение конкретной книги: GET /books/{id}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Эндпоинт для получения данных конкретной книги по уникальному идентификатору {id}.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. Обновление книги: PUT /books/{id}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Используется для обновления информации о книге. Клиент отправляет новые данные, и сервер возвращает обновлённую книгу.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4. Создание книги: POST /books
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Эндпоинт для создания новой книги. При успешном создании возвращается статус 201 (Created).
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5. Удаление книги: DELETE /books/{id}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Эндпоинт для удаления книги по {id}. Возвращает статус 204 (No Content) при успешном удалении.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Эти CRUD операции можно аналогичным образом определить и для сущности автора (AuthorEntity), если потребуется. 😊&lt;/p&gt;</description></item><item><title>REST эндпоинт: получить все записи из таблицы Demands</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rest-get-all-demands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-rest-get-all-demands/</guid><description>&lt;h4&gt;93. REST эндпоинт: получить все записи из таблицы Demands&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В базе есть таблица &lt;code&gt;Demands&lt;/code&gt;. Фронт-разработчик просит сделать REST-эндпоинт, который вернёт &lt;strong&gt;все строки&lt;/strong&gt; из этой таблицы.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Demands
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+----+-------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| id | name | status |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+----+-------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 1 | name1 | GOOD |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 2 | name2 | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 3 | name3 | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| 4 | name4 | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+----+-------+--------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Нужно написать минимальный набор кода (Entity + Repository + Controller), чтобы по HTTP-запросу фронт получил список всех &lt;code&gt;Demands&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Self‑inject для корректного создания транзакций</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-self-injection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-self-injection/</guid><description>&lt;h4&gt;55. Self‑inject для корректного создания транзакций&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
Дан код. Есть сервис с двумя методами a() и b(). Из b() вызывается a(). Если извне происходит вызов метода b(), сколько будет создано транзакций? Как поправить тот факт, что в таком вызове будет 0 транзакций, чтобы proxy создался и отработала вся логика? Напиши self-inject&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SomeService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SomeService.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Spring AOP создает прокси вокруг бина и перехватывает только &lt;strong&gt;внешние&lt;/strong&gt; вызовы.&lt;br&gt;
💡 Внутренний вызов через &lt;code&gt;this.a()&lt;/code&gt; &lt;strong&gt;обходит&lt;/strong&gt; прокси, поэтому аннотация &lt;code&gt;@Transactional&lt;/code&gt; не применяется.&lt;br&gt;
💡 Нужно вызывать &lt;code&gt;a()&lt;/code&gt; через прокси-бин: внедрить сам &lt;code&gt;SomeService&lt;/code&gt; в него же (self‑injection).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SomeService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// self‑inject прокси&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; SomeService self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SomeService&lt;/span&gt;(SomeService self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;self&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// логика, работающая в транзакции&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// вместо this.a() использовать прокси&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Что происходит:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Stream API — удвоенные нечётные числа</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-odd-doubled/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-odd-doubled/</guid><description>&lt;h4&gt;6. Stream API — удвоенные нечётные числа&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дан массив натуральных чисел от 0 до 100. С помощью &lt;strong&gt;Stream API&lt;/strong&gt; нужно получить коллекцию удвоенных нечетных чисел.&lt;/p&gt;
&lt;p&gt;Пример:&lt;br&gt;
Вход: &lt;code&gt;[0, 1, 2, 3, 4, 5]&lt;/code&gt;&lt;br&gt;
Выход: &lt;code&gt;[2, 6, 10]&lt;/code&gt;&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;code&gt;IntStream.rangeClosed(0, 100)&lt;/code&gt; для генерации чисел.&lt;br&gt;
💡 Чтобы оставить только нечетные — &lt;code&gt;.filter(n -&amp;gt; n % 2 != 0)&lt;/code&gt;.&lt;br&gt;
💡 Чтобы удвоить — &lt;code&gt;.map(n -&amp;gt; n * 2)&lt;/code&gt;.&lt;br&gt;
💡 Чтобы собрать в коллекцию — &lt;code&gt;.boxed().collect(Collectors.toList())&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.IntStream;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TaskStreamOddDoubled&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; IntStream.&lt;span style="color:#a6e22e"&gt;rangeClosed&lt;/span&gt;(0, 100)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; n &lt;span style="color:#f92672"&gt;%&lt;/span&gt; 2 &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; n &lt;span style="color:#f92672"&gt;*&lt;/span&gt; 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;boxed&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Мы генерируем числа от 0 до 100 через &lt;code&gt;IntStream.rangeClosed&lt;/code&gt;.&lt;br&gt;
Отбираем нечетные фильтром.&lt;br&gt;
Применяем &lt;code&gt;map&lt;/code&gt; для удвоения каждого числа.&lt;br&gt;
Дальше преобразуем к объектам (&lt;code&gt;.boxed()&lt;/code&gt;) и собираем в список. ✅&lt;/p&gt;</description></item><item><title>Алгоритм подсчёта вхождений элементов списка</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-count-elements/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-count-elements/</guid><description>&lt;h4&gt;77. Алгоритм подсчёта вхождений элементов списка&lt;/h4&gt;
 &lt;p&gt;🔥 Нужно реализовать метод, который принимает список &lt;code&gt;Integer&lt;/code&gt; и возвращает структуру с уникальными элементами и количеством их вхождений.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Utils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// на вход список целых чисел, необходимо получить структуру: уникальные элементы и их кол-во&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// пример: 1 2 11 2 11 9 11 1 2 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// структура:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1 -&amp;gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2 -&amp;gt; 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 11 -&amp;gt; 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 9 -&amp;gt; 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countElementItems&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// код тут&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для подсчёта удобно использовать &lt;code&gt;Map&amp;lt;Integer, Integer&amp;gt;&lt;/code&gt;.&lt;br&gt;
💡 Можно воспользоваться &lt;code&gt;HashMap&lt;/code&gt; для скорости, либо &lt;code&gt;TreeMap&lt;/code&gt; для сортировки ключей.&lt;br&gt;
💡 В Java 8+ можно применять &lt;code&gt;Collectors.groupingBy(...)&lt;/code&gt;.&lt;br&gt;
💡 Если список пустой — вернуть пустую структуру.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Реализация через цикл:&lt;/p&gt;</description></item><item><title>Алгоритм фильтрации большой последовательности чисел</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-big-sequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-big-sequence/</guid><description>&lt;h4&gt;76. Алгоритм фильтрации большой последовательности чисел&lt;/h4&gt;
 &lt;p&gt;🔥 Нужно спроектировать метод, который принимает последовательность чисел до &lt;strong&gt;1 Гб&lt;/strong&gt; и возвращает только те значения, которые &lt;strong&gt;&amp;gt; 5&lt;/strong&gt;, при этом доступно 1.1 Гб памяти.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Не загружай всю последовательность в память — обрабатывай её &lt;strong&gt;потоково&lt;/strong&gt;.&lt;br&gt;
💡 В Java можно использовать &lt;code&gt;Stream&lt;/code&gt; или &lt;code&gt;Iterator&lt;/code&gt;, писать в &lt;code&gt;OutputStream&lt;/code&gt; или &lt;code&gt;Writer&lt;/code&gt;.&lt;br&gt;
💡 Если источник — файл, лучше применять &lt;code&gt;BufferedReader&lt;/code&gt; + фильтр.&lt;br&gt;
💡 Если источник — коллекция, и она очень большая, итерируй последовательно, не держа дубликаты.&lt;br&gt;
💡 Для производительности фильтрацию делай «на лету» без промежуточных списков.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Вариант на Java:&lt;/p&gt;</description></item><item><title>БД таблица users, два столбца: id number autoincrement unique, name varchar not unique. Написать запрос, чтобы вывелись имена, которые встречаются 2 и более раз</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicate-names/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicate-names/</guid><description>&lt;h4&gt;9. БД таблица users, два столбца: id number autoincrement unique, name varchar not unique. Написать запрос, чтобы вывелись имена, которые встречаются 2 и более раз&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔎 Нужно найти имена, которые встречаются &lt;strong&gt;2 и более раз&lt;/strong&gt; в таблице &lt;code&gt;users&lt;/code&gt;.&lt;br&gt;
📊 Мы будем группировать по полю &lt;code&gt;name&lt;/code&gt; и фильтровать по количеству таких значений.&lt;br&gt;
🚀 Для подсчета количества будем использовать &lt;strong&gt;&lt;code&gt;COUNT(name)&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
📌 Для фильтрации количества используем &lt;strong&gt;&lt;code&gt;HAVING&lt;/code&gt;&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(name) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Взаимные подписки (mutual follows)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-mutual-followers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-mutual-followers/</guid><description>&lt;h4&gt;35. Взаимные подписки (mutual follows)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица подписок в соцсети:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
user_id | follower_id 
--------+------------ 
1 | 5 
1 | 4 
2 | 3 
3 | 2 
5 | 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Нужно найти пары пользователей, которые &lt;strong&gt;фоловят друг друга&lt;/strong&gt; (не транзитивно), и вывести &lt;code&gt;(user_id, follower_id)&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;strong&gt;само-джойн&lt;/strong&gt; таблицы на условии обратной подписки: &lt;code&gt;t1.user_id = t2.follower_id AND t1.follower_id = t2.user_id&lt;/code&gt;.&lt;br&gt;
💡 Альтернативно можно применить двойной &lt;code&gt;EXISTS&lt;/code&gt;: проверка, что для данной пары существует обратная запись.&lt;br&gt;
💡 Не забудьте исключить дубликаты, чтобы не выводить одну и ту же пару дважды (например, &lt;code&gt;(5,1)&lt;/code&gt; и &lt;code&gt;(1,5)&lt;/code&gt; оба не нужны).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: SELF JOIN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; t1.user_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; t1.follower_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; follows t1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; follows t2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; t1.user_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; t2.follower_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; t1.follower_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; t2.user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; t1.user_id &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; t1.follower_id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: EXISTS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; f1.user_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f1.follower_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; follows f1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; follows f2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; f2.user_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f1.follower_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; f2.follower_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f1.user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; f1.user_id &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; f1.follower_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Второй по величине оклад</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-second-highest-salary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-second-highest-salary/</guid><description>&lt;h4&gt;40. Второй по величине оклад&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;Employee(id, email, salary)&lt;/code&gt;. Нужно получить &lt;strong&gt;второй по величине&lt;/strong&gt; уникальный &lt;code&gt;salary&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;We have table Employee with columns: id, email, salary. 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;How would you get the second highest salary?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Первый вариант — найти максимальный &lt;code&gt;salary&lt;/code&gt; меньше, чем максимальный в таблице, через подзапрос.&lt;br&gt;
💡 Второй вариант — использовать оконную функцию &lt;code&gt;DENSE_RANK()&lt;/code&gt; по &lt;code&gt;salary&lt;/code&gt; в порядке убывания и выбрать ранг = 2.&lt;br&gt;
💡 Не забудьте учесть повторяющиеся оклады: нужны &lt;strong&gt;уникальные&lt;/strong&gt; значения.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 1: Подзапрос
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; second_highest_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; salary &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(salary) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 2: Оконная функция
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; salary &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; second_highest_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DENSE_RANK() OVER (&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; salary &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; rnk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rnk &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Выбери профили, у которых больше 10 постов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-profiles-more-than-10-posts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-profiles-more-than-10-posts/</guid><description>&lt;h4&gt;4. Выбери профили, у которых больше 10 постов&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Таблица profile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; profile (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nickname VARCHAR,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registered_at &lt;span style="color:#66d9ef"&gt;TIMESTAMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Таблица post
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; post (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; owner_id BIGINT &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; profile (id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body TEXT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inserted_at &lt;span style="color:#66d9ef"&gt;TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; likes_count INT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Таблица subscription_count
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; subscription_count (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; profile_id BIGINT &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; profile (id) &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; followers_count INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; following_count INT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 📝 Нужно &lt;strong&gt;подсчитать количество постов&lt;/strong&gt; у каждого пользователя и выбрать тех, у кого их больше 10.&lt;br&gt;
🔗 Для этого &lt;strong&gt;соединяем таблицу &lt;code&gt;profile&lt;/code&gt; с &lt;code&gt;post&lt;/code&gt; по &lt;code&gt;id&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
📊 Используем &lt;strong&gt;&lt;code&gt;GROUP BY&lt;/code&gt; и &lt;code&gt;HAVING&lt;/code&gt;&lt;/strong&gt; для фильтрации.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; p.id, p.nickname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; profile p
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; post po &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; p.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; po.owner_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; p.id, p.nickname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(po.id) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Выбор пяти верхних записей</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-select-top-5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-select-top-5/</guid><description>&lt;h4&gt;30. Выбор пяти верхних записей&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица с колонками &lt;code&gt;key&lt;/code&gt; и &lt;code&gt;value&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key | value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;----+-------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 | sdfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2 | dsfg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3 | sdfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;… | …
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Необходимо выбрать &lt;strong&gt;первые 5 записей&lt;/strong&gt; из этой таблицы.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 В MySQL и PostgreSQL используйте &lt;code&gt;LIMIT 5&lt;/code&gt;.&lt;br&gt;
💡 В стандарте SQL можно применить &lt;code&gt;FETCH FIRST 5 ROWS ONLY&lt;/code&gt;.&lt;br&gt;
💡 В SQL Server используется &lt;code&gt;TOP 5&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1 (MySQL, PostgreSQL):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; your_table
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2 (ANSI SQL):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; your_table
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FETCH&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FIRST&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ROWS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ONLY&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 3 (SQL Server):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; TOP &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; your_table;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Выбрать всех клиентов, у которых больше трех заказов с ценой &gt; 10</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-customers-multiple-orders/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-customers-multiple-orders/</guid><description>&lt;h4&gt;10. Выбрать всех клиентов, у которых больше трех заказов с ценой &amp;gt; 10&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;Customer
- Id
- name

Order
- Id
- customer_id
- Price
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔍 Мы должны выбрать всех клиентов, которые сделали &lt;strong&gt;более трех заказов&lt;/strong&gt;, где &lt;strong&gt;цена&lt;/strong&gt; каждого заказа больше &lt;strong&gt;10&lt;/strong&gt;.&lt;br&gt;
📊 Для этого нужно группировать заказы по &lt;strong&gt;&lt;code&gt;customer_id&lt;/code&gt;&lt;/strong&gt; и подсчитывать количество заказов с ценой выше 10.&lt;br&gt;
📌 Используем &lt;strong&gt;&lt;code&gt;HAVING&lt;/code&gt;&lt;/strong&gt; для фильтрации по количеству заказов.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; o.customer_id, &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Order&lt;/span&gt; o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Customer &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; o.customer_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.Id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.Price &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; o.customer_id, &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(o.Id) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Вывести id классов, у которых нет ни одного студента (без подзапросов)?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-empty-classes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-empty-classes/</guid><description>&lt;h4&gt;7. Вывести id классов, у которых нет ни одного студента (без подзапросов)?&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;Есть 2 таблицы student и class
student:
id - автоинкрементный первичный ключ,
class_id - id класса в котором числится студент
class:
id - автоинкрементный первичный ключ
Нужно написать запрос для вывода id классов,
у которых нет ни одного студента еще.
Ограничения: Запрос надо написать без использования подзапросов.&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🎯 Нужно выбрать классы, в которых &lt;strong&gt;нет студентов&lt;/strong&gt;.&lt;br&gt;
🔗 Таблицы &lt;strong&gt;&lt;code&gt;class&lt;/code&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;code&gt;student&lt;/code&gt;&lt;/strong&gt; связаны через &lt;code&gt;class_id&lt;/code&gt;.&lt;br&gt;
🛑 Важно &lt;strong&gt;отфильтровать&lt;/strong&gt; те классы, у которых &lt;code&gt;student.id IS NULL&lt;/code&gt;.&lt;br&gt;
📊 Используем &lt;strong&gt;&lt;code&gt;LEFT JOIN&lt;/code&gt;&lt;/strong&gt;, чтобы увидеть классы &lt;strong&gt;без соответствий&lt;/strong&gt; в &lt;code&gt;student&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; student s &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.class_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; s.id &lt;span style="color:#66d9ef"&gt;IS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Вывести строку в обратном порядке, каждую вторую букву</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-reverse-every-second-char/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-reverse-every-second-char/</guid><description>&lt;h4&gt;11. Вывести строку в обратном порядке, каждую вторую букву&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан &lt;code&gt;String&lt;/code&gt;.&lt;br&gt;
Нужно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;вывести строку &lt;strong&gt;в обратном порядке&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;взять &lt;strong&gt;каждую вторую букву&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;использовать &lt;strong&gt;Stream API&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;не использовать &lt;code&gt;reverse()&lt;/code&gt;&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;без дополнительных внешних структур данных&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;один конвейер вычислений.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Spring Boot!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Можно стримить индексы строки.&lt;br&gt;
💡 Для разворота — идти от &lt;code&gt;length - 1&lt;/code&gt; к &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
💡 Каждая вторая буква — фильтр по индексу.&lt;br&gt;
💡 &lt;code&gt;mapToObj&lt;/code&gt; → &lt;code&gt;charAt&lt;/code&gt;.&lt;br&gt;
💡 &lt;code&gt;forEach&lt;/code&gt; или &lt;code&gt;collect&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String result &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Stream.&lt;span style="color:#a6e22e"&gt;iterate&lt;/span&gt;(s.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1, i &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; i &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; 0, i &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; i &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(s::charAt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(String::valueOf)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;joining&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(result);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Вывод дерева в виде иерархии</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-print-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-print-tree/</guid><description>&lt;h4&gt;65. Вывод дерева в виде иерархии&lt;/h4&gt;
 &lt;p&gt;Дан код. Написать код в методе printNode(), чтобы вывести дерево в нужном виде&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; test.test4;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Collections;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;* Описание: Дан массив Node со ссылкой на родителя (parentId), необходимо
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;* построить дерево
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Integer id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Integer parentId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Node&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; childNode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(Integer id, Integer parentId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parentId&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parentId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;getParentId&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; parentId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Node&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getChaildNode&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; childNode;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Test4&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Test4 program &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Test4();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; nodes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(1, &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(2, 1),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(3, 1),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(4, 3),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(5, 3),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(6, 5));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; program.&lt;span style="color:#a6e22e"&gt;linkNodes&lt;/span&gt;(nodes);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(program.&lt;span style="color:#a6e22e"&gt;printNode&lt;/span&gt;(nodes.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(0), &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;linkNodes&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Node&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; nodes) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; nodesMap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nodes.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(t &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; t.&lt;span style="color:#a6e22e"&gt;getParentId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;groupingBy&lt;/span&gt;(Node::getParentId));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nodes.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(t &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; t.&lt;span style="color:#a6e22e"&gt;getChaildNode&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;addAll&lt;/span&gt;(nodesMap.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(t.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;(), Collections.&lt;span style="color:#a6e22e"&gt;emptyList&lt;/span&gt;())));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Такое дерево в итоге должно получиться
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; ├── 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; └── 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; ├── 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; └── 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; └── 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;printNode&lt;/span&gt;(Node node, String prefix, String childrenPrefix) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 В методе &lt;code&gt;printNode&lt;/code&gt; нужно добавлять в строку текущий узел (&lt;code&gt;prefix + id&lt;/code&gt;).&lt;br&gt;
💡 Для каждого ребёнка вычислять новый префикс:&lt;/p&gt;</description></item><item><title>Выгрузка всех новостей с комментариями при большом объеме данных</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-export-news-with-comments/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-export-news-with-comments/</guid><description>&lt;h4&gt;21. Выгрузка всех новостей с комментариями при большом объеме данных&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Необходимо получить все записи из таблицы &lt;code&gt;news&lt;/code&gt; и соответствующие комментарии из таблицы &lt;code&gt;comments&lt;/code&gt;, даже при большом объеме данных.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Таблица &lt;code&gt;news&lt;/code&gt; содержит новости (&lt;code&gt;id&lt;/code&gt; — автоинкремент).&lt;/li&gt;
&lt;li&gt;Таблица &lt;code&gt;comments&lt;/code&gt; содержит комментарии (&lt;code&gt;news_id&lt;/code&gt; ссылается на &lt;code&gt;news.id&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Допустим, данных &lt;strong&gt;очень много&lt;/strong&gt;, важно избежать перегрузки.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;strong&gt;постраничную выборку (pagination)&lt;/strong&gt;, чтобы обрабатывать данные частями.&lt;br&gt;
💡 Важно делать &lt;strong&gt;LEFT JOIN&lt;/strong&gt;, чтобы не потерять новости без комментариев.&lt;br&gt;
💡 Можно использовать &lt;strong&gt;потоковую обработку&lt;/strong&gt; или &lt;strong&gt;batch-загрузку&lt;/strong&gt; на стороне кода.&lt;br&gt;
💡 В PostgreSQL можно использовать &lt;code&gt;FETCH NEXT&lt;/code&gt;, в MySQL — &lt;code&gt;LIMIT&lt;/code&gt; и &lt;code&gt;OFFSET&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Пример базового запроса с LEFT JOIN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; n.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; news n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; comments &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; n.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.news_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Как сделать выгрузку эффективной при большом объеме данных:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Генерация ряда Фибоначчи</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fibonacci-sequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fibonacci-sequence/</guid><description>&lt;h4&gt;20. Генерация ряда Фибоначчи&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔢 &lt;strong&gt;Реализуй метод, который принимает число &lt;code&gt;n&lt;/code&gt; и возвращает ряд Фибоначчи длиной &lt;code&gt;n&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;📌 &lt;strong&gt;Пример:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 7 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0, 1, 1, 2, 3, 5, 8&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Ряд Фибоначчи&lt;/strong&gt; – это последовательность чисел, где каждое число равно сумме двух предыдущих:&lt;br&gt;
&lt;code&gt;0, 1, 1, 2, 3, 5, 8, 13, ...&lt;/code&gt;&lt;br&gt;
💡 Для решения можно использовать &lt;strong&gt;итеративный&lt;/strong&gt; или &lt;strong&gt;рекурсивный&lt;/strong&gt; подход.&lt;br&gt;
💡 Оптимальный вариант – использовать &lt;strong&gt;динамическое программирование&lt;/strong&gt; или &lt;strong&gt;итерацию&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;📌 &lt;strong&gt;1. Итеративный способ (быстрее, не требует много памяти)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Гибкий NotificationService с Spring</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-notification-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-notification-service/</guid><description>&lt;h4&gt;41. Гибкий NotificationService с Spring&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Написать сервис &lt;code&gt;Notificator&lt;/code&gt;, который отправляет сообщения через различные внешние библиотеки (Email, SMS и т.д.), с возможностью легко добавлять новые каналы уведомлений, используя возможности Java и Spring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// внешняя библиотека 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmailNotificationService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sendEmail&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Send from email service&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// внешняя библиотека 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SmsNotificationService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sendSms&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Send from sms service&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Ваш код начинается здесь&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NotificationService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmailNotificationAdapter&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; NotificationService {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; EmailNotificationService emailService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmailNotificationAdapter&lt;/span&gt;(EmailNotificationService emailService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;emailService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; emailService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emailService.&lt;span style="color:#a6e22e"&gt;sendEmail&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SmsNotificationAdapter&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; NotificationService {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; SmsNotificationService smsService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SmsNotificationAdapter&lt;/span&gt;(SmsNotificationService smsService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;smsService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; smsService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; smsService.&lt;span style="color:#a6e22e"&gt;sendSms&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Notificator&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NotificationService&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; channels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Notificator&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NotificationService&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; channels) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;channels&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; channels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;notifyAll&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (NotificationService svc : channels) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; svc.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Введите общий интерфейс &lt;code&gt;NotificationService&lt;/code&gt; с методом &lt;code&gt;send(String message)&lt;/code&gt;.&lt;br&gt;
💡 Для каждой внешней библиотеки создайте &lt;strong&gt;адаптер&lt;/strong&gt; (Adapter), реализующий этот интерфейс и обёртывающий вызовы библиотеки.&lt;br&gt;
💡 Используйте &lt;strong&gt;конструкторную инъекцию&lt;/strong&gt; Spring для подключения внешних сервисов.&lt;br&gt;
💡 В &lt;code&gt;Notificator&lt;/code&gt; внедрите &lt;code&gt;List&amp;lt;NotificationService&amp;gt;&lt;/code&gt; — Spring автоматически соберёт все реализации.&lt;br&gt;
💡 Чтобы добавить новую библиотеку, достаточно реализовать ещё один адаптер &lt;code&gt;NotificationService&lt;/code&gt; и зарегистрировать его как Spring-бин.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 1. Общий интерфейс&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NotificationService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 2. Адаптер для Email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmailNotificationAdapter&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; NotificationService {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; EmailNotificationService emailService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmailNotificationAdapter&lt;/span&gt;(EmailNotificationService emailService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;emailService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; emailService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emailService.&lt;span style="color:#a6e22e"&gt;sendEmail&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 3. Адаптер для SMS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SmsNotificationAdapter&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; NotificationService {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; SmsNotificationService smsService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SmsNotificationAdapter&lt;/span&gt;(SmsNotificationService smsService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;smsService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; smsService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; smsService.&lt;span style="color:#a6e22e"&gt;sendSms&lt;/span&gt;(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 4. Сервис-агрегатор уведомлений&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Notificator&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NotificationService&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; channels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Notificator&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;NotificationService&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; channels) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;channels&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; channels;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;notifyAll&lt;/span&gt;(String message) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; channels.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(svc &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; svc.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(message));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Использование в приложении&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppRunner&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; CommandLineRunner {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Notificator notificator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppRunner&lt;/span&gt;(Notificator notificator) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;notificator&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; notificator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run&lt;/span&gt;(String... args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificator.&lt;span style="color:#a6e22e"&gt;notifyAll&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Группировка анаграмм</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-group-anagrams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-group-anagrams/</guid><description>&lt;h4&gt;87. Группировка анаграмм&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
Написать только функцию. На входе массив строк, на выходе сгруппированная структура. Тип выходных данных определяешь сам. Потом скажешь, почему используешь эту структуру. Могут быть записи с повторяющимися элементами. Вывод отсортировать лексикографически. Чем лучше по оценке скорости алгоритма, тем лучше&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Дан массив строк, необходимо сгруппировать анаграммы&lt;/li&gt;
&lt;li&gt;Слово X является анаграммой Y, если одно может быть получено из другого перестановкой букв&lt;/li&gt;
&lt;li&gt;В итоговом массиве каждый массив анаграмм должен быть отсортирован в лексикографическом порядке&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;</description></item><item><title>Группы без услуг</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-groups-without-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-groups-without-services/</guid><description>&lt;h4&gt;24. Группы без услуг&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Services&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;cost&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;group_id&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groups&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо вывести &lt;strong&gt;названия групп&lt;/strong&gt;, в которых &lt;strong&gt;нет ни одной услуги&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;strong&gt;LEFT JOIN&lt;/strong&gt; между &lt;code&gt;Groups&lt;/code&gt; и &lt;code&gt;Services&lt;/code&gt;, а в &lt;code&gt;WHERE&lt;/code&gt; проверяйте &lt;code&gt;NULL&lt;/code&gt; в полях &lt;code&gt;Services&lt;/code&gt;.&lt;br&gt;
💡 Альтернативно, примените &lt;strong&gt;NOT EXISTS&lt;/strong&gt; с подзапросом, проверяющим отсутствие услуг в группе.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: LEFT JOIN + фильтрация по NULL 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt;.name 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Groups &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Services s &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt;.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.group_id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; s.id &lt;span style="color:#66d9ef"&gt;IS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: NOT EXISTS 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt;.name 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Groups &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; ( 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Services s 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; s.group_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;g&lt;/span&gt;.id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Дан проект. Все недочеты кода надо править. На основании данного кода нужно создать фреймворк игрового 2D мира, то есть нарастить код</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-game-framework-refactoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-game-framework-refactoring/</guid><description/></item><item><title>Даны две таблицы Persosn и Payments. Один-ко-многим. Справа описание. Напишите запрос, который выводит name и value</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-persons-payments/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-persons-payments/</guid><description>&lt;h4&gt;5. Даны две таблицы Persosn и Payments. Один-ко-многим. Справа описание. Напишите запрос, который выводит name и value&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;Даны две таблицы :
Persons co списком работников

id name
1 Petya
2 Vasya
3 Kolya

Payments с зарплатными начислениями ежемесячно

id persons_id value
1 1 10
2 1 20
3 3 15
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 📝 Нужно &lt;strong&gt;объединить две таблицы&lt;/strong&gt; (&lt;code&gt;Persons&lt;/code&gt; и &lt;code&gt;Payments&lt;/code&gt;) по &lt;code&gt;persons_id&lt;/code&gt;.&lt;br&gt;
🔗 Используем &lt;strong&gt;&lt;code&gt;JOIN&lt;/code&gt;&lt;/strong&gt; для связи.&lt;br&gt;
📊 Выводим &lt;strong&gt;имя (&lt;code&gt;name&lt;/code&gt;) и сумму &lt;code&gt;value&lt;/code&gt; для каждого платежа&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; p.name, pay.value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Persons p
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Payments pay &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; p.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pay.persons_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Делегаты клиентов: найти по INN/KPP, вывести имя и телефон</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-delegates-by-inn-kpp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-delegates-by-inn-kpp/</guid><description>&lt;h4&gt;17. Делегаты клиентов: найти по INN/KPP, вывести имя и телефон&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Написать SQL-запрос для получения списка делегатов (&lt;code&gt;KF_ADAPTER_R_DELEGATE&lt;/code&gt;) по &lt;code&gt;inn&lt;/code&gt; и &lt;code&gt;kpp&lt;/code&gt; из таблицы &lt;code&gt;KF_ADAPTER_R_CLIENT&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Необходимо вывести только &lt;code&gt;full_name&lt;/code&gt; (полное имя) и &lt;code&gt;phone&lt;/code&gt; (телефон).&lt;/li&gt;
&lt;li&gt;Таблицы связаны по &lt;code&gt;client_id&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; KF_ADAPTER_R_CLIENT (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; branch_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_branch_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; short_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inn VARCHAR(&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kpp VARCHAR(&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sign_count INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleted BOOLEAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; KF_ADAPTER_R_DELEGATE (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client_id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; full_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; phone VARCHAR(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sign_role VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleted BOOLEAN,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (client_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; KF_ADAPTER_R_CLIENT(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Связь между таблицами идет по &lt;strong&gt;client_id&lt;/strong&gt;.&lt;br&gt;
💡 Для соединения таблиц используем &lt;code&gt;JOIN&lt;/code&gt;.&lt;br&gt;
💡 Фильтруем данные по &lt;code&gt;inn&lt;/code&gt; и &lt;code&gt;kpp&lt;/code&gt; из таблицы &lt;code&gt;KF_ADAPTER_R_CLIENT&lt;/code&gt;.&lt;br&gt;
💡 Если необходимо исключить удаленных (&lt;code&gt;deleted = TRUE&lt;/code&gt;), добавляем соответствующий фильтр.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; d.full_name, d.phone 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; KF_ADAPTER_R_DELEGATE d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; KF_ADAPTER_R_CLIENT &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; d.client_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.inn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;7701234567&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.kpp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;770101001&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; d.deleted &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Департаменты с количеством сотрудников больше трёх</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-more-than-three-users/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-more-than-three-users/</guid><description>&lt;h4&gt;65. Департаменты с количеством сотрудников больше трёх&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы &lt;code&gt;department&lt;/code&gt; и &lt;code&gt;users&lt;/code&gt;.&lt;br&gt;
Нужно вывести &lt;strong&gt;департаменты&lt;/strong&gt;, в которых &lt;strong&gt;количество сотрудников больше 3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Схема данных:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; department (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id BIGINT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; users (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id BIGINT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; full_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id BIGINT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; fk_department
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (department_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; department(department_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нужно посчитать количество сотрудников по каждому департаменту.&lt;br&gt;
💡 Используем &lt;code&gt;GROUP BY department_id&lt;/code&gt;.&lt;br&gt;
💡 Фильтрация по количеству выполняется через &lt;code&gt;HAVING&lt;/code&gt;, а не &lt;code&gt;WHERE&lt;/code&gt;.&lt;br&gt;
💡 Чтобы вывести название департамента — делаем &lt;code&gt;JOIN&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.department_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.department_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(u.user_id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; user_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; users u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.department_id, d.department_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(u.user_id) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Дженерик: получить первый элемент коллекции произвольного типа</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-generic-first-element/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-generic-first-element/</guid><description>&lt;h4&gt;86. Дженерик: получить первый элемент коллекции произвольного типа&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно написать метод, который достаёт &lt;strong&gt;один элемент&lt;/strong&gt; из коллекции и сохраняет его &lt;strong&gt;тип&lt;/strong&gt;. Элементы коллекции могут быть произвольного типа. Желательно, чтобы решение было безопасным по типам и не требовало кастов.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; T &lt;span style="color:#a6e22e"&gt;getFirstElementOfList&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0 &lt;span style="color:#f92672"&gt;?&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(0) : &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Object &lt;span style="color:#f92672"&gt;-&lt;/span&gt; Number &lt;span style="color:#f92672"&gt;-&lt;/span&gt; Integer &lt;span style="color:#f92672"&gt;-&lt;/span&gt; AtomicInteger
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt; producer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;method(List&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt; consumer)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 В объявлении метода нужен собственный параметр типа: &lt;code&gt;public static &amp;lt;T&amp;gt; ...&lt;/code&gt;.&lt;br&gt;
💡 Возвращать &lt;code&gt;null&lt;/code&gt; неудобно и небезопасно — лучше &lt;code&gt;Optional&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;br&gt;
💡 Для чтения из коллекции используйте wildcard &lt;code&gt;? extends T&lt;/code&gt; (&lt;strong&gt;PECS&lt;/strong&gt;: &lt;em&gt;Producer Extends&lt;/em&gt;).&lt;br&gt;
💡 Для записи в коллекцию используйте &lt;code&gt;? super T&lt;/code&gt; (&lt;strong&gt;Consumer Super&lt;/strong&gt;).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Безопасный по типам вариант: не возвращаем null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;firstOf&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (list &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Optional.&lt;span style="color:#a6e22e"&gt;empty&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Optional.&lt;span style="color:#a6e22e"&gt;ofNullable&lt;/span&gt;(list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(0));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Если строго нужен T (не Optional) — допускаем null,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// но такой вариант менее предпочтителен&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; T &lt;span style="color:#a6e22e"&gt;firstOrNull&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (list &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; : list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(0);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Демонстрация PECS для producer/consumer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// producer: читаем элементы (коллекция производит T) → ? extends T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodProducer&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; producer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// можно читать как T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (T t : producer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// use t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// producer.add(...) — НЕЛЬЗЯ (неизвестный подтип)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// consumer: записываем элементы (коллекция потребляет T) → ? super T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodConsumer&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; consumer, T value) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; consumer.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(value); &lt;span style="color:#75715e"&gt;// можно добавлять T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// чтение даёт Object (безопасного downcast нет)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Object any &lt;span style="color:#f92672"&gt;=&lt;/span&gt; consumer.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(0);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Примеры использования с иерархией типов:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; ints &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(1, 2, 3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Number&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Number&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(10.&lt;span style="color:#a6e22e"&gt;5&lt;/span&gt;, 20.&lt;span style="color:#a6e22e"&gt;0&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Object&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; objs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// firstOf сохраняет точный тип вывода:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; i1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; firstOf(ints); &lt;span style="color:#75715e"&gt;// Optional&amp;lt;Integer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Number&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; n1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; firstOf(nums); &lt;span style="color:#75715e"&gt;// Optional&amp;lt;Number&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(i1.&lt;span style="color:#a6e22e"&gt;orElse&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;1)); &lt;span style="color:#75715e"&gt;// 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(n1.&lt;span style="color:#a6e22e"&gt;orElse&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;1)); &lt;span style="color:#75715e"&gt;// 10.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// PECS:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; methodProducer(ints); &lt;span style="color:#75715e"&gt;// List&amp;lt;? extends T&amp;gt; — ок для чтения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; methodConsumer(objs, &lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// List&amp;lt;? super T&amp;gt; — ок для записи String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; methodConsumer(nums, 42); &lt;span style="color:#75715e"&gt;// запись Integer в List&amp;lt;? super Integer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Имена, встречающиеся более 5 раз</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-names-occurring-more-than-5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-names-occurring-more-than-5/</guid><description>&lt;h4&gt;28. Имена, встречающиеся более 5 раз&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;students(name text, &amp;quot;group&amp;quot; text, cource bigint)&lt;/code&gt; в PostgreSQL.&lt;br&gt;
Необходимо посчитать и вывести те &lt;code&gt;name&lt;/code&gt;, которые в таблице встречаются более 5 раз.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY name&lt;/code&gt; для агрегирования по имени.&lt;br&gt;
💡 Примените &lt;code&gt;HAVING COUNT(*) &amp;gt; 5&lt;/code&gt; для фильтрации групп с более чем 5 вхождениями.&lt;br&gt;
💡 Альтернативное решение — воспользоваться оконной функцией &lt;code&gt;COUNT(*) OVER (PARTITION BY name)&lt;/code&gt; и обернуть в подзапрос с фильтром.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: GROUP BY + HAVING
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; students
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Оконная функция + DISTINCT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; name) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; name_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; students
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; name_count &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Инверсия числа</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-number/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-number/</guid><description>&lt;h4&gt;31. Инверсия числа&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Написать метод, который принимает целое число, инвертирует его цифры и возвращает инвертированное число.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Примеры:
&lt;ul&gt;
&lt;li&gt;Было: -123, стало: -321&lt;/li&gt;
&lt;li&gt;Было: 1121, стало: 1211&lt;/li&gt;
&lt;li&gt;Диапазон допустимых чисел: от -10000 до 10000.&lt;/li&gt;
&lt;li&gt;Если число вне диапазона, сообщите об этом пользователю API.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Диапазон:&lt;/strong&gt; Проверь диапазон входного числа до начала инверсии.&lt;br&gt;
💡 &lt;strong&gt;Инверсия цифр:&lt;/strong&gt; Используй цикл while, чтобы последовательно извлекать и собирать цифры числа.&lt;br&gt;
💡 &lt;strong&gt;Обработка знака:&lt;/strong&gt; Сохрани знак числа и применяй его после инверсии.&lt;br&gt;
💡 &lt;strong&gt;Отладка:&lt;/strong&gt; Добавь вывод сообщения, если число выходит за допустимый диапазон.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NumberUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Проверка диапазона: число должно быть от -10000 до 10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;10000 &lt;span style="color:#f92672"&gt;||&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 10000) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Введённое число &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; выходит за пределы диапазона [-10000, 10000].&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sign &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 0 &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;1 : 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; absX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;abs&lt;/span&gt;(x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; reversed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Инверсия цифр&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (absX &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reversed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; reversed &lt;span style="color:#f92672"&gt;*&lt;/span&gt; 10 &lt;span style="color:#f92672"&gt;+&lt;/span&gt; absX &lt;span style="color:#f92672"&gt;%&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; absX &lt;span style="color:#f92672"&gt;/=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sign &lt;span style="color:#f92672"&gt;*&lt;/span&gt; reversed;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; tests &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#f92672"&gt;-&lt;/span&gt;123, 1121, 15000};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : tests) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; reverse(num);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (result &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Исходное число: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; num &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, инвертированное: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Проверка диапазона:&lt;/strong&gt; Метод обрабатывает входные данные вне допустимого диапазона.&lt;br&gt;
✅ &lt;strong&gt;Корректная инверсия:&lt;/strong&gt; Сохранение знака числа и последовательное извлечение цифр дают правильный результат.&lt;br&gt;
✅ &lt;strong&gt;Читаемость кода:&lt;/strong&gt; Лёгкая для понимания реализация, что упрощает поддержку.&lt;br&gt;
✅ &lt;strong&gt;Пример использования:&lt;/strong&gt; Функция main демонстрирует работу метода с различными входными данными.&lt;/p&gt;</description></item><item><title>Исправление класса Cat4</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-cat4-fix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-cat4-fix/</guid><description>&lt;h4&gt;64. Исправление класса Cat4&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 В классе &lt;code&gt;Cat4&lt;/code&gt; есть ошибки в инициализации полей, работе с потоками и JDBC. Необходимо исправить класс, чтобы он был корректным, потокобезопасным и компилируемым.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Cat4&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;, BigDecimal&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; CACHE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; jumpsCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; cat4Profile;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; DataSource dataSource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Cat4&lt;/span&gt;(DataSource dataSource, List&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataSource&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doRandomJump&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxJumps) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Random rnd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; jumpsToDo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;abs&lt;/span&gt;(rnd.&lt;span style="color:#a6e22e"&gt;nextInt&lt;/span&gt;()) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; maxJumps;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; jumpsToDo; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Thread(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doJump();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }).&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setCat4Profile&lt;/span&gt;(Cat4Profile cat4Profile) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cat4Profile&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cat4Profile;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getCat4Name&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cat4Profile&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getCatName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (NullPointerException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Max&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doJump&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;jumpsCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Logger.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(Cat4.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;fine&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Jump&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doMeow&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Logger.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(Cat4.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;fine&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Meow&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; BigDecimal &lt;span style="color:#a6e22e"&gt;doQuery&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; parameters) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; SQLException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Connection conn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Statement stmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; conn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dataSource.&lt;span style="color:#a6e22e"&gt;getConnection&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; conn.&lt;span style="color:#a6e22e"&gt;createStatement&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResultSet resultSet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; stmt.&lt;span style="color:#a6e22e"&gt;executeQuery&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;select weight from Cat where name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; String(parameters) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;)&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resultSet.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; resultSet.&lt;span style="color:#a6e22e"&gt;getBigDecimal&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;weight&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;finally&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (stmt &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stmt.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (conn &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; conn.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getJumpsCount&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; jumpsCount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; jumpsCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setJumpsCount&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;jumpsCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Инициализация полей в конструкторе должна быть через &lt;code&gt;this.field = parameter&lt;/code&gt;.&lt;br&gt;
💡 Для полей класса нельзя использовать &lt;code&gt;var&lt;/code&gt;, нужно указать явный тип.&lt;br&gt;
💡 Увеличение &lt;code&gt;jumpsCount&lt;/code&gt; в многопоточном режиме должно быть потокобезопасным (&lt;code&gt;synchronized&lt;/code&gt;).&lt;br&gt;
💡 Для JDBC лучше использовать try-with-resources.&lt;br&gt;
💡 Строковые литералы нужно оформлять правильно (&lt;code&gt;&amp;quot;Max&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;Jump!&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;Meow!&amp;quot;&lt;/code&gt;).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.math.BigDecimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.sql.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Random;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.concurrent.ConcurrentHashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.logging.Logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; javax.sql.DataSource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Cat4&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;, BigDecimal&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; CACHE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; jumpsCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Cat4Profile cat4Profile;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; DataSource dataSource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Cat4&lt;/span&gt;(DataSource dataSource, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataSource&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dataSource;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doRandomJump&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxJumps) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Random rnd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; jumpsToDo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;abs&lt;/span&gt;(rnd.&lt;span style="color:#a6e22e"&gt;nextInt&lt;/span&gt;()) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; maxJumps;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; jumpsToDo; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Thread(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;::doJump).&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setCat4Profile&lt;/span&gt;(Cat4Profile cat4Profile) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cat4Profile&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cat4Profile;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getCat4Name&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cat4Profile &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cat4Profile.&lt;span style="color:#a6e22e"&gt;getCatName&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Max&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doJump&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;jumpsCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Logger.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(Cat4.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;fine&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Jump!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doMeow&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Logger.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(Cat4.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;fine&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Meow!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; BigDecimal &lt;span style="color:#a6e22e"&gt;doQuery&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; parameters) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; SQLException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; (Connection conn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dataSource.&lt;span style="color:#a6e22e"&gt;getConnection&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Statement stmt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; conn.&lt;span style="color:#a6e22e"&gt;createStatement&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResultSet rs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; stmt.&lt;span style="color:#a6e22e"&gt;executeQuery&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;select weight from Cat where name = &amp;#39;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; String(parameters) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rs.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; rs.&lt;span style="color:#a6e22e"&gt;getBigDecimal&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getJumpsCount&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; jumpsCount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; jumpsCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;incrementJumpsCount&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;jumpsCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Исправление ошибок Spring Boot приложения</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-spring-app-code-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-spring-app-code-errors/</guid><description>&lt;h4&gt;27. Исправление ошибок в Spring Boot приложении&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Исправить ошибки в коде Spring Boot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; com.home.app;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.boot.SpringApplication;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.boot.autoconfigure.SpringBootApplication;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@SpringBootApplication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SpringApplication.&lt;span style="color:#a6e22e"&gt;run&lt;/span&gt;(App.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;, args);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; com.home.controller;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.boot.SpringApplication;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.boot.autoconfigure.SpringBootApplication;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Controller&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;test&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Раздели классы по файлам:&lt;/strong&gt; Каждый файл должен содержать одно объявление package.&lt;br&gt;
💡 &lt;strong&gt;Правильные импорты:&lt;/strong&gt; Используй &lt;code&gt;org.springframework.stereotype.Controller&lt;/code&gt; для &lt;code&gt;@Controller&lt;/code&gt; и &lt;code&gt;org.springframework.web.bind.annotation.GetMapping&lt;/code&gt; для &lt;code&gt;@GetMapping&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Синтаксис строк:&lt;/strong&gt; Исправь строковый литерал в &lt;code&gt;@GetMapping(&amp;quot;/&amp;quot;)&lt;/code&gt; – убедись, что кавычки используются корректно.&lt;br&gt;
💡 &lt;strong&gt;Проверь структуру проекта:&lt;/strong&gt; Файлы должны находиться в директориях, соответствующих их package.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;em&gt;Создаем два отдельных файла:&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Исправление ошибок: OrderService</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-fix-status/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-service-fix-status/</guid><description>&lt;h4&gt;72. Исправление ошибок: OrderService&lt;/h4&gt;
 &lt;p&gt;🔥 Исправление ошибок в коде&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; NotificationService notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt;(NotificationService notificationService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;notificationService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;updateOrderStatus&lt;/span&gt;(Long orderId, String newStatus) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Order order &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(orderId);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newStatus.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;COMPLETED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;COMPLETED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getUserId&lt;/span&gt;(), &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Your order is completed&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newStatus.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;CANCELLED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;CANCELLED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getUserId&lt;/span&gt;(), &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Your order is cancelled&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newStatus.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;PENDING&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;PENDING&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newStatus.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;IN_PROGRESS&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;IN_PROGRESS&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Unsupported status: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; newStatus);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;strong&gt;один стиль DI&lt;/strong&gt; — конструктор для всех зависимостей (&lt;code&gt;final&lt;/code&gt; поля, &lt;code&gt;@Autowired&lt;/code&gt; на конструкторе).&lt;br&gt;
💡 &lt;code&gt;findById&lt;/code&gt; в Spring Data возвращает &lt;code&gt;Optional&lt;/code&gt;: обработай случай, когда заказа нет.&lt;br&gt;
💡 Проверяй &lt;code&gt;orderId&lt;/code&gt; и &lt;code&gt;newStatus&lt;/code&gt; на &lt;code&gt;null/blank&lt;/code&gt;, избегай &lt;code&gt;newStatus.equals(...)&lt;/code&gt; → возможен NPE.&lt;br&gt;
💡 Статусы как &lt;strong&gt;enum&lt;/strong&gt;, а не строковые литералы. Парси через &lt;code&gt;valueOf&lt;/code&gt; безопасно.&lt;br&gt;
💡 Сохраняй заказ &lt;strong&gt;после&lt;/strong&gt; изменения статуса во всех ветках, а уведомления — &lt;strong&gt;после успешного сохранения&lt;/strong&gt;.&lt;br&gt;
💡 Оберни метод в &lt;code&gt;@Transactional&lt;/code&gt;, чтобы изменение и сохранение были атомарны.&lt;br&gt;
💡 Сделай обновление идемпотентным: если статус не поменялся — ничего не делай.&lt;br&gt;
💡 Логируй, не используй &lt;code&gt;printStackTrace()&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; OrderRepository orderRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; NotificationService notificationService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Logger log &lt;span style="color:#f92672"&gt;=&lt;/span&gt; LoggerFactory.&lt;span style="color:#a6e22e"&gt;getLogger&lt;/span&gt;(OrderService.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt;(OrderRepository orderRepository,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NotificationService notificationService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;orderRepository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Objects.&lt;span style="color:#a6e22e"&gt;requireNonNull&lt;/span&gt;(orderRepository);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;notificationService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Objects.&lt;span style="color:#a6e22e"&gt;requireNonNull&lt;/span&gt;(notificationService);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;updateOrderStatus&lt;/span&gt;(Long orderId, String newStatus) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (orderId &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;orderId must not be null&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; newStatus.&lt;span style="color:#a6e22e"&gt;isBlank&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;newStatus must not be null or blank&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Order order &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(orderId)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;orElseThrow&lt;/span&gt;(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; OrderNotFoundException(orderId));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OrderStatus targetStatus &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parseStatus(newStatus);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// идемпотентность&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (targetStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; order.&lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log.&lt;span style="color:#a6e22e"&gt;debug&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Status is already {} for orderId={}&amp;#34;&lt;/span&gt;, targetStatus, orderId);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(targetStatus);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(order); &lt;span style="color:#75715e"&gt;// сохранить во всех кейсах&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// уведомления после успешного сохранения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (targetStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; OrderStatus.&lt;span style="color:#a6e22e"&gt;COMPLETED&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getUserId&lt;/span&gt;(), &lt;span style="color:#e6db74"&gt;&amp;#34;Your order is completed&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (targetStatus &lt;span style="color:#f92672"&gt;==&lt;/span&gt; OrderStatus.&lt;span style="color:#a6e22e"&gt;CANCELLED&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; notificationService.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(order.&lt;span style="color:#a6e22e"&gt;getUserId&lt;/span&gt;(), &lt;span style="color:#e6db74"&gt;&amp;#34;Your order is cancelled&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log.&lt;span style="color:#a6e22e"&gt;info&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Order {} status changed to {}&amp;#34;&lt;/span&gt;, orderId, targetStatus);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; OrderStatus &lt;span style="color:#a6e22e"&gt;parseStatus&lt;/span&gt;(String status) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; OrderStatus.&lt;span style="color:#a6e22e"&gt;valueOf&lt;/span&gt;(status.&lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;toUpperCase&lt;/span&gt;(Locale.&lt;span style="color:#a6e22e"&gt;ROOT&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (IllegalArgumentException ex) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Unsupported status: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; status);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Доменные типы и исключения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; OrderStatus {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PENDING, IN_PROGRESS, COMPLETED, CANCELLED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderNotFoundException&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; RuntimeException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderNotFoundException&lt;/span&gt;(Long id) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;super&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Order not found: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Конструкторная инъекция и &lt;code&gt;final&lt;/code&gt; поля.&lt;/li&gt;
&lt;li&gt;Безопасный парсинг статуса в &lt;code&gt;enum&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Transactional&lt;/code&gt; гарантирует атомарность.&lt;/li&gt;
&lt;li&gt;Сохранение происходит для &lt;strong&gt;всех&lt;/strong&gt; статусов.&lt;/li&gt;
&lt;li&gt;Уведомления отправляются только для важных переходов и &lt;strong&gt;после&lt;/strong&gt; сохранения.&lt;/li&gt;
&lt;li&gt;Обработка отсутствующего заказа и защита от &lt;code&gt;null/blank&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Исправление проблем в коде</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-message-building/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-message-building/</guid><description>&lt;h4&gt;24. Исправление проблем в коде&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Исправьте проблемы в коде компонента, который строит строковое сообщение с перечислением ошибок. Необходимо улучшить производительность и исправить ошибки в строках. 🛠️&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Task2&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;buildAuditMessage&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; errors) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String msg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;В процессе обработки возникли следующие проблемы: &lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;n&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String error : errors) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; msg &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; error &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;n&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; msg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для эффективной конкатенации строк в цикле используйте &lt;strong&gt;StringBuilder&lt;/strong&gt;, а не &lt;code&gt;+&lt;/code&gt;. ⚡&lt;br&gt;
💡 Убедитесь, что строковые литералы правильно оформлены в кавычках. ✍️
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Task2&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;buildAuditMessage&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; errors) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Используем StringBuilder для более эффективной конкатенации строк&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; StringBuilder msg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color:#e6db74"&gt;&amp;#34;В процессе обработки возникли следующие проблемы:\n&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String error : errors) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; msg.&lt;span style="color:#a6e22e"&gt;append&lt;/span&gt;(error).&lt;span style="color:#a6e22e"&gt;append&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; msg.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;StringBuilder&lt;/strong&gt; — используется для более эффективной конкатенации строк. В цикле с обычной строкой (с помощью оператора &lt;code&gt;+&lt;/code&gt;) создается много промежуточных объектов, что замедляет выполнение. 🏃‍♂️&lt;/li&gt;
&lt;li&gt;Ошибка с кавычками в исходном коде: лишние кавычки и неправильный синтаксис. В исправленном варианте строки правильно оформлены.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Использование &lt;code&gt;StringBuilder&lt;/code&gt; позволяет избежать лишней нагрузки на память и ускорить выполнение программы. 🚀&lt;/p&gt;</description></item><item><title>Итератор объединённого упорядоченного обхода двух источников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-collating-iterator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-collating-iterator/</guid><description>&lt;h4&gt;59. Итератор объединённого упорядоченного обхода двух источников&lt;/h4&gt;
 &lt;p&gt;Есть Java интерфейс итератор, который бегает по коллекции. У него 2 метода. hasNext() возвращает есть ли следующий элемент для итерирования. next() возвращает следующий элемент и сдвигает итератор. У нас есть 2 итератора, которые упорядочены по возрастанию, в соответствии с компаратором, который мы знаем. Задача: написать один итератор, который возьмет два имеющихся итератора и пройдется по их общему набору в том же их отсортированном порядке. Реализовать методы hasNext() и next(). Пример приведен перед кодом. Можно добавлять новые поля. Только не меняем контракт интерфейса. Хотим константную сложность по памяти, то есть нельзя сначала считать оба итератора в память&lt;/p&gt;</description></item><item><title>Как сделать класс immutable</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-make-class-immutable/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-make-class-immutable/</guid><description>&lt;h4&gt;89. Как сделать класс immutable&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;A&lt;/code&gt; с полями &lt;code&gt;Integer a&lt;/code&gt; и &lt;code&gt;List&amp;lt;Object&amp;gt; b&lt;/code&gt;.&lt;br&gt;
Нужно сделать этот класс &lt;strong&gt;immutable&lt;/strong&gt; — неизменяемым.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Object&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Все поля должны быть &lt;code&gt;private final&lt;/code&gt;.&lt;br&gt;
💡 Никаких сеттеров.&lt;br&gt;
💡 Значения должны устанавливаться только через конструктор.&lt;br&gt;
💡 Коллекции — &lt;em&gt;самое важное&lt;/em&gt;: их нужно копировать, иначе объект можно будет изменить снаружи.&lt;br&gt;
💡 При возврате коллекции — отдавать &lt;strong&gt;неизменяемую копию&lt;/strong&gt; (&lt;code&gt;Collections.unmodifiableList&lt;/code&gt;).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Integer a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Object&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt;(Integer a, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Object&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// глубокая копия списка + делаем его неизменяемым&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; b &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; : List.&lt;span style="color:#a6e22e"&gt;copyOf&lt;/span&gt;(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;getA&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Object&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getB&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// возвращаем неизменяемый список&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Почему этот класс immutable:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Код-ревью и исправление ошибок</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-fixes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-code-review-fixes/</guid><description>&lt;h4&gt;22. Code-review и исправление ошибок&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔍 Провести &lt;strong&gt;код-ревью&lt;/strong&gt; класса &lt;code&gt;Test&lt;/code&gt;, исправить ошибки и предложить улучшения.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Test&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LinkedList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addString&lt;/span&gt;(String s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addStringsFromFile&lt;/span&gt;(String pathToFile) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; IOException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; File file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; File(pathToFile);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FileInputStream fis &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; FileInputStream(file);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; InputStreamReader isr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; InputStreamReader(fis, StandardCharsets.&lt;span style="color:#a6e22e"&gt;UTF_8&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Scanner scanner &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Scanner(isr);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String str;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (scanner.&lt;span style="color:#a6e22e"&gt;hasNextLine&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; scanner.&lt;span style="color:#a6e22e"&gt;nextLine&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;str.&lt;span style="color:#a6e22e"&gt;isBlank&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addString(str);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;removeString&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getList&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; list;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;formatString&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;(); i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s &lt;span style="color:#f92672"&gt;+&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; s;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;Замеченные проблемы:&lt;/strong&gt;&lt;br&gt;
❌ &lt;strong&gt;Не хватает потокобезопасности.&lt;/strong&gt; &lt;code&gt;synchronized&lt;/code&gt; используется в &lt;code&gt;addString()&lt;/code&gt; и &lt;code&gt;formatString()&lt;/code&gt;, но &lt;code&gt;removeString()&lt;/code&gt; и &lt;code&gt;getList()&lt;/code&gt; не защищены.&lt;br&gt;
❌ &lt;strong&gt;Не закрывается &lt;code&gt;Scanner&lt;/code&gt;.&lt;/strong&gt; Это может привести к утечке ресурсов.&lt;br&gt;
❌ &lt;strong&gt;&lt;code&gt;FileInputStream&lt;/code&gt; можно заменить на &lt;code&gt;Files.newBufferedReader()&lt;/code&gt;.&lt;/strong&gt; Удобнее и безопаснее.&lt;br&gt;
❌ &lt;strong&gt;Строки конкатенируются через &lt;code&gt;+&lt;/code&gt; в &lt;code&gt;formatString()&lt;/code&gt;.&lt;/strong&gt; Это неэффективно, лучше &lt;code&gt;StringBuilder&lt;/code&gt;.&lt;br&gt;
❌ &lt;strong&gt;Используется &lt;code&gt;LinkedList&amp;lt;String&amp;gt;&lt;/code&gt;.&lt;/strong&gt; Для частого чтения больше подходит &lt;code&gt;ArrayList&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Количество сотрудников по отделам и отделы с &gt;3 сотрудниками с ЗП &gt; 100к</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-employees-aggregation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-employees-aggregation/</guid><description>&lt;h4&gt;58. Количество сотрудников по отделам и отделы с &amp;gt;3 сотрудниками с ЗП &amp;gt; 100к&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Даны таблицы &lt;code&gt;departments&lt;/code&gt; и &lt;code&gt;employees&lt;/code&gt;. Нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Написать SQL-запрос, который посчитает &lt;strong&gt;количество работников в каждом подразделении&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Написать SQL-запрос, который найдёт &lt;strong&gt;отделы, где работает больше трёх сотрудников с зарплатой более 100000&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код (схема и данные):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; departments (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; employees (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id INT &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; departments(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Заполнение таблицы отделов
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; departments (id, name) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Отдел ИТ&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Отдел ИБ&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;HR&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Заполнение таблицы сотрудников
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; employees (id, name, department_id, salary) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Иван Петров&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;120000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Елена Сидорова&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;110000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Алексей Иванов&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;105000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Мария Кузнецова&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;95000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Дмитрий Смирнов&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;150000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ольга Васильева&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;130000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Сергей Миронов&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;80000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Анна Жукова&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;115000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Павел Белов&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;125000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Наталья Воробьева&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;140000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Артем Громов&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;98000&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Виктория Орлова&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;108000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Для задачи 1:&lt;/p&gt;</description></item><item><title>Консольная игра «Крестики-нолики»</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe-console/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe-console/</guid><description>&lt;h4&gt;67. Консольная игра «Крестики-нолики»&lt;/h4&gt;
 &lt;p&gt;Можно пользоваться всем, хотят посмотреть, как ты начинаешь решать сложную задачу, какие вопросы задаешь. Можно спорить с тз аргументированно&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Составь пожалуйста код консольной игры крестики нолики,
которая работает следующим образом

1. Сначала тебя спрашивают размер поля
2. Потом ход игрока крестиком
 (указываешь строку и колонку)
3. Потом ход игрока ноликом
 (указываешь строку и колонку)
4. Сделай так чтобы структура программы была следующей

- Main класс
- Класс Game - где игра проходит
- Класс Desk - где собственно сама доска хранится
- Интерфейс AI (для игрока компьютера)
- Класс Player где игрок который руками вводит куда ходить
 (за живого игрока)
- И класс IndianAI где имплементация
 интерфейса AI - живой человек
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Представьте поле как &lt;code&gt;char[][]&lt;/code&gt;, пустые клетки отмечайте, например, &lt;code&gt;'.'&lt;/code&gt;.&lt;br&gt;
💡 Вынесите проверку победы в &lt;code&gt;Desk&lt;/code&gt;: проверяйте строки, столбцы и обе диагонали.&lt;br&gt;
💡 Используйте интерфейс &lt;code&gt;AI&lt;/code&gt; как стратегию: &lt;code&gt;Move nextMove(Desk, char mark)&lt;/code&gt;.&lt;br&gt;
💡 Для ввода с консоли используйте один общий &lt;code&gt;Scanner&lt;/code&gt;, передавая его в игроков.&lt;br&gt;
💡 Делайте ввод 1-based (строка/колонка с 1), внутри переводите в 0-based и валидируйте.
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Консольная игра «Крестики-нолики»</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-tictactoe/</guid><description>&lt;h4&gt;58. Консольная игра «Крестики-нолики»&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Написать консольную игру «Крестики-нолики» с произвольным размером поля. Структура:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Main&lt;/code&gt; — точка входа, спрашивает размер поля и запускает игру.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Game&lt;/code&gt; — логика игры (ходы, проверка победы/ничьи).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Desk&lt;/code&gt; — хранит состояние поля, рисует доску.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AI&lt;/code&gt; — интерфейс для хода компьютера.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Player&lt;/code&gt; — класс для живого игрока (вводит координаты с консоли).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IndianAI&lt;/code&gt; — реализация &lt;code&gt;AI&lt;/code&gt;, делает ход «компьютерно» (случайным выбором).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Инкапсулируйте логику хода в интерфейсе &lt;code&gt;AI&lt;/code&gt; — расширяемость.&lt;br&gt;
💡 &lt;code&gt;Desk&lt;/code&gt; отвечает за хранение и проверку победы/ничьи.&lt;br&gt;
💡 &lt;code&gt;Game&lt;/code&gt; управляет игровым циклом.&lt;br&gt;
💡 &lt;code&gt;Player&lt;/code&gt; читает ввод с консоли, &lt;code&gt;IndianAI&lt;/code&gt; генерирует случайные ходы.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Машины розового цвета и количество по цветам</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-pink-cars-and-color-count/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-pink-cars-and-color-count/</guid><description>&lt;h4&gt;31. Машины розового цвета и количество по цветам&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; colors (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt;(name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; cars (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; color_id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (color_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; colors(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Вывести список всех машин розового цвета.&lt;/li&gt;
&lt;li&gt;Посчитать количество машин для каждого цвета и вывести в формате: название цвета и количество машин.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для первой задачи используйте &lt;code&gt;JOIN&lt;/code&gt; и фильтрацию по &lt;code&gt;colors.name = 'pink'&lt;/code&gt;.&lt;br&gt;
💡 Для второй — агрегируйте по &lt;code&gt;colors.name&lt;/code&gt; с помощью &lt;code&gt;GROUP BY&lt;/code&gt; и &lt;code&gt;COUNT(*)&lt;/code&gt;.&lt;br&gt;
💡 Не забудьте применять &lt;code&gt;LEFT JOIN&lt;/code&gt;, если нужно включить цвета без машин (опционально).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1. Список машин розового цвета
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; car_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; cars &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; colors col &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.color_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; col.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; col.name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;pink&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2. Количество машин по каждому цвету
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; col.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; color,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; car_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; colors col
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; cars &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.color_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; col.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; col.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; col.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Минимальная и максимальная зарплата по отделам среди неуволенных</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit_2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit_2/</guid><description>&lt;h4&gt;49. Минимальная и максимальная зарплата по отделам среди неуволенных&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В базе данных есть две таблицы: &amp;ldquo;units&amp;rdquo; – подразделение компании и &amp;ldquo;employees&amp;rdquo; – сотрудники компании.
units:
id primary key
name (название unit)
employees:
id primary key
unit_id foreign key -&amp;gt; units::id
salary (зарплата)
fired (флаг уволен true, false)&lt;/p&gt;
&lt;p&gt;Необходимо написать sql запрос, который вернет минимальную
и максимальную зарплату по каждому отделу среди неуволенных сотрудников. (unit_id)&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Отберитесь по признаку неуволенных: &lt;code&gt;WHERE fired = false&lt;/code&gt; (или &lt;code&gt;= 0&lt;/code&gt;, если BOOL хранится как int).&lt;br&gt;
💡 Сгруппируйтесь по отделу: &lt;code&gt;GROUP BY unit_id&lt;/code&gt; (и &lt;code&gt;u.name&lt;/code&gt;, если нужен человекочитаемый вывод).&lt;br&gt;
💡 Агрегируйте зарплаты: &lt;code&gt;MIN(salary)&lt;/code&gt;, &lt;code&gt;MAX(salary)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 1: по идентификатору отдела
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.unit_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.fired &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; e.unit_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 2: с названием отдела
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; units u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.unit_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; e.fired &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.id, u.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Примечание: если хотите показывать &lt;strong&gt;все&lt;/strong&gt; отделы даже без активных сотрудников, используйте &lt;code&gt;LEFT JOIN&lt;/code&gt; и переносите условие &lt;code&gt;fired = false&lt;/code&gt; в &lt;code&gt;ON&lt;/code&gt;, а не в &lt;code&gt;WHERE&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-active-employees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-active-employees/</guid><description>&lt;h4&gt;56. Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Даны таблицы &lt;code&gt;units&lt;/code&gt; и &lt;code&gt;employees&lt;/code&gt;.&lt;br&gt;
Нужно написать SQL-запрос, который вернёт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ID отдела,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;минимальную зарплату,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;максимальную зарплату&lt;br&gt;
— среди сотрудников, у которых &lt;code&gt;fired = false&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Структура таблиц:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;units:
 id int PK
 name text

employees:
 id int PK
 unit_id int FK → units.id
 salary numeric
 fired boolean
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Делаем &lt;code&gt;JOIN&lt;/code&gt; таблиц по &lt;code&gt;unit_id&lt;/code&gt;.&lt;br&gt;
💡 Фильтруем только &lt;code&gt;fired = false&lt;/code&gt;.&lt;br&gt;
💡 Группируем по отделам (&lt;code&gt;GROUP BY&lt;/code&gt;).&lt;br&gt;
💡 Используем &lt;code&gt;MIN()&lt;/code&gt; и &lt;code&gt;MAX()&lt;/code&gt; для зарплат.&lt;br&gt;
💡 Если нужно вернуть &lt;em&gt;все отделы&lt;/em&gt;, используйте &lt;code&gt;LEFT JOIN&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; units u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.unit_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; e.fired &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.id, u.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Альтернативный вариант (если нужно показывать даже отделы без сотрудников):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit-active/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary-by-unit-active/</guid><description>&lt;h4&gt;62. Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В базе данных есть две таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;units&lt;/code&gt; — подразделения компании&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;employees&lt;/code&gt; — сотрудники компании&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нужно написать SQL-запрос, который вернёт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;unit_id&lt;/code&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;минимальную зарплату (&lt;code&gt;min_salary&lt;/code&gt;),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;максимальную зарплату (&lt;code&gt;max_salary&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 &lt;strong&gt;Только среди сотрудников, у которых &lt;code&gt;fired = false&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Структура таблиц:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;units:
 id -- primary key
 name -- название подразделения

employees:
 id -- primary key
 unit_id -- foreign key -&amp;gt; units.id
 salary -- зарплата
 fired -- флаг уволен (true / false)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нужно агрегировать данные по &lt;code&gt;unit_id&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;MIN(salary)&lt;/code&gt; и &lt;code&gt;MAX(salary)&lt;/code&gt;.&lt;br&gt;
💡 Фильтрация по &lt;code&gt;fired = false&lt;/code&gt; выполняется до агрегации.&lt;br&gt;
💡 Если требуется вернуть только &lt;code&gt;unit_id&lt;/code&gt;, можно не делать &lt;code&gt;JOIN&lt;/code&gt; с &lt;code&gt;units&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.unit_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.fired &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; e.unit_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Комментарий:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Младший пользователь для каждого имени</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-youngest-user-by-name/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-youngest-user-by-name/</guid><description>&lt;h4&gt;81. Младший пользователь для каждого имени&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан список пользователей &lt;code&gt;List&amp;lt;User&amp;gt;&lt;/code&gt;. Нужно вывести &lt;strong&gt;младшего пользователя для каждого имени&lt;/strong&gt;.&lt;br&gt;
Поля класса &lt;code&gt;User&lt;/code&gt;: &lt;code&gt;String name&lt;/code&gt;, &lt;code&gt;String surname&lt;/code&gt;, &lt;code&gt;int age&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Alex&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Ivanov&amp;#34;&lt;/span&gt;, 28));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Alex&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Petrov&amp;#34;&lt;/span&gt;, 21));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Ivanova&amp;#34;&lt;/span&gt;, 34));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Petrova&amp;#34;&lt;/span&gt;, 25));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Sidonova&amp;#34;&lt;/span&gt;, 33));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Anton&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Ivanov&amp;#34;&lt;/span&gt;, 33));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Anton&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Petrov&amp;#34;&lt;/span&gt;, 33));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;users.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Anton&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Sidorov&amp;#34;&lt;/span&gt;, 33));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;Collectors.groupingBy(User::getName)&lt;/code&gt; для группировки по имени.&lt;br&gt;
💡 Для поиска младшего можно применить &lt;code&gt;min(Comparator.comparingInt(User::getAge))&lt;/code&gt;.&lt;br&gt;
💡 После группировки выведите результаты в консоль.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; youngestByName &lt;span style="color:#f92672"&gt;=&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;groupingBy&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; User::getName,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Collectors.&lt;span style="color:#a6e22e"&gt;minBy&lt;/span&gt;(Comparator.&lt;span style="color:#a6e22e"&gt;comparingInt&lt;/span&gt;(User::getAge))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;youngestByName.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((name, userOpt) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; userOpt.&lt;span style="color:#a6e22e"&gt;ifPresent&lt;/span&gt;(user &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(name &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; -&amp;gt; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; user.&lt;span style="color:#a6e22e"&gt;getSurname&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, age &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; user.&lt;span style="color:#a6e22e"&gt;getAge&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Названия и цены услуг, проданных с 1 января 2021 по следующую неделю</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-services-january-2021-week/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-services-january-2021-week/</guid><description>&lt;h4&gt;23. Названия и цены услуг, проданных с 1 января 2021 по следующую неделю&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Services&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;cost&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;group_id&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groups&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orders&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;datetime&lt;/code&gt;, &lt;code&gt;srv_id&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо вывести &lt;strong&gt;название&lt;/strong&gt; и &lt;strong&gt;розничную цену&lt;/strong&gt; (&lt;code&gt;price&lt;/code&gt;) для всех услуг, которые продавались &lt;strong&gt;1 января 2021 и в течение следующей недели&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Соедините &lt;strong&gt;Orders&lt;/strong&gt; с &lt;strong&gt;Services&lt;/strong&gt; по &lt;code&gt;srv_id = Services.id&lt;/code&gt;.&lt;br&gt;
💡 Отфильтруйте по диапазону дат: от &lt;code&gt;'2021-01-01'&lt;/code&gt; до &lt;code&gt;'2021-01-08'&lt;/code&gt; (включительно).&lt;br&gt;
💡 Используйте &lt;code&gt;DISTINCT&lt;/code&gt;, чтобы каждая услуга выводилась единожды, даже если была продана несколько раз.&lt;br&gt;
💡 Альтернативный вариант — сначала выбрать &lt;code&gt;srv_id&lt;/code&gt; по фильтру дат, а затем присоединить &lt;strong&gt;Services&lt;/strong&gt; через &lt;code&gt;IN&lt;/code&gt; или &lt;code&gt;EXISTS&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: JOIN + DISTINCT + диапазон дат
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; s.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s.price
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Services s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Orders o &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; o.srv_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.datetime &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2021-01-01&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; o.datetime &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2021-01-09&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Использование подзапроса с IN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; s.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s.price
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Services s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; s.id &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; o.srv_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Orders o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.datetime &lt;span style="color:#66d9ef"&gt;BETWEEN&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2021-01-01&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2021-01-08&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Найди id юнитов, которые были проданы на сумму более 1000 рублей после 10:00 сегодняшнего дня. &gt; "2024-06-03 10:00"</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-units-sold-after-time/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-units-sold-after-time/</guid><description>&lt;h4&gt;1. Найди id юнитов, которые были проданы на сумму более 1000 рублей после 10:00 сегодняшнего дня. &amp;gt; &amp;#34;2024-06-03 10:00&amp;#34;&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создание таблицы Unit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; Unit (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Price DECIMAL(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создание таблицы Sales
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; Sales (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Unit_id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Sale_time &lt;span style="color:#66d9ef"&gt;TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (Unit_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; Unit(Id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Нужно выбрать &lt;code&gt;Unit.Id&lt;/code&gt;, у которых сумма продаж превышает &lt;code&gt;1000&lt;/code&gt; рублей.&lt;/li&gt;
&lt;li&gt;Для фильтрации использовать &lt;code&gt;SUM(Price) &amp;gt; 1000&lt;/code&gt; и &lt;code&gt;Sale_time &amp;gt; '2024-06-03 10:00'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Объединяем таблицы через &lt;code&gt;JOIN&lt;/code&gt; по &lt;code&gt;Unit.Id = Sales.Unit_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Используем &lt;code&gt;GROUP BY Unit_id&lt;/code&gt;, чтобы агрегировать суммы.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; u.Id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Unit u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Sales s &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.Id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.Unit_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; s.Sale_time &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2024-06-03 10:00&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.Id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;SUM&lt;/span&gt;(u.Price) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Этот SQL-запрос выбирает идентификаторы юнитов (&lt;code&gt;Id&lt;/code&gt;), у которых сумма продаж после 10:00 превышает 1000 рублей. ✅&lt;/p&gt;</description></item><item><title>Найти 2 элемента упорядоченного массива, сумма которых равна заданному числу</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-sorted/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-sorted/</guid><description>&lt;h4&gt;3. Найти 2 элемента упорядоченного массива, сумма которых равна заданному числу&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Так как массив &lt;strong&gt;упорядоченный&lt;/strong&gt;, можно использовать два указателя: один в начале, другой в конце.&lt;/li&gt;
&lt;li&gt;Если сумма элементов больше целевого числа, уменьшаем правый указатель.&lt;/li&gt;
&lt;li&gt;Если сумма меньше, увеличиваем левый указатель.&lt;/li&gt;
&lt;li&gt;Если сумма совпала — нашли ответ.&lt;/li&gt;
&lt;li&gt;Если указатели пересеклись — таких элементов нет.&lt;/li&gt;
&lt;li&gt;Временная сложность: &lt;strong&gt;O(n)&lt;/strong&gt;, так как массив проходит максимум один раз.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TwoSumSorted&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findTwoSum&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; target) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0, right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nums.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (left &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; right) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;left&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;right&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (sum &lt;span style="color:#f92672"&gt;==&lt;/span&gt; target) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;{nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;left&lt;span style="color:#f92672"&gt;]&lt;/span&gt;, nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;right&lt;span style="color:#f92672"&gt;]&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (sum &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; target) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left&lt;span style="color:#f92672"&gt;++&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Увеличиваем левый индекс, чтобы увеличить сумму&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right&lt;span style="color:#f92672"&gt;--&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Уменьшаем правый индекс, чтобы уменьшить сумму&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;{}; &lt;span style="color:#75715e"&gt;// Если ничего не нашли&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {1, 2, 3, 4, 5, 6, 7, 8, 9};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; target &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; findTwoSum(nums, target);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (result.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Найденные элементы: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; и &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Пара не найдена&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Пример работы:&lt;/strong&gt;&lt;br&gt;
Вход: &lt;code&gt;{1, 2, 3, 4, 5, 6, 7, 8, 9}&lt;/code&gt;, &lt;code&gt;target = 10&lt;/code&gt;&lt;br&gt;
Выход: &lt;code&gt;1 и 9&lt;/code&gt; (или &lt;code&gt;2 и 8&lt;/code&gt;, &lt;code&gt;3 и 7&lt;/code&gt;, &lt;code&gt;4 и 6&lt;/code&gt; в зависимости от того, какую пару он найдет первой).&lt;/p&gt;</description></item><item><title>Найти два элемента в неупорядоченном массиве, сумма которых равна заданному числу?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-unsorted/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-two-sum-unsorted/</guid><description>&lt;h4&gt;4. Найти 2 элемента неупорядоченного массива, сумма которых равна заданному числу&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для &lt;strong&gt;неупорядоченного&lt;/strong&gt; массива мы не можем использовать бинарный поиск.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оптимальный подход&lt;/strong&gt; — использовать &lt;code&gt;HashMap&lt;/code&gt;, сохраняя разницу &lt;code&gt;target - num&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Можно также использовать &lt;code&gt;Set&lt;/code&gt;, чтобы проверять, встречался ли уже нужный элемент.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Менее эффективный&lt;/strong&gt; способ — два вложенных цикла (&lt;code&gt;O(n^2)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TwoSum&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findTwoSum&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; target) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; map &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Число -&amp;gt; Индекс&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; nums.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; complement &lt;span style="color:#f92672"&gt;=&lt;/span&gt; target &lt;span style="color:#f92672"&gt;-&lt;/span&gt; nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;i&lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Число, которое нужно найти&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (map.&lt;span style="color:#a6e22e"&gt;containsKey&lt;/span&gt;(complement)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;{map.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(complement), i}; &lt;span style="color:#75715e"&gt;// Найденные индексы&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; map.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(nums&lt;span style="color:#f92672"&gt;[&lt;/span&gt;i&lt;span style="color:#f92672"&gt;]&lt;/span&gt;, i); &lt;span style="color:#75715e"&gt;// Добавляем число в map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;{}; &lt;span style="color:#75715e"&gt;// Если пары не найдено&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {4, 7, 1, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;3, 2};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; target &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 5;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; findTwoSum(nums, target);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (result.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Индексы: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Пара не найдена&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Разбор кода:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Найти департаменты без сотрудников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-without-employees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-without-employees/</guid><description>&lt;h4&gt;63. Найти департаменты без сотрудников&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть две таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Department(id, name)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Employee(id, salary, department_id)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нужно написать &lt;strong&gt;SELECT&lt;/strong&gt;, который выведет &lt;strong&gt;все департаменты, в которых нет ни одного сотрудника&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;LEFT JOIN&lt;/code&gt;, чтобы получить все департаменты.&lt;br&gt;
💡 Отсутствие сотрудников определяется по &lt;code&gt;NULL&lt;/code&gt; в полях из таблицы &lt;code&gt;Employee&lt;/code&gt;.&lt;br&gt;
💡 Альтернатива — &lt;code&gt;NOT EXISTS&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="вариант-1--через-left-join-самый-популярный"&gt;
 Вариант 1 — через LEFT JOIN (самый популярный)
 &lt;a class="anchor" href="#%d0%b2%d0%b0%d1%80%d0%b8%d0%b0%d0%bd%d1%82-1--%d1%87%d0%b5%d1%80%d0%b5%d0%b7-left-join-%d1%81%d0%b0%d0%bc%d1%8b%d0%b9-%d0%bf%d0%be%d0%bf%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d1%8b%d0%b9"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.id &lt;span style="color:#66d9ef"&gt;IS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Почему работает:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Найти дубли email среди клиентов-мужчин</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-email-duplicates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-email-duplicates/</guid><description>&lt;h4&gt;54. Найти дубли email среди клиентов-мужчин&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В таблице &lt;code&gt;customers&lt;/code&gt; появились дубликаты по полю &lt;code&gt;email&lt;/code&gt;.&lt;br&gt;
Нужно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;искать дубли только среди записей, где &lt;code&gt;gender = 'male'&lt;/code&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;вывести 2 колонки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;email&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cnt&lt;/code&gt; — количество встреч&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="sql-запрос"&gt;
 SQL-запрос
 &lt;a class="anchor" href="#sql-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используем &lt;code&gt;WHERE gender = 'male'&lt;/code&gt;, чтобы ограничить выборку.&lt;br&gt;
💡 &lt;code&gt;GROUP BY email&lt;/code&gt; позволяет сгруппировать одинаковые email.&lt;br&gt;
💡 &lt;code&gt;HAVING COUNT(*) &amp;gt; 1&lt;/code&gt; выводит только дубликаты.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; cnt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; customers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; gender &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;male&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Найти первый неповторяющийся элемент в массиве</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-first-unique-element/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-first-unique-element/</guid><description>&lt;h4&gt;1. Найти первый неповторяющийся элемент в массиве&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {4, 5, 1, 2, 0, 4, 5, 2};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Можно использовать &lt;code&gt;LinkedHashMap&lt;/code&gt;, так как он сохраняет порядок вставки элементов и позволяет эффективно отслеживать количество вхождений.&lt;/li&gt;
&lt;li&gt;Перебираем массив и заносим элементы в &lt;code&gt;Map&lt;/code&gt;, увеличивая счетчик повторений.&lt;/li&gt;
&lt;li&gt;Затем снова проходим по массиву и находим первый элемент с &lt;code&gt;count == 1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.LinkedHashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FirstUniqueElement&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findFirstUnique&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; countMap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LinkedHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countMap.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(num, countMap.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(num, 0) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (countMap.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(num) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 1) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;1; &lt;span style="color:#75715e"&gt;// Если уникального элемента нет&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {4, 5, 1, 2, 0, 4, 5, 2};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(findFirstUnique(nums)); &lt;span style="color:#75715e"&gt;// 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вывод:&lt;/p&gt;</description></item><item><title>Найти пользователей, которые летали только экономом</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-only-economy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-only-economy/</guid><description>&lt;h4&gt;61. Найти пользователей, которые летали только экономом&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно выбрать &lt;strong&gt;уникальные user_id&lt;/strong&gt;, которые &lt;strong&gt;летали только по билетам класса ECONOMY&lt;/strong&gt;.&lt;br&gt;
Если у пользователя &lt;strong&gt;хотя бы один билет BUSINESS&lt;/strong&gt;, он &lt;strong&gt;не должен попасть&lt;/strong&gt; в выборку.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Данные:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ticket_id | user_id | ticket_type | price
-----------+---------+--------------+-------
110 | 500 | &amp;#39;ECONOMY&amp;#39; | 10000
220 | 600 | &amp;#39;BUSINESS&amp;#39; | 35000
330 | 600 | &amp;#39;ECONOMY&amp;#39; | 15000
440 | 750 | &amp;#39;ECONOMY&amp;#39; | 12000
550 | 800 | &amp;#39;BUSINESS&amp;#39; | 40000
660 | 750 | &amp;#39;ECONOMY&amp;#39; | 5000
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нужно сгруппировать билеты по &lt;code&gt;user_id&lt;/code&gt;.&lt;br&gt;
💡 Пользователь годится, если &lt;code&gt;MIN(ticket_type) = MAX(ticket_type) = 'ECONOMY'&lt;/code&gt;.&lt;br&gt;
💡 Или: сгруппировать и проверить &lt;code&gt;COUNT(*) = COUNT(CASE WHEN ticket_type='ECONOMY' THEN 1 END)&lt;/code&gt;.&lt;br&gt;
💡 Или: исключить тех, у кого есть BUSINESS.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="-вариант-1--через-group-by--having"&gt;
 ✔️ Вариант 1 — через GROUP BY + HAVING
 &lt;a class="anchor" href="#-%d0%b2%d0%b0%d1%80%d0%b8%d0%b0%d0%bd%d1%82-1--%d1%87%d0%b5%d1%80%d0%b5%d0%b7-group-by--having"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; tickets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;CASE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;WHEN&lt;/span&gt; ticket_type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ECONOMY&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;THEN&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;END&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Логика:&lt;/strong&gt;&lt;br&gt;
Если общее число билетов = числу ECONOMY-билетов → других классов нет.&lt;/p&gt;</description></item><item><title>Найти число, которое встречается один раз</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-single-number/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-single-number/</guid><description>&lt;h4&gt;95. Найти число, которое встречается один раз&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан массив &lt;code&gt;int[] nums&lt;/code&gt;, где &lt;strong&gt;каждое значение встречается ровно 2 раза&lt;/strong&gt;, кроме одного — оно встречается &lt;strong&gt;1 раз&lt;/strong&gt;.&lt;br&gt;
Нужно найти это значение. Можно начать с неоптимальных вариантов и перейти к оптимальным.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Пример:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {4, 1, 2, 1, 2};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Ответ: 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Неоптимально: посчитать частоты через Map.&lt;br&gt;
💡 Лучше по памяти: отсортировать и пройти парами.&lt;br&gt;
💡 Оптимально: использовать XOR — одинаковые числа взаимно уничтожатся (&lt;code&gt;a ^ a = 0&lt;/code&gt;), а &lt;code&gt;0 ^ x = x&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;Вариант 1 — через Map (O(n) по времени, O(n) по памяти)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Написать Singleton</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-singleton-pattern/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-singleton-pattern/</guid><description>&lt;h4&gt;15. Реализовать паттерн Singleton&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Singleton — это паттерн, гарантирующий, что у класса есть только один экземпляр.&lt;br&gt;
🔹 Лучший способ в Java — &lt;strong&gt;&amp;ldquo;Lazy Initialization with Holder&amp;rdquo;&lt;/strong&gt;, так как он &lt;strong&gt;потокобезопасный&lt;/strong&gt; и &lt;strong&gt;ленивый&lt;/strong&gt;.&lt;br&gt;
🔹 Можно использовать &lt;code&gt;enum&lt;/code&gt;, но мы реализуем через класс.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Singleton&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Singleton&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Приватный конструктор, чтобы нельзя было создать через new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SingletonHolder&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Singleton INSTANCE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Singleton();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; Singleton &lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; SingletonHolder.&lt;span style="color:#a6e22e"&gt;INSTANCE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doSomething&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Работает Singleton!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Singleton singleton1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Singleton.&lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Singleton singleton2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Singleton.&lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(singleton1 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; singleton2); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; singleton1.&lt;span style="color:#a6e22e"&gt;doSomething&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Написать SQL-запрос для вывода имен студентов и университетов, где имена студентов начинаются на букву C?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-students-names-c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-students-names-c/</guid><description>&lt;h4&gt;3. Написать SQL-запрос для вывода имен студентов и университетов, где имена студентов начинаются на букву C?&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для решения задачи нужно использовать SQL &lt;strong&gt;&lt;code&gt;LIKE&lt;/code&gt;&lt;/strong&gt; с шаблоном, чтобы фильтровать имена студентов, начинающиеся на букву &amp;ldquo;C&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Чтобы получить имена студентов и университетов, необходимо использовать &lt;strong&gt;&lt;code&gt;JOIN&lt;/code&gt;&lt;/strong&gt; для объединения двух таблиц: одной для студентов и другой для университетов.&lt;/li&gt;
&lt;li&gt;Пример запроса будет зависеть от структуры таблиц, предположим, что есть таблицы &lt;strong&gt;students&lt;/strong&gt; (студенты) и &lt;strong&gt;universities&lt;/strong&gt; (университеты).&lt;/li&gt;
&lt;li&gt;Нам нужно соединить таблицу студентов с таблицей университетов по какому-то общему ключу, например, по &lt;strong&gt;university_id&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Предположим, у нас есть две таблицы:&lt;/p&gt;</description></item><item><title>Написать SQL-запрос, чтобы вывести пользователей, у которых более одного автомобиля?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-cars-users/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-cars-users/</guid><description>&lt;h4&gt;2. Написать SQL-запрос, чтобы вывести пользователей, у которых более одного автомобиля?&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (id, name) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Oleg&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Anna&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ted&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; CAR (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; CAR (id, model) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4422&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Opel 1&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4523&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMV 5&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4612&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;VW&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4853&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMV 6&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Нам нужно &lt;strong&gt;посчитать количество машин&lt;/strong&gt; у каждого пользователя.&lt;/li&gt;
&lt;li&gt;Используем &lt;code&gt;GROUP BY user_id&lt;/code&gt; для группировки по пользователям.&lt;/li&gt;
&lt;li&gt;Применяем &lt;code&gt;HAVING COUNT(*) &amp;gt; 1&lt;/code&gt;, чтобы оставить только тех, у кого &lt;strong&gt;больше одной машины&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Убедимся, что таблица &lt;code&gt;CAR&lt;/code&gt; связана с &lt;code&gt;USER&lt;/code&gt;, добавив &lt;code&gt;user_id&lt;/code&gt; в &lt;code&gt;CAR&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Добавляем внешний ключ, если его нет:&lt;/p&gt;</description></item><item><title>Написать запрос.Всего 10 пользователей. В выводе 5 пользователей в статусе Новый, 3 пользователя в статусе Работает. Куда делось еще 2 пользователя?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-missing-users/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-missing-users/</guid><description>&lt;h4&gt;11. Написать запрос.Всего 10 пользователей. В выводе 5 пользователей в статусе Новый, 3 пользователя в статусе Работает. Куда делось еще 2 пользователя?&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;Сколько пользователей в каком статусе?
Результат должен быть в виде: Название статуса, Количество пользователей в этом статусе

User
id
name
status_id

Status
id
name
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 📊 Задача требует подсчета количества пользователей для каждого статуса.&lt;br&gt;
🔍 Мы можем использовать &lt;strong&gt;&lt;code&gt;JOIN&lt;/code&gt;&lt;/strong&gt; для объединения таблиц &lt;strong&gt;&lt;code&gt;User&lt;/code&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;code&gt;Status&lt;/code&gt;&lt;/strong&gt;, чтобы получить информацию о пользователях и их статусах.&lt;br&gt;
🔑 Используем &lt;strong&gt;&lt;code&gt;GROUP BY&lt;/code&gt;&lt;/strong&gt; для группировки по статусу и подсчета количества пользователей в каждом статусе.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; s.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; status_name, &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(u.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; user_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;User&lt;/span&gt; u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Status s &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.status_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; s.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Написать реализацию метода findPersonByName(). Из списка persons найти человека с именем name</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-person-by-name/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-find-person-by-name/</guid><description>&lt;h4&gt;13. Написать реализацию метода findPersonByName()&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Нам нужно найти объект &lt;code&gt;Person&lt;/code&gt;, у которого &lt;code&gt;name&lt;/code&gt; совпадает с переданным.&lt;br&gt;
🔹 Лучше вернуть &lt;code&gt;Optional&amp;lt;Person&amp;gt;&lt;/code&gt;, чтобы избежать &lt;code&gt;null&lt;/code&gt;.&lt;br&gt;
🔹 Можно использовать &lt;code&gt;stream()&lt;/code&gt; и &lt;code&gt;filter()&lt;/code&gt;, либо традиционный &lt;code&gt;for&lt;/code&gt;-цикл.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;✅ &lt;strong&gt;С использованием &lt;code&gt;stream()&lt;/code&gt; (современный вариант)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Optional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PersonFinder&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; persons.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(person &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; person.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(name))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;findFirst&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Необходимо написать sql запрос, который вернет минимальную и максимальную зарплату по всем отделам среди не уволенных сотрудников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-min-max-salary/</guid><description>&lt;h4&gt;6. Необходимо написать sql запрос, который вернет минимальную и максимальную зарплату по всем отделам среди не уволенных сотрудников&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;В базе данных есть две таблицы: &amp;#34;&amp;#34;units&amp;#34;&amp;#34; - подразделения компании и &amp;#34;&amp;#34;employees&amp;#34;&amp;#34; - сотрудники компании
units:
id int // Primary Key
name text // (название unit)
employees:
id int // Primary Key
unit_id int // Foreign Key -&amp;gt; units::id
salary numeric // (зарплата)
fired boolean // (флаг уволен)
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔗 Нужно &lt;strong&gt;объединить&lt;/strong&gt; таблицы &lt;code&gt;units&lt;/code&gt; и &lt;code&gt;employees&lt;/code&gt; по &lt;code&gt;unit_id&lt;/code&gt;.&lt;br&gt;
⚡ Отфильтровать &lt;strong&gt;не уволенных&lt;/strong&gt; сотрудников (&lt;code&gt;fired = FALSE&lt;/code&gt;).&lt;br&gt;
📊 Использовать &lt;strong&gt;&lt;code&gt;GROUP BY&lt;/code&gt;&lt;/strong&gt;, чтобы агрегировать зарплаты по отделам.&lt;br&gt;
📈 &lt;strong&gt;&lt;code&gt;MIN()&lt;/code&gt; и &lt;code&gt;MAX()&lt;/code&gt;&lt;/strong&gt; помогут найти минимальную и максимальную зарплату.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; unit_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; units u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employees e &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; e.unit_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.fired &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.id, u.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Объединить массивы без дубликатов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-merge-arrays-unique/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-merge-arrays-unique/</guid><description>&lt;h4&gt;73. Объединить массивы без дубликатов&lt;/h4&gt;
 &lt;p&gt;🔥 Объедини два списка целых чисел, исключив повторы.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; lst1, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; lst2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// код тут&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Чтобы убрать дубликаты, используй &lt;code&gt;Set&lt;/code&gt; (например, &lt;code&gt;HashSet&lt;/code&gt;).&lt;br&gt;
💡 Для сохранения порядка можно применить &lt;code&gt;LinkedHashSet&lt;/code&gt;.&lt;br&gt;
💡 В Java 8+ удобно стримами: &lt;code&gt;Stream.concat(...)&lt;/code&gt; и &lt;code&gt;distinct()&lt;/code&gt;.&lt;br&gt;
💡 Если важна сортировка, лучше использовать &lt;code&gt;TreeSet&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Вариант с &lt;code&gt;Set&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; lst1, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; lst2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; set &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LinkedHashSet&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set.&lt;span style="color:#a6e22e"&gt;addAll&lt;/span&gt;(lst1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set.&lt;span style="color:#a6e22e"&gt;addAll&lt;/span&gt;(lst2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(set);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вариант на Stream API:&lt;/p&gt;</description></item><item><title>Оптимизация запроса с помощью индексов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-add-index-for-slow-query/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-add-index-for-slow-query/</guid><description>&lt;h4&gt;51. Оптимизация запроса с помощью индексов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В приложении есть медленный запрос:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; id, name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Artem&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; create_date &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2024-10-28&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ACTIVE&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Нужно определить, на какие колонки следует добавить индекс, чтобы ускорить выполнение запроса.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Индексы работают эффективно, если фильтры в &lt;code&gt;WHERE&lt;/code&gt; ограничивают результат.&lt;br&gt;
💡 Наиболее эффективно — &lt;strong&gt;композитный индекс&lt;/strong&gt; (multi-column index), соответствующий порядку фильтров.&lt;br&gt;
💡 Порядок колонок в индексе имеет значение: от более &amp;ldquo;селективной&amp;rdquo; (редко повторяющейся) к менее.&lt;br&gt;
💡 Можно проверить план выполнения через &lt;code&gt;EXPLAIN&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ✅ Оптимальный вариант: создать составной индекс
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; idx_users_name_create_date_status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; users (name, create_date, status);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Почему так:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Оптимизация медленного SQL‑запроса</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-refactor-slow-query/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-refactor-slow-query/</guid><description>&lt;h4&gt;44. Оптимизация медленного SQL‑запроса&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы &lt;code&gt;customers&lt;/code&gt; и &lt;code&gt;orders&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; customers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; customer_id NUMERIC(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; registration_date &lt;span style="color:#66d9ef"&gt;TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; premium_member BOOLEAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; orders
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order_id NUMERIC(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; customer_id NUMERIC(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; customers(customer_id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order_date &lt;span style="color:#66d9ef"&gt;TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total_amount DECIMAL(&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; status VARCHAR(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Медленно отрабатывает запрос:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.email,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o.order_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o.order_date,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o.total_amount
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; customers &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; orders o &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.customer_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; o.customer_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Processing&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.premium_member &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; o.order_date &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Определите &lt;strong&gt;бизнес‑логику&lt;/strong&gt;: выбираем все заказы со статусом “Processing” только у премиум‑клиентов, сортируя по дате последнего заказа.&lt;br&gt;
💡 Проверьте план выполнения (&lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;) – ищутся ли полные сканы по таблицам?&lt;br&gt;
💡 Добавьте &lt;strong&gt;композитные индексы&lt;/strong&gt; по колонкам, участвующим в &lt;code&gt;WHERE&lt;/code&gt; и &lt;code&gt;JOIN&lt;/code&gt;, и включите в них поле для сортировки:&lt;/p&gt;</description></item><item><title>Отделы по алфавиту с количеством сотрудников, где средняя зарплата &gt; 90</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-avg-salary-gt-90/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-avg-salary-gt-90/</guid><description>&lt;h4&gt;64. Отделы по алфавиту с количеством сотрудников, где средняя зарплата &amp;gt; 90&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно вывести список отделов &lt;strong&gt;в алфавитном порядке&lt;/strong&gt; с:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;названием отдела&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;количеством сотрудников в отделе&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И отобрать только те отделы, где &lt;strong&gt;средняя зарплата сотрудников &amp;gt; 90&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Отдел:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; department (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Сотрудник:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; employee (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager_id INTEGER,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary DECIMAL &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (department_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; department(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (manager_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; employee(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Соединяем &lt;code&gt;department&lt;/code&gt; и &lt;code&gt;employee&lt;/code&gt; по &lt;code&gt;department_id&lt;/code&gt;.&lt;br&gt;
💡 Группируем по отделу (&lt;code&gt;GROUP BY d.id, d.name&lt;/code&gt;).&lt;br&gt;
💡 &lt;code&gt;COUNT(e.id)&lt;/code&gt; — количество сотрудников.&lt;br&gt;
💡 &lt;code&gt;HAVING AVG(e.salary) &amp;gt; 90&lt;/code&gt; — фильтр по средней зарплате.&lt;br&gt;
💡 &lt;code&gt;ORDER BY d.name&lt;/code&gt; — алфавитный порядок.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(e.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employees_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.id, d.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(e.salary) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Отделы с количеством сотрудников</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-employee-count/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-employee-count/</guid><description>&lt;h4&gt;37. Отделы с количеством сотрудников&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dep&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;) — отделы&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;emp&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;id_dep&lt;/code&gt;, &lt;code&gt;fio&lt;/code&gt;) — сотрудники, где &lt;code&gt;id_dep&lt;/code&gt; ссылается на &lt;code&gt;dep.id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо получить список &lt;strong&gt;всех отделов&lt;/strong&gt; с количеством сотрудников в каждом. Если в отделе нет сотрудников, вывести &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;LEFT JOIN&lt;/code&gt;, чтобы включить отделы без сотрудников.&lt;br&gt;
💡 Агрегируйте по &lt;code&gt;d.name&lt;/code&gt; и примените &lt;code&gt;COUNT(e.id)&lt;/code&gt;, он вернёт &lt;code&gt;0&lt;/code&gt; для пустых групп.&lt;br&gt;
💡 При необходимости сортируйте результат по имени отдела для удобства.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(e.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; dep d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; emp e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.id_dep &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Отделы с числом сотрудников и сотрудники с окладом выше руководителя</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-and-high-salary-employees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-and-high-salary-employees/</guid><description>&lt;h4&gt;32. Отделы с числом сотрудников и сотрудники с окладом выше руководителя&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Модель данных
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Отдел:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; department (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- идентификатор отдела
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- название отдела
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Сотрудник:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; employee (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- идентификатор сотрудника
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id INTEGER &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- идентификатор отдела
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager_id INTEGER, &lt;span style="color:#75715e"&gt;-- идентификатор начальника
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- имя сотрудника
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary DECIMAL &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- оклад сотрудника
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (department_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; department(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (manager_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; employee(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Вывести список отделов в алфавитном порядке с количеством их сотрудников.&lt;/li&gt;
&lt;li&gt;Вывести список сотрудников, чей оклад больше, чем у их непосредственного руководителя.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для первой задачи используйте &lt;code&gt;LEFT JOIN&lt;/code&gt; или &lt;code&gt;JOIN&lt;/code&gt; между &lt;code&gt;department&lt;/code&gt; и &lt;code&gt;employee&lt;/code&gt;, агрегируйте по &lt;code&gt;department.name&lt;/code&gt;, &lt;code&gt;COUNT(employee.id)&lt;/code&gt; и сортируйте по имени отдела.&lt;br&gt;
💡 Для второй задачи выполните самосоединение &lt;code&gt;employee&lt;/code&gt; как &lt;code&gt;e&lt;/code&gt; и &lt;code&gt;manager&lt;/code&gt;, сопоставляя &lt;code&gt;e.manager_id = manager.id&lt;/code&gt;, и отфильтруйте по условию &lt;code&gt;e.salary &amp;gt; manager.salary&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1. Список отделов и количество сотрудников
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(e.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; d.name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2. Сотрудники с окладом выше, чем у непосредственного руководителя
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; manager_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m.salary &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; manager_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.manager_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; m.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.salary &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; m.salary;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Отделы, где число сотрудников не превышает трёх человек</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-with-few-employees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-departments-with-few-employees/</guid><description>&lt;h4&gt;53. Отделы, где число сотрудников не превышает трёх человек&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В таблице &lt;code&gt;EMPLOYEE(ID, NAME, SALARY, DEPARTMENT_ID, CHIEF_ID)&lt;/code&gt; нужно вывести &lt;strong&gt;список идентификаторов отделов&lt;/strong&gt;, где общее количество сотрудников &lt;strong&gt;≤ 3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; EMPLOYEE (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ID int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NAME VARCHAR(&lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SALARY int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DEPARTMENT_ID int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CHIEF_ID int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Пример данных:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ID | NAME | SALARY | DEPARTMENT_ID | CHIEF_ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ---+------------+--------+---------------+----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1 | Иванов | 150 | 1 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2 | Петров | 250 | 1 | 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 3 | Сидоров | 550 | 1 | 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 4 | Медведев | 350 | 2 | 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 5 | Соколов | 350 | 2 | 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 6 | Рыбников | 150 | 2 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 7 | Арбузов | 450 | 3 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 8 | Орехов | 650 | 3 | 7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 9 | Дынин | 50 | 3 | 7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY department_id&lt;/code&gt;, чтобы сгруппировать сотрудников по отделам.&lt;br&gt;
💡 Примените агрегат &lt;code&gt;COUNT(*)&lt;/code&gt; для подсчёта числа работников в каждом отделе.&lt;br&gt;
💡 Отберите отделы, где &lt;code&gt;COUNT(*) &amp;lt;= 3&lt;/code&gt;.&lt;br&gt;
💡 Можно добавить &lt;code&gt;ORDER BY department_id&lt;/code&gt; для удобства просмотра.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; EMPLOYEE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; department_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Результат для примера данных:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Палиндром с помощью Stream API</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-stream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-stream/</guid><description>&lt;h4&gt;5. Палиндром с помощью Stream API&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
Написать метод, который проверяет, является ли строка палиндромом.&lt;br&gt;
Условие: использовать &lt;strong&gt;Stream API&lt;/strong&gt;, решение в один стрим.&lt;br&gt;
Строка может содержать буквы (разного регистра), цифры, знаки препинания. Нужно учитывать только буквы и цифры.&lt;/p&gt;
&lt;p&gt;Примеры:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;A man, a plan, a canal: Panama&amp;quot;&lt;/code&gt; → &lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;I love work in IT&amp;quot;&lt;/code&gt; → &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Сначала очистить строку от всего, кроме букв и цифр.&lt;br&gt;
💡 Привести её к нижнему регистру.&lt;br&gt;
💡 Использовать &lt;code&gt;IntStream.range(0, n/2)&lt;/code&gt; для проверки символов.&lt;br&gt;
💡 &lt;code&gt;allMatch&lt;/code&gt; помогает убедиться, что все пары совпали.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Мы приводим строку к нормальной форме: убираем ненужные символы и делаем строчные буквы.&lt;br&gt;
Затем запускаем один стрим &lt;code&gt;IntStream.range(0, len/2)&lt;/code&gt; и проверяем симметричные пары символов.&lt;br&gt;
Если все совпадают — строка палиндром. ✅&lt;/p&gt;</description></item><item><title>Папки с AVI-файлами и пустые папки</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-folders-with-avi-or-empty/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-folders-with-avi-or-empty/</guid><description>&lt;h4&gt;36. Папки с AVI-файлами и пустые папки&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Написать SQL-запрос, который выбрал бы &lt;strong&gt;названия папок&lt;/strong&gt;, в которых есть хотя бы один файл с расширением &lt;code&gt;.avi&lt;/code&gt;, &lt;strong&gt;или&lt;/strong&gt; которые являются &lt;strong&gt;пустыми&lt;/strong&gt; (не содержат ни одного файла).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Структура таблиц:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; folder (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id uuid &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name text &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; file (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id uuid &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name text &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; folder_id uuid &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; fk__file__folder_id &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (folder_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; folder (id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используем &lt;code&gt;LEFT JOIN&lt;/code&gt; — чтобы получить и те папки, в которых &lt;strong&gt;нет файлов вообще&lt;/strong&gt;.&lt;br&gt;
💡 Для файлов с &lt;code&gt;.avi&lt;/code&gt; используем фильтр &lt;code&gt;file.name LIKE '%.avi'&lt;/code&gt;.&lt;br&gt;
💡 Для определения пустых папок проверяем &lt;code&gt;file.id IS NULL&lt;/code&gt;.&lt;br&gt;
💡 Не забудьте использовать &lt;code&gt;DISTINCT&lt;/code&gt;, если JOIN может дать дубликаты.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; f.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; folder f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; file fi &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; f.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fi.folder_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; fi.name &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%.avi&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;OR&lt;/span&gt; fi.id &lt;span style="color:#66d9ef"&gt;IS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Перевод средств между аккаунтами</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transfer-amount/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transfer-amount/</guid><description>&lt;h4&gt;52. Перевод средств между аккаунтами&lt;/h4&gt;
 &lt;p&gt;Есть Spring сервис передачи денег с одного аккаунта на другой. Есть метод transferAmount(), который реализует эту логику. Этот метод принимает 3 параметра: аккаунт с которого переводим, куда переводим и amount сумму перевода. Задачи: выбрать тип amount, обосновать выбор. Реализовать логику перевода. Фокусируемся на валидации, бизнес-логике, корректности решения, производительности. БД нет, все храним в памяти. Сетевого взаимодействия по REST нет&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Реализовать метод &lt;code&gt;transferAmount(Account from, Account to, ??? amount)&lt;/code&gt; в сервисе, который переводит деньги из одного аккаунта в другой.&lt;/p&gt;</description></item><item><title>Переименование файла (ФС + Postgres) в транзакции</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-file-rename-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-file-rename-code-review/</guid><description>&lt;h4&gt;104. Переименование файла (ФС &amp;#43; Postgres) в транзакции&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Есть система, которая дает юзерам возможность работать с файлами в браузере. Стек стандартный. Java, Spring, React, Postgres. Файлы хранятся на файловой системе на беке. Метаданные файлов в БД. Команда реализовала фичу - переименование файла. К вам пришел разработчик и показывает код на ревью. В команде принято следующее: На код ревью приходит код с зеленым билдом, подвохов с компиляцией нет. Код базово покрыт автотестами с поднятием Спрингового контекста. Подвохов со Спринг прокси тоже нет. Проведите код ревью
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Подсчет повторений слов в строке</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-word-count-map/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-word-count-map/</guid><description>&lt;h4&gt;44. Подсчет повторений слов в строке&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Написать метод, который принимает строку (например, &lt;code&gt;&amp;quot;тест тест1 нетест слово тест2 тест1 тест тест&amp;quot;&lt;/code&gt;) и возвращает &lt;code&gt;HashMap&amp;lt;String, Integer&amp;gt;&lt;/code&gt;, где ключ — слово, значение — количество его повторений в строке.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WordCounter&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countWords&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Разбейте строку на слова с помощью &lt;code&gt;text.split(&amp;quot;\\s+&amp;quot;)&lt;/code&gt;.&lt;br&gt;
💡 Для очистки можно убрать лишние знаки препинания, если они есть (например, &lt;code&gt;word.replaceAll(&amp;quot;\\W+&amp;quot;, &amp;quot;&amp;quot;)&lt;/code&gt;).&lt;br&gt;
💡 Используйте &lt;code&gt;HashMap&amp;lt;String, Integer&amp;gt;&lt;/code&gt; и метод &lt;code&gt;map.merge(word, 1, Integer::sum)&lt;/code&gt; для подсчёта.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.HashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;WordCounter&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countWords&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; wordCounts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (text &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; text.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; wordCounts;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; words &lt;span style="color:#f92672"&gt;=&lt;/span&gt; text.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;\\s+&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String w : words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String word &lt;span style="color:#f92672"&gt;=&lt;/span&gt; w.&lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (word.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wordCounts.&lt;span style="color:#a6e22e"&gt;merge&lt;/span&gt;(word, 1, Integer::sum);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; wordCounts;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;тест тест1 нетест слово тест2 тест1 тест тест&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; counts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; countWords(text);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; counts.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((word, count) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(word &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; -&amp;gt; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; count)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Ожидаемый вывод:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// тест -&amp;gt; 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// тест1 -&amp;gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// нетест -&amp;gt; 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// слово -&amp;gt; 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// тест2 -&amp;gt; 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Поиск Person по имени</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name/</guid><description>&lt;h4&gt;21. Поиск Person по имени&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔍 &lt;strong&gt;Реализовать метод &lt;code&gt;findPersonByName&lt;/code&gt;, который ищет объект &lt;code&gt;Person&lt;/code&gt; в списке по имени.&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Если человек найден – вернуть &lt;code&gt;Optional&amp;lt;Person&amp;gt;&lt;/code&gt;, иначе вернуть &lt;code&gt;Optional.empty()&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;📌 &lt;strong&gt;Пример:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Optional &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;strong&gt;Подсказки:&lt;/strong&gt;&lt;br&gt;
💡 Используй &lt;code&gt;Optional&lt;/code&gt; для обработки случая, когда человек не найден.&lt;br&gt;
💡 Можно использовать &lt;code&gt;stream().filter().findFirst()&lt;/code&gt;, &lt;code&gt;for-each&lt;/code&gt; или &lt;code&gt;for&lt;/code&gt;-цикл.&lt;br&gt;
💡 &lt;code&gt;equalsIgnoreCase()&lt;/code&gt; поможет искать без учета регистра.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Поиск дублированных email</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicated-emails/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-duplicated-emails/</guid><description>&lt;h4&gt;41. Поиск дублированных email&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;Employee(id, email, salary)&lt;/code&gt;, в которой некоторые &lt;code&gt;email&lt;/code&gt; повторяются. Нужно найти все &lt;code&gt;email&lt;/code&gt;, встречающиеся более одного раза.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Employee table with columns: id, email, salary. 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;We have duplicated emails. How could we find all duplicated emails?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY email&lt;/code&gt; и фильтрацию &lt;code&gt;HAVING COUNT(*) &amp;gt; 1&lt;/code&gt;.&lt;br&gt;
💡 Альтернативно можно применить оконную функцию &lt;code&gt;COUNT() OVER (PARTITION BY email)&lt;/code&gt; для подсчёта вхождений.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 1: GROUP BY + HAVING
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вариант 2: Оконная функция + DISTINCT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; email) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; cnt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) sub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; cnt &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Поиск клиентов в базе данных по INN и KPP</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-clients-by-inn-kpp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-find-clients-by-inn-kpp/</guid><description>&lt;h4&gt;16. Поиск клиентов в базе данных по INN и KPP&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Написать SQL-запрос для поиска всех клиентов по &lt;code&gt;inn&lt;/code&gt; и &lt;code&gt;kpp&lt;/code&gt; в таблице &lt;code&gt;KF_ADAPTER_R_CLIENT&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используется &lt;strong&gt;простая выборка&lt;/strong&gt; по одной таблице.&lt;/li&gt;
&lt;li&gt;В таблице &lt;code&gt;KF_ADAPTER_R_CLIENT&lt;/code&gt; есть информация о клиентах, включая &lt;code&gt;inn&lt;/code&gt; (ИНН) и &lt;code&gt;kpp&lt;/code&gt; (КПП).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; KF_ADAPTER_R_CLIENT (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; branch_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_branch_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; short_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inn VARCHAR(&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kpp VARCHAR(&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sign_count INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleted BOOLEAN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; KF_ADAPTER_R_DELEGATE (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client_id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abs_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; full_name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; phone VARCHAR(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sign_role VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deleted BOOLEAN,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (client_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; KF_ADAPTER_R_CLIENT(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для поиска клиентов используем &lt;code&gt;WHERE&lt;/code&gt;.&lt;br&gt;
💡 &lt;code&gt;inn&lt;/code&gt; и &lt;code&gt;kpp&lt;/code&gt; могут иметь разные значения, поэтому проверяем их &lt;strong&gt;совместно&lt;/strong&gt;.&lt;br&gt;
💡 Если нужно искать клиентов &lt;strong&gt;с определенными значениями&lt;/strong&gt;, используем &lt;code&gt;=&lt;/code&gt;.&lt;br&gt;
💡 Если необходимо найти клиентов с &lt;strong&gt;похожими значениями&lt;/strong&gt;, используем &lt;code&gt;LIKE&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; KF_ADAPTER_R_CLIENT 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; inn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;7701234567&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; kpp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;770101001&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Поиск наименее частого слова в строке</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-rare-word/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-rare-word/</guid><description>&lt;h4&gt;43. Поиск наименее частого слова в строке&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дана очень длинная строка &lt;code&gt;text&lt;/code&gt;. Необходимо найти слово, которое встречается в ней &lt;strong&gt;минимальное&lt;/strong&gt; количество раз (но хотя бы один раз) и вернуть это слово. Если таких слов несколько, вернуть любое из них.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RareWordFinder&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;findLeastFrequentWord&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;apple orange banana apple pear banana apple&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(findLeastFrequentWord(text)); &lt;span style="color:#75715e"&gt;// например, &amp;#34;orange&amp;#34; или &amp;#34;pear&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Разбейте строку на слова с помощью &lt;code&gt;String.split(&amp;quot;\\s+&amp;quot;)&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;Map&amp;lt;String, Integer&amp;gt;&lt;/code&gt; для подсчёта количества вхождений каждого слова.&lt;br&gt;
💡 Пройдитесь по записи в &lt;code&gt;Map&lt;/code&gt; и найдите ключ с минимальным значением счётчика.&lt;br&gt;
💡 Учтите, что строка может содержать пунктуацию — при необходимости очистите слова от знаков препинания.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RareWordFinder&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;findLeastFrequentWord&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Разбиение на слова&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; words &lt;span style="color:#f92672"&gt;=&lt;/span&gt; text.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;\\s+&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; freq &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String w : words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String word &lt;span style="color:#f92672"&gt;=&lt;/span&gt; w.&lt;span style="color:#a6e22e"&gt;replaceAll&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;[^a-zA-Z0-9]&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;toLowerCase&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (word.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; freq.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(word, freq.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(word, 0) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Поиск слова с минимальной частотой&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String rare &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Integer.&lt;span style="color:#a6e22e"&gt;MAX_VALUE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (Map.&lt;span style="color:#a6e22e"&gt;Entry&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; entry : freq.&lt;span style="color:#a6e22e"&gt;entrySet&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (entry.&lt;span style="color:#a6e22e"&gt;getValue&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; minCount) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; entry.&lt;span style="color:#a6e22e"&gt;getValue&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rare &lt;span style="color:#f92672"&gt;=&lt;/span&gt; entry.&lt;span style="color:#a6e22e"&gt;getKey&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; rare;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;apple orange banana! apple, pear? banana apple&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(findLeastFrequentWord(text)); &lt;span style="color:#75715e"&gt;// orange или pear&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Поиск оптимального места в кинотеатре</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-best-seat-distance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-best-seat-distance/</guid><description>&lt;h4&gt;47. Поиск оптимального места в кинотеатре&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Места в кинотеатре расположены в один ряд (массив &lt;code&gt;seats&lt;/code&gt; из &lt;code&gt;0&lt;/code&gt; и &lt;code&gt;1&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; — место занято&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; — место свободно&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Только что пришедший зритель выбирает такое свободное место, чтобы &lt;strong&gt;максимизировать&lt;/strong&gt; расстояние до ближайшего сидящего.&lt;br&gt;
Гарантируется, что есть хотя бы один занятый и хотя бы одно свободное место.&lt;br&gt;
Напишите метод &lt;code&gt;findBestSeatDist&lt;/code&gt;, который возвращает это максимальное расстояние.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Пример:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1, 0, 0, 0, 1] -&amp;gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1, 0, 1, 0, 0, 1, 0, 0, 0, 1]-&amp;gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1, 0, 1, 0] -&amp;gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;public int findBestSeatDist(int[] seats) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Найдите &lt;strong&gt;индексы занятых мест&lt;/strong&gt; и разбейте ряд на три типа сегментов:&lt;/p&gt;</description></item><item><title>Поиск отсутствующего числа в массиве от 0 до n</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-missing-number/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-missing-number/</guid><description>&lt;h4&gt;90. Поиск отсутствующего числа в массиве от 0 до n&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан массив &lt;code&gt;nums&lt;/code&gt; длины &lt;code&gt;n&lt;/code&gt;, содержащий &lt;strong&gt;различные числа&lt;/strong&gt; из диапазона &lt;code&gt;[0, n]&lt;/code&gt;.&lt;br&gt;
Одно число из диапазона отсутствует.&lt;br&gt;
Нужно вернуть &lt;strong&gt;это единственное отсутствующее число&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Дан массив nums, содержащий n различных чисел в диапазоне [0,n].
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Нужно вернуть единственное число в этом диапазоне, отсутствующее в массиве
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Пример 1:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Ввод: nums = [3,0,1]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Вывод: 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Пример 2:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Ввод: nums = [0,1]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; Вывод: 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MissingNumberSolution&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findMissingNumber&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Сумма чисел от &lt;code&gt;0&lt;/code&gt; до &lt;code&gt;n&lt;/code&gt; известна по формуле:&lt;br&gt;
&lt;code&gt;sumExpected = n * (n + 1) / 2&lt;/code&gt;&lt;br&gt;
💡 Сравнив её с суммой массива, вы найдёте отсутствующее число.&lt;br&gt;
💡 Это решение работает за &lt;strong&gt;O(n)&lt;/strong&gt; времени и &lt;strong&gt;O(1)&lt;/strong&gt; памяти.&lt;br&gt;
💡 Альтернативный вариант — использовать XOR (тоже O(n), O(1)).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MissingNumberSolution&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findMissingNumber&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nums.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// сумма чисел от 0 до n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; expected &lt;span style="color:#f92672"&gt;=&lt;/span&gt; n &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; 2;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; actual &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : nums) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; actual &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; expected &lt;span style="color:#f92672"&gt;-&lt;/span&gt; actual;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Альтернативное решение через XOR (быстрее на практике):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Поиск первого неповторяющегося элемента в массиве</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-non-repeating-element/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-non-repeating-element/</guid><description>&lt;h4&gt;37. Поиск первого неповторяющегося элемента в массиве&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дан массив целых чисел &lt;code&gt;{9, 4, 9, 6, 6, 4, 5}&lt;/code&gt;. Необходимо найти первый элемент, который в этом массиве встречается ровно один раз.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {9, 4, 9, 6, 6, 4, 5};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;LinkedHashMap&lt;/code&gt;, чтобы сохранить порядок вставки и подсчитать количество вхождений каждого числа.&lt;br&gt;
💡 Первый проход по массиву: для каждого элемента увеличивайте счётчик в карте.&lt;br&gt;
💡 Второй проход: найдите в исходном массиве первый элемент с частотой &lt;code&gt;1&lt;/code&gt; в карте.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.LinkedHashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; array &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {9, 4, 9, 6, 6, 4, 5};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Подсчёт вхождений с сохранением порядка&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; countMap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LinkedHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : array) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countMap.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(num, countMap.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(num, 0) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Поиск первого уникального элемента&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; firstUnique &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num : array) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (countMap.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(num) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 1) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; firstUnique &lt;span style="color:#f92672"&gt;=&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (firstUnique &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;1) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Первый неповторяющийся элемент: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; firstUnique);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Уникальных элементов не найдено&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Поиск первого уникального символа</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-unique-char/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-first-unique-char/</guid><description>&lt;h4&gt;23. Поиск первого уникального символа&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔍 &lt;strong&gt;Реализовать метод &lt;code&gt;findFirstUniqueLetter&lt;/code&gt;, который находит первый уникальный символ в строке.&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Если все символы повторяются, можно вернуть пробел &lt;code&gt;' '&lt;/code&gt; или специальный символ.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;📌 &lt;strong&gt;Примеры:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;findFirstUniqueLetter(&lt;span style="color:#e6db74"&gt;&amp;#34;summer time sadness&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;u&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;findFirstUniqueLetter(&lt;span style="color:#e6db74"&gt;&amp;#34;AA bb CC d&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Код с собеседования&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findFirstUniqueLetter&lt;/span&gt;(String str) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Write your code here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Character&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; testInOut &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;() {{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; put(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;summer time sadness&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;u&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; put(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;AA bb CC d&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; testInOut.&lt;span style="color:#a6e22e"&gt;entrySet&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(entry &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; answer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; findFirstUniqueLetter(entry.&lt;span style="color:#a6e22e"&gt;getKey&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (answer &lt;span style="color:#f92672"&gt;==&lt;/span&gt; entry.&lt;span style="color:#a6e22e"&gt;getValue&lt;/span&gt;()) System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Passed&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Not passed. Received &lt;span style="color:#f92672"&gt;%&lt;/span&gt;s but expected &lt;span style="color:#f92672"&gt;%&lt;/span&gt;s&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;n&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, answer, entry.&lt;span style="color:#a6e22e"&gt;getValue&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Можно использовать &lt;code&gt;LinkedHashMap&lt;/code&gt;, &lt;code&gt;HashMap&lt;/code&gt; или &lt;code&gt;int[]&lt;/code&gt; для подсчета количества вхождений.&lt;br&gt;
💡 &lt;code&gt;LinkedHashMap&lt;/code&gt; сохраняет порядок добавления, что поможет найти первый уникальный символ.&lt;br&gt;
💡 Можно дважды пройти по строке: сначала посчитать частоту, затем найти первый уникальный символ.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;📌 &lt;strong&gt;1. Решение через &lt;code&gt;LinkedHashMap&lt;/code&gt; (сохраняет порядок добавления):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Поиск пользователей, у которых больше одной машины</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-multiple-cars/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-multiple-cars/</guid><description>&lt;h4&gt;14. Поиск пользователей, у которых больше одной машины&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🚗 &lt;strong&gt;Вывести имена пользователей, у которых более одного автомобиля.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создаем таблицу USER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вставляем данные в таблицу USER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (id, name) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Oleg&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Anna&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ted&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создаем таблицу CAR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; CAR (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (user_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt;(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Вставляем данные в таблицу CAR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; CAR (id, model, user_id) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4422&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Opel 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4523&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMV 5&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4612&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;VW&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4853&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMV 6&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нам нужно сгруппировать данные по &lt;code&gt;user_id&lt;/code&gt;.&lt;br&gt;
💡 Используем &lt;code&gt;HAVING&lt;/code&gt; для фильтрации пользователей, у которых количество автомобилей (&lt;code&gt;COUNT(user_id)&lt;/code&gt;) больше 1.&lt;br&gt;
💡 Присоединяем таблицу &lt;code&gt;USER&lt;/code&gt;, чтобы получить имена.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; u.name 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; CAR &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.id, u.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Поиск сотрудника по табельному номеру</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-get-employee-by-tabnomer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-get-employee-by-tabnomer/</guid><description>&lt;h4&gt;3. Поиск сотрудника по табельному номеру&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;Empl&lt;/code&gt; с полями &lt;code&gt;tabNomer&lt;/code&gt; и &lt;code&gt;fio&lt;/code&gt;.&lt;br&gt;
Необходимо реализовать метод &lt;code&gt;getEmployee&lt;/code&gt;, который принимает список сотрудников &lt;code&gt;List&amp;lt;Empl&amp;gt;&lt;/code&gt; и табельный номер &lt;code&gt;tabNomer&lt;/code&gt;, и возвращает &lt;strong&gt;первого&lt;/strong&gt; сотрудника с таким табельным номером в виде &lt;code&gt;Optional&amp;lt;Empl&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Empl&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String tabNomer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String fio;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Empl&lt;/span&gt;(String tabNomer, String fio) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;tabNomer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tabNomer;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fio&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fio;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getTabNomer&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; tabNomer; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getFio&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fio; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmplService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Empl&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getEmployee&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Empl&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; empls, String tabNomer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;strong&gt;Stream API&lt;/strong&gt; для элегантного перебора списка.&lt;br&gt;
💡 Метод &lt;code&gt;filter(...)&lt;/code&gt; позволит оставить только тех сотрудников, у которых &lt;code&gt;getTabNomer().equals(tabNomer)&lt;/code&gt;.&lt;br&gt;
💡 Метод &lt;code&gt;findFirst()&lt;/code&gt; вернёт первый подходящий элемент в &lt;code&gt;Optional&lt;/code&gt;.&lt;br&gt;
💡 Не забывайте проверять входящие параметры на &lt;code&gt;null&lt;/code&gt;, если нужно повысить надёжность.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Optional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EmplService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Empl&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getEmployee&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Empl&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; empls, String tabNomer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (empls &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; tabNomer &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Optional.&lt;span style="color:#a6e22e"&gt;empty&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; empls.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(e &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; tabNomer.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(e.&lt;span style="color:#a6e22e"&gt;getTabNomer&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;findFirst&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что важно помнить:&lt;/strong&gt;&lt;br&gt;
✅ &lt;code&gt;Optional&lt;/code&gt; — хорошая практика для обозначения возможного отсутствия значения.&lt;br&gt;
✅ Использование &lt;code&gt;equals&lt;/code&gt; на константе (&lt;code&gt;tabNomer.equals(...)&lt;/code&gt;) защищает от NPE, если поле &lt;code&gt;tabNomer&lt;/code&gt; у сотрудника &lt;code&gt;null&lt;/code&gt;.&lt;br&gt;
✅ Stream-подход делает код компактным и читаемым.&lt;/p&gt;</description></item><item><title>Поиск человека по имени</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name_1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-find-person-by-name_1/</guid><description>&lt;h4&gt;57. Поиск человека по имени&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;Person&lt;/code&gt; с полями &lt;code&gt;name&lt;/code&gt; и &lt;code&gt;age&lt;/code&gt;. Нужно реализовать метод &lt;code&gt;findPersonByName(List&amp;lt;Person&amp;gt; persons, String name)&lt;/code&gt;, который возвращает &lt;code&gt;Optional&amp;lt;Person&amp;gt;&lt;/code&gt; первого человека из списка с заданным именем.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Optional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Integer age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt;(String name, Integer age) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;age&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; name; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;getAge&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; age; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PersonService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Optional.&lt;span style="color:#a6e22e"&gt;empty&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;persons.stream()&lt;/code&gt; для создания потока.&lt;br&gt;
💡 Примените &lt;code&gt;filter(p -&amp;gt; name.equals(p.getName()))&lt;/code&gt; для поиска по имени.&lt;br&gt;
💡 Закончите цепочку вызовом &lt;code&gt;findFirst()&lt;/code&gt;, чтобы получить &lt;code&gt;Optional&amp;lt;Person&amp;gt;&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Optional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PersonService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; persons.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(p &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; name.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(p.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;findFirst&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Поиск человека по имени (Stream API)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-find-person-by-name/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-find-person-by-name/</guid><description>&lt;h4&gt;9. Поиск человека по имени (Stream API)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;Person&lt;/code&gt; с полями &lt;code&gt;name&lt;/code&gt; и &lt;code&gt;age&lt;/code&gt;.&lt;br&gt;
Нужно реализовать метод, который &lt;strong&gt;ищет человека по имени&lt;/strong&gt; и возвращает &lt;code&gt;Optional&amp;lt;Person&amp;gt;&lt;/code&gt;.&lt;br&gt;
Решение удобнее сделать через &lt;strong&gt;Stream API&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;code&gt;stream()&lt;/code&gt; + &lt;code&gt;filter(...)&lt;/code&gt;.&lt;br&gt;
💡 Для получения одного элемента подойдёт &lt;code&gt;findFirst()&lt;/code&gt;.&lt;br&gt;
💡 Лучше сравнивать строки через &lt;code&gt;Objects.equals(...)&lt;/code&gt;, чтобы избежать &lt;code&gt;NullPointerException&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Optional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Optional&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findPersonByName&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons, String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; persons.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(p &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Objects.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(p.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;, name))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;findFirst&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Покажите название компании, название отдела и количество сотрудников в отделе</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-company-department-employee-count/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-company-department-employee-count/</guid><description>&lt;h4&gt;12. Покажите название компании, название отдела и количество сотрудников в отделе&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔍 &lt;strong&gt;Написать SQL-запрос, который покажет название компании, название отдела и количество сотрудников в этом отделе.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;exists&lt;/span&gt; company (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id uuid &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name_ varchar &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;exists&lt;/span&gt; department (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id uuid &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name_ varchar &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; company_id uuid &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; department_fk &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (company_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; company(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;exists&lt;/span&gt; employee (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id uuid &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name_ varchar &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id uuid &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;CONSTRAINT&lt;/span&gt; employee_fk &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (department_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; department(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; company (id, name_) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Company 1&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; company (id, name_) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Company 2&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; company (id, name_) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Company 3&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; department (id, name_, company_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Department 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; department (id, name_, company_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Department 2&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; department (id, name_, company_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Department 3&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; employee (id, name_, department_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Employee 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; employee (id, name_, department_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Employee 2&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;insert&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;into&lt;/span&gt; employee (id, name_, department_id) &lt;span style="color:#66d9ef"&gt;values&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Employee 3&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; CONFLICT &lt;span style="color:#66d9ef"&gt;DO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOTHING&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нужно использовать &lt;code&gt;JOIN&lt;/code&gt; для соединения таблиц &lt;code&gt;company&lt;/code&gt;, &lt;code&gt;department&lt;/code&gt; и &lt;code&gt;employee&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;COUNT(*)&lt;/code&gt; для подсчета количества сотрудников в каждом отделе.&lt;br&gt;
💡 Группировка &lt;code&gt;GROUP BY&lt;/code&gt; поможет сгруппировать результаты по компании и отделу.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name_ &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; company_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name_ &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(e.id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; company &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; department d &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.company_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee e &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; d.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; e.department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name_, d.name_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.name_, d.name_;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Покрытие тестами метода calc</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-tests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-tests/</guid><description>&lt;h4&gt;74. Покрытие тестами метода calc&lt;/h4&gt;
 &lt;p&gt;🔥 Нужно продумать тесты для функции &lt;code&gt;calc(a, b, operation)&lt;/code&gt; по документации.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Выполняет одну из операций &amp;#34;+&amp;#34;, &amp;#34;-&amp;#34;, &amp;#34;/&amp;#34;, &amp;#34;*&amp;#34; для переданных параметров
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * В любой непонятной ситуации, в т.ч. невозможность разделить нацело, бросается exception
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Integer &lt;span style="color:#a6e22e"&gt;calc&lt;/span&gt;(Integer a, Integer b, String operation);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Покрывай позитивные кейсы для всех операций: &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;.&lt;br&gt;
💡 Обработай граничные условия: деление на ноль, остаток от деления ≠ 0.&lt;br&gt;
💡 Проверь &lt;code&gt;null&lt;/code&gt;-аргументы.&lt;br&gt;
💡 Проверь некорректный оператор (например, &lt;code&gt;&amp;quot;%&amp;quot;&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, пустая строка).&lt;br&gt;
💡 Тестируй большие числа и переполнение.&lt;br&gt;
💡 Используй JUnit 5 + AssertJ для удобных ассертов.&lt;br&gt;
💡 Для исключений — &lt;code&gt;assertThrows&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Набор тестов (примерно 10–12 штук):&lt;/p&gt;</description></item><item><title>Получение последних N новостей и всех их комментариев</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-n-last-news-with-comments/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-n-last-news-with-comments/</guid><description>&lt;h4&gt;20. Получение последних N новостей и всех их комментариев&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Написать один SQL-запрос, который вернёт N последних новостей из таблицы &lt;code&gt;news&lt;/code&gt; вместе со всеми их комментариями из таблицы &lt;code&gt;comments&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Таблица &lt;code&gt;news&lt;/code&gt; имеет поля: &lt;code&gt;id&lt;/code&gt; (integer auto_increment).&lt;/li&gt;
&lt;li&gt;Таблица &lt;code&gt;comments&lt;/code&gt; имеет поля: &lt;code&gt;id&lt;/code&gt; (integer auto_increment), &lt;code&gt;news_id&lt;/code&gt; (integer).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Можно воспользоваться подзапросом, который выбирает последние N новостей, а затем выполнить LEFT JOIN с таблицей &lt;code&gt;comments&lt;/code&gt; для получения всех комментариев к выбранным новостям.&lt;br&gt;
💡 Альтернативный вариант — использовать CTE (Common Table Expression) для отбора последних новостей, а затем присоединить к ним комментарии.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: Использование подзапроса с LEFT JOIN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; n.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; news
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; id &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; N &lt;span style="color:#75715e"&gt;-- подставьте нужное количество новостей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; comments &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; n.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.news_id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Использование CTE (Common Table Expression)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WITH&lt;/span&gt; latest_news &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; news
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; id &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; N &lt;span style="color:#75715e"&gt;-- подставьте нужное количество новостей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; ln.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.&lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; latest_news ln
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; comments &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; ln.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.news_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Получение только ID через Spring Data JPA</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-heavydata-repo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-heavydata-repo/</guid><description>&lt;h4&gt;49. Получение только ID через Spring Data JPA&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В интерфейсе &lt;code&gt;HeavyDataRepository&lt;/code&gt; надо реализовать метод, который будет возвращать список только &lt;code&gt;id&lt;/code&gt; сущностей &lt;code&gt;HeavyData&lt;/code&gt;, а не объекты целиком.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HeavyDataRepository&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; JpaRepository&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;HeavyData, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getHeavyDataIds&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// нужно получить только ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;HeavyData&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findAllByIsActive&lt;/span&gt;(Boolean isActive);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 В Spring Data JPA можно использовать аннотацию &lt;code&gt;@Query&lt;/code&gt; с JPQL: &lt;code&gt;select h.id from HeavyData h&lt;/code&gt;.&lt;br&gt;
💡 При необходимости использовать нативный SQL — &lt;code&gt;@Query(value = &amp;quot;SELECT id FROM heavy_data&amp;quot;, nativeQuery = true)&lt;/code&gt;.&lt;br&gt;
💡 Метод должен возвращать &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt;, совпадая с типом выбранного поля.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HeavyDataRepository&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; JpaRepository&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;HeavyData, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1) JPQL-запрос через @Query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT h.id FROM HeavyData h&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getHeavyDataIds&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2) (опционально) нативный SQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// @Query(value = &amp;#34;SELECT id FROM heavy_data&amp;#34;, nativeQuery = true)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// List&amp;lt;Integer&amp;gt; getHeavyDataIds();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;HeavyData&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findAllByIsActive&lt;/span&gt;(Boolean isActive);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что важно помнить:&lt;/strong&gt;&lt;br&gt;
✅ Аннотация &lt;code&gt;@Query&lt;/code&gt; позволяет явно задать выборку необходимых полей.&lt;br&gt;
✅ Возвращаемый тип метода (&lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt;) должен соответствовать типу поля в запросе.&lt;br&gt;
✅ Для нативных запросов указывайте &lt;code&gt;nativeQuery = true&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Получить id пользователей, потративших более 1 000 000 рублей (без подзапросов)?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-big-spenders/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-big-spenders/</guid><description>&lt;h4&gt;8. Получить id пользователей, потративших более 1 000 000 рублей (без подзапросов)?&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;Представим, что у нас есть свой магазин. К нам приходят люди и покупают у нас что-то. Мы храним всю историю покупок всех пользователей в таблице в базе данных. Таблица выглядит следующим образом:
orders:
id - автоинкрементный первичный ключ,
user_id - идентификатор пользователя
amount - сумма покупки которую совершил пользователь

Мы оперируем только этой одной таблицей и считаем, что других таблиц нет. Требуется написать SQL запрос для получения идентификаторов всех пользователей, которые совершили покупки за все время на сумму больше чем на 1 000 000 рублей.
Ограничения: Запрос надо написать без использования подзапросов.
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 📊 Нужно найти &lt;strong&gt;пользователей&lt;/strong&gt;, чья общая сумма покупок &lt;strong&gt;больше 1 000 000&lt;/strong&gt;.&lt;br&gt;
🔗 Таблица &lt;code&gt;orders&lt;/code&gt; содержит &lt;strong&gt;user_id&lt;/strong&gt; и &lt;strong&gt;amount&lt;/strong&gt; (сумма покупки).&lt;br&gt;
🧮 Нам нужно &lt;strong&gt;суммировать&lt;/strong&gt; &lt;code&gt;amount&lt;/code&gt; по каждому &lt;code&gt;user_id&lt;/code&gt;.&lt;br&gt;
🚀 Используем &lt;strong&gt;&lt;code&gt;GROUP BY&lt;/code&gt;&lt;/strong&gt; для группировки и &lt;strong&gt;&lt;code&gt;HAVING&lt;/code&gt;&lt;/strong&gt; для фильтрации.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; user_id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; orders
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;SUM&lt;/span&gt;(amount) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Получить список без первых и последних трёх элементов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-skip-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-skip-limit/</guid><description>&lt;h4&gt;13. Получить список без первых и последних трёх элементов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть &lt;code&gt;List&amp;lt;String&amp;gt;&lt;/code&gt; произвольной длины.&lt;br&gt;
Нужно &lt;strong&gt;за одну стрим-операцию (один конвейер)&lt;/strong&gt; получить список:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;без &lt;strong&gt;первых 3 элементов&lt;/strong&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;без &lt;strong&gt;последних 3 элементов&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Исходные данные (пример):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;f&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;g&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;i&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для пропуска первых элементов используется &lt;code&gt;skip(n)&lt;/code&gt;.&lt;br&gt;
💡 Для ограничения количества элементов используется &lt;code&gt;limit(n)&lt;/code&gt;.&lt;br&gt;
💡 Количество элементов после обрезки можно вычислить как&lt;br&gt;
&lt;code&gt;list.size() - 6&lt;/code&gt;.&lt;br&gt;
💡 Весь код должен быть &lt;strong&gt;в одном stream-конвейере&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;skip&lt;/span&gt;(3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;limit&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(0, list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 6))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Получить список наименований книг по каждому автору</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-books-by-author-streams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-books-by-author-streams/</guid><description>&lt;h4&gt;10. Получить список наименований книг по каждому автору&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть коллекция &lt;code&gt;Book&lt;/code&gt;, где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;author&lt;/code&gt; — автор&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;names&lt;/code&gt; — список названий книг&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Получить &lt;strong&gt;мапу&lt;/strong&gt; вида&lt;br&gt;
&lt;code&gt;author -&amp;gt; список названий книг&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐ &lt;em&gt;Задача со звёздочкой&lt;/em&gt;:&lt;br&gt;
вывести &lt;strong&gt;уникальные&lt;/strong&gt; наименования книг для каждого автора.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Set;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Book&lt;/span&gt;(String author, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; names) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Book&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; books &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Set.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Book(&lt;span style="color:#e6db74"&gt;&amp;#34;Author1&amp;#34;&lt;/span&gt;, List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Name1&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Book(&lt;span style="color:#e6db74"&gt;&amp;#34;Author1&amp;#34;&lt;/span&gt;, List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Name2&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Book(&lt;span style="color:#e6db74"&gt;&amp;#34;Author2&amp;#34;&lt;/span&gt;, List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Name3&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Book(&lt;span style="color:#e6db74"&gt;&amp;#34;Author2&amp;#34;&lt;/span&gt;, List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Name4&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Name3&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Book(&lt;span style="color:#e6db74"&gt;&amp;#34;Author3&amp;#34;&lt;/span&gt;, List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Name5&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Нужно сгруппировать данные по &lt;code&gt;author&lt;/code&gt; → &lt;code&gt;Collectors.groupingBy&lt;/code&gt;.&lt;br&gt;
💡 Так как у одного &lt;code&gt;Book&lt;/code&gt; может быть &lt;strong&gt;несколько названий&lt;/strong&gt;, потребуется &lt;code&gt;flatMap&lt;/code&gt;.&lt;br&gt;
💡 Для уникальности можно собрать данные в &lt;code&gt;Set&lt;/code&gt;.&lt;br&gt;
💡 Тип результата: &lt;code&gt;Map&amp;lt;String, Set&amp;lt;String&amp;gt;&amp;gt;&lt;/code&gt; — самый логичный вариант.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="-вариант-с-уникальными-названиями-рекомендуемый"&gt;
 ⭐ Вариант с уникальными названиями (рекомендуемый)
 &lt;a class="anchor" href="#-%d0%b2%d0%b0%d1%80%d0%b8%d0%b0%d0%bd%d1%82-%d1%81-%d1%83%d0%bd%d0%b8%d0%ba%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%bc%d0%b8-%d0%bd%d0%b0%d0%b7%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f%d0%bc%d0%b8-%d1%80%d0%b5%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d0%b4%d1%83%d0%b5%d0%bc%d1%8b%d0%b9"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Set;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; booksByAuthor &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; books.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;groupingBy&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Book::author,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Collectors.&lt;span style="color:#a6e22e"&gt;flatMapping&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; book &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; book.&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Collectors.&lt;span style="color:#a6e22e"&gt;toSet&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Результат:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Пользователи без заказов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-orders/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-orders/</guid><description>&lt;h4&gt;19. Пользователи без заказов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Написать SQL-запрос для получения всех &lt;code&gt;id&lt;/code&gt; пользователей из таблицы &lt;code&gt;users&lt;/code&gt;, у которых отсутствуют заказы в таблице &lt;code&gt;orders&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Таблица &lt;code&gt;users&lt;/code&gt; содержит поле &lt;code&gt;id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Таблица &lt;code&gt;orders&lt;/code&gt; содержит поля &lt;code&gt;userId&lt;/code&gt; и &lt;code&gt;orderId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Задача — найти всех пользователей, у которых нет связанных записей в &lt;code&gt;orders&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для решения задачи можно использовать конструкцию &lt;code&gt;LEFT JOIN&lt;/code&gt; и фильтровать по NULL.&lt;br&gt;
💡 Альтернативное решение — применить условие &lt;code&gt;NOT EXISTS&lt;/code&gt; для исключения пользователей с заказами.&lt;br&gt;
💡 Оба подхода позволяют корректно выбрать пользователей, у которых нет записей в таблице &lt;code&gt;orders&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: Использование LEFT JOIN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; u.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; orders o &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; o.userId
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.userId &lt;span style="color:#66d9ef"&gt;IS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Использование NOT EXISTS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; u.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; orders o 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; o.userId &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Пользователи без поездок</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-trips/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-users-without-trips/</guid><description>&lt;h4&gt;27. Пользователи без поездок&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;create&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; users (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id int8 &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name text,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email text
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;create&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; trips (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id int8 &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scooter int8,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id int8,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; started_at timestamptz,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; finished_at timestamptz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;create&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; pauses (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id int8 &lt;span style="color:#66d9ef"&gt;primary&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trip_id int8,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; started_at timestamptz,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; finished_at timestamptz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Нужно вывести &lt;code&gt;id&lt;/code&gt; всех пользователей, у которых нет ни одной поездки в таблице &lt;code&gt;trips&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Пользователи с более чем одной покупкой в день</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-purchases-per-day/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-multiple-purchases-per-day/</guid><description>&lt;h4&gt;34. Пользователи с более чем одной покупкой в день&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;T1(date, user_id)&lt;/code&gt; с датами покупок пользователей.&lt;br&gt;
Необходимо найти все случаи, когда пользователь совершил &lt;strong&gt;более одной&lt;/strong&gt; покупки &lt;strong&gt;в тот же день&lt;/strong&gt;, и вывести пары &lt;code&gt;(date, user_id)&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY date, user_id&lt;/code&gt; для агрегации покупок каждого пользователя по дате.&lt;br&gt;
💡 Примените &lt;code&gt;HAVING COUNT(*) &amp;gt; 1&lt;/code&gt; для фильтрации только тех групп, где покупок больше одной.&lt;br&gt;
💡 Альтернативно — оконная функция &lt;code&gt;COUNT(*) OVER (PARTITION BY date, user_id)&lt;/code&gt; и фильтрация по этому полю.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: GROUP BY + HAVING
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; T1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Оконная функция
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; date, user_id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; cnt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; T1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) sub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; cnt &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Пользователь и его машины: связь в базе данных</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-user-car-relationship/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-user-car-relationship/</guid><description>&lt;h4&gt;13. Пользователь и его машины: связь в базе данных&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔍 &lt;strong&gt;Создать структуру базы данных, где один пользователь может владеть несколькими машинами, а каждая машина принадлежит только одному пользователю.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 В &lt;code&gt;CAR&lt;/code&gt; должна быть внешняя связь (&lt;code&gt;FOREIGN KEY&lt;/code&gt;) с &lt;code&gt;USER&lt;/code&gt;, указывающая на владельца.&lt;br&gt;
💡 Каждый &lt;code&gt;USER&lt;/code&gt; может иметь несколько записей в &lt;code&gt;CAR&lt;/code&gt;, но каждая &lt;code&gt;CAR&lt;/code&gt; должна быть привязана к одному &lt;code&gt;USER&lt;/code&gt;.&lt;br&gt;
💡 Можно использовать &lt;code&gt;JOIN&lt;/code&gt;, чтобы получить информацию о пользователях и их автомобилях.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создаем таблицу пользователей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Заполняем таблицу пользователей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; (id, name) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Oleg&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Anna&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ivan&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Ted&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Создаем таблицу автомобилей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; CAR (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model VARCHAR(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (user_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt;(id) &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DELETE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CASCADE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Заполняем таблицу автомобилей
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; CAR (id, model, user_id) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4422&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Opel 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4523&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMW 5&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4612&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;VW&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;4853&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BMW 6&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Запрос для получения списка пользователей и их машин
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; user_id, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; u.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; user_name, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; car_id, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.model &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; car_model
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;USER&lt;/span&gt; u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; CAR &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; u.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.user_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; u.id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Последняя запись по каждому col2</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-latest-by-foreign-key/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-latest-by-foreign-key/</guid><description>&lt;h4&gt;48. Последняя запись по каждому col2&lt;/h4&gt;
 &lt;p&gt;🔥 Есть таблица table1. В ней 4 колонки. col1 это первичный ключ. col2 это secondary_id (либо foreign key, мы знаем, что он связан с другой таблицей и не уникальный в этой таблице). col3 это amount (денежное состояние). col4 это системное поле date (change date, когда изменилось). Написать SELECT запрос, который для каждого разного col2 возвращает только строку, у которой самая последняя свежая date&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;table1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col1 pk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col2 sec_fk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col3 amount
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;col4 date
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Удобно использовать оконную функцию &lt;code&gt;ROW_NUMBER()&lt;/code&gt; с разбиением по &lt;code&gt;col2&lt;/code&gt; и сортировкой по &lt;code&gt;col4 DESC&lt;/code&gt;.&lt;br&gt;
💡 В PostgreSQL есть короткий вариант с &lt;code&gt;DISTINCT ON (col2)&lt;/code&gt; и &lt;code&gt;ORDER BY col2, col4 DESC&lt;/code&gt;.&lt;br&gt;
💡 Добавьте индекс на &lt;code&gt;(col2, col4 DESC)&lt;/code&gt; для ускорения.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Вариант 1 (ANSI SQL, универсальный, через оконную функцию):&lt;/p&gt;</description></item><item><title>Потоки, синхронизация и реализация AtomicInteger</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-atomic-integer-and-threads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-atomic-integer-and-threads/</guid><description>&lt;h4&gt;99. Потоки, синхронизация и реализация AtomicInteger&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан код с потоками. Нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Сказать, &lt;strong&gt;что выведется в консоль&lt;/strong&gt; и &lt;strong&gt;почему&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Показать &lt;strong&gt;корректную реализацию счётчика&lt;/strong&gt; с помощью &lt;code&gt;AtomicInteger&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Кратко объяснить, &lt;strong&gt;в чём проблема текущего кода&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Question9&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestClass&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; Thread {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; threadcounter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;threadcounter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(threadcounter);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 10; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (TestClass.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; TestClass().&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;synchronized&lt;/code&gt; в &lt;code&gt;main&lt;/code&gt; &lt;strong&gt;не защищает&lt;/strong&gt; код внутри &lt;code&gt;run()&lt;/code&gt;.&lt;br&gt;
💡 &lt;code&gt;++threadcounter&lt;/code&gt; — &lt;strong&gt;не атомарная операция&lt;/strong&gt;.&lt;br&gt;
💡 Потоки стартуют асинхронно, порядок выполнения не гарантирован.&lt;br&gt;
💡 Для корректного счётчика нужен &lt;code&gt;AtomicInteger&lt;/code&gt; или синхронизация в &lt;code&gt;run()&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="1-что-выведется-в-консоль"&gt;
 1️⃣ Что выведется в консоль?
 &lt;a class="anchor" href="#1-%d1%87%d1%82%d0%be-%d0%b2%d1%8b%d0%b2%d0%b5%d0%b4%d0%b5%d1%82%d1%81%d1%8f-%d0%b2-%d0%ba%d0%be%d0%bd%d1%81%d0%be%d0%bb%d1%8c"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;👉 &lt;strong&gt;Будут выведены числа от 1 до 10, но:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Потокобезопасный перевод денег между счетами</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-money-transfer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-money-transfer/</guid><description>&lt;h4&gt;50. Потокобезопасный перевод денег между счетами&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Есть монолитный сервис &lt;code&gt;MoneyTransferService&lt;/code&gt; в многопоточной среде. Нужно реализовать метод &lt;code&gt;transfer(Account from, Account to, BigDecimal amount)&lt;/code&gt;, который гарантирует, что ни один счёт не уйдёт в минус и при этом не возникнет дедлока.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MoneyTransferService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transfer&lt;/span&gt;(Account from, Account to, BigDecimal amount) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Account&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; BigDecimal balance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Account&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id, BigDecimal initial) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;balance&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; initial;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; id; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; BigDecimal &lt;span style="color:#a6e22e"&gt;getBalance&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; balance; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;debit&lt;/span&gt;(BigDecimal amt) { balance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; balance.&lt;span style="color:#a6e22e"&gt;subtract&lt;/span&gt;(amt); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;credit&lt;/span&gt;(BigDecimal amt) { balance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; balance.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(amt); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для избежания дедлока всегда блокируйте аккаунты в одном и том же порядке (например, по &lt;code&gt;id&lt;/code&gt;).&lt;br&gt;
💡 Используйте &lt;code&gt;synchronized(account)&lt;/code&gt; или &lt;code&gt;ReentrantLock&lt;/code&gt; на уровне каждого аккаунта для атомарности операций.&lt;br&gt;
💡 Проверяйте, что на счету &lt;code&gt;from&lt;/code&gt; достаточно средств перед списанием.&lt;br&gt;
💡 Обновление балансов обоих аккаунтов должно происходить внутри критической секции.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.math.BigDecimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MoneyTransferService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transfer&lt;/span&gt;(Account from, Account to, BigDecimal amount) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Определяем порядок блокировок по уникальному id, чтобы избежать дедлоков&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Account first &lt;span style="color:#f92672"&gt;=&lt;/span&gt; from.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; to.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; from : to;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Account second &lt;span style="color:#f92672"&gt;=&lt;/span&gt; from.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; to.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() &lt;span style="color:#f92672"&gt;?&lt;/span&gt; to : from;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (first) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (second) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Проверяем, что на счете from достаточно средств&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (from.&lt;span style="color:#a6e22e"&gt;getBalance&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;compareTo&lt;/span&gt;(amount) &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Недостаточно средств на счете: id=&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; from.&lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Выполняем перевод&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; from.&lt;span style="color:#a6e22e"&gt;debit&lt;/span&gt;(amount);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; to.&lt;span style="color:#a6e22e"&gt;credit&lt;/span&gt;(amount);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Account&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; BigDecimal balance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Account&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; id, BigDecimal initial) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;balance&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; initial;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getId&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; id; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; BigDecimal &lt;span style="color:#a6e22e"&gt;getBalance&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; balance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;debit&lt;/span&gt;(BigDecimal amt) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; balance.&lt;span style="color:#a6e22e"&gt;subtract&lt;/span&gt;(amt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;credit&lt;/span&gt;(BigDecimal amt) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; balance.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(amt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что важно помнить:&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Порядок блокировок&lt;/strong&gt; по &lt;code&gt;id&lt;/code&gt; предотвращает дедлок в многопоточной среде.&lt;br&gt;
✅ &lt;strong&gt;Проверка баланса&lt;/strong&gt; до списания гарантирует, что счёт не уйдёт в минус.&lt;br&gt;
✅ &lt;strong&gt;Критическая секция&lt;/strong&gt; охватывает обе операции (debit + credit), обеспечивая атомарность и консистентность.&lt;/p&gt;</description></item><item><title>Пример запроса с WHERE и HAVING</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-vs-where-example/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-vs-where-example/</guid><description>&lt;h4&gt;57. Минимальная и максимальная зарплата по отделам среди неуволенных сотрудников&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно придумать SQL-пример, где одновременно используются &lt;code&gt;WHERE&lt;/code&gt; и &lt;code&gt;HAVING&lt;/code&gt;, и показать разницу.&lt;br&gt;
Запрос должен быть реалистичным и демонстрировать назначение каждого оператора.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;WHERE&lt;/code&gt; — фильтрует &lt;strong&gt;строки до группировки&lt;/strong&gt;.&lt;br&gt;
💡 &lt;code&gt;HAVING&lt;/code&gt; — фильтрует &lt;strong&gt;группы после GROUP BY&lt;/strong&gt;.&lt;br&gt;
💡 Хороший пример: выбрать отделы, где работают только активные сотрудники (&lt;code&gt;WHERE&lt;/code&gt;), и среди них оставить только те, где &lt;strong&gt;средняя зарплата выше 50k&lt;/strong&gt; (&lt;code&gt;HAVING&lt;/code&gt;).
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; avg_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; emp_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; employees
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ACTIVE&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;-- фильтрация строк до группировки
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(salary) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt; &lt;span style="color:#75715e"&gt;-- фильтрация групп после группировки
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;; &lt;span style="color:#75715e"&gt;-- пример дополнительного условия
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Что делает запрос:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Пример синтаксиса запроса с HAVING</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-example/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-having-example/</guid><description>&lt;h4&gt;55. Пример синтаксиса запроса с HAVING&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;strong&gt;Employees&lt;/strong&gt; с колонками:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;employee_name&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;salary&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;department_id&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нужно показать &lt;strong&gt;примерный синтаксис SQL-запроса с HAVING&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;HAVING&lt;/code&gt; применяется &lt;strong&gt;после GROUP BY&lt;/strong&gt; и работает уже с агрегатами.&lt;br&gt;
💡 Частый кейс — отбирать группы, где сумма/количество/среднее выше/ниже порога.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; emp_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; avg_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Employees
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; department_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(salary) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Пояснение:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;GROUP BY department_id&lt;/code&gt; — группируем сотрудников по отделам.&lt;/p&gt;</description></item><item><title>Проверить, является ли строка палиндромом?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-check-palindrome/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-check-palindrome/</guid><description>&lt;h4&gt;2. Проверить, является ли строка палиндромом&lt;/h4&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;A man, a plan, a canal, Panama!&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Палиндром — это строка, которая читается одинаково как слева направо, так и справа налево.&lt;/li&gt;
&lt;li&gt;Нужно учесть, что пробелы, знаки препинания и регистр символов не имеют значения при проверке.&lt;/li&gt;
&lt;li&gt;Можно использовать два указателя: один с начала строки, другой с конца, и проверять, совпадают ли символы, игнорируя пробелы и знаки препинания.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Для решения задачи можно использовать регулярные выражения для удаления всего, что не является буквами или цифрами, а затем сравнить строку с её обратной версией.&lt;/p&gt;</description></item><item><title>Проверка вертикальной симметрии набора точек</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-vertical-symmetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-vertical-symmetry/</guid><description>&lt;h4&gt;48. Проверка вертикальной симметрии набора точек&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дан массив точек с целочисленными координатами &lt;code&gt;(x, y)&lt;/code&gt;. Нужно определить, существует ли вертикальная прямая &lt;code&gt;x = c&lt;/code&gt;, такая что все точки, не лежащие на ней, разбиваются на две группы, симметричные относительно этой прямой.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Пример:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [0, 1], [1, 1], [2, 2], [3, 1], [4, 1], [4, 0]]) // true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [0, 0], [1, 1], [2, 2], [3, 1], [4, 0], [4, 0]]) // true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [0, 0], [1, 1], [2, 2], [3, 1], [4, 0]]) // false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([]) // true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0]]) // true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [10, 0]]) // true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [11, 1]]) // false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isVertSym([[0, 0], [1, 0], [3, 0]]) // false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SymmetryChecker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isVertSym&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[][]&lt;/span&gt; points) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Найдите минимальную и максимальную &lt;code&gt;x&lt;/code&gt; среди всех точек: сумма даст &lt;code&gt;2*c&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;Map&amp;lt;Point, Integer&amp;gt;&lt;/code&gt; для подсчёта вхождений точек (чтобы учесть дубликаты).&lt;br&gt;
💡 Для каждой точки &lt;code&gt;(x, y)&lt;/code&gt; проверяйте, что есть ровно столько же зеркальных &lt;code&gt;(sum - x, y)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.HashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SymmetryChecker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isVertSym&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[][]&lt;/span&gt; points) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (points &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; points.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 1) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Находим minX и maxX&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Integer.&lt;span style="color:#a6e22e"&gt;MAX_VALUE&lt;/span&gt;, maxX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Integer.&lt;span style="color:#a6e22e"&gt;MIN_VALUE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; p : points) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(minX, p&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxX &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(maxX, p&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; minX &lt;span style="color:#f92672"&gt;+&lt;/span&gt; maxX; &lt;span style="color:#75715e"&gt;// 2 * c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Подсчёт вхождений точек&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Point, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; countMap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; p : points) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Point pt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Point(p&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;, p&lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countMap.&lt;span style="color:#a6e22e"&gt;merge&lt;/span&gt;(pt, 1, Integer::sum);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Проверка зеркальности&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (Map.&lt;span style="color:#a6e22e"&gt;Entry&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Point, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; e : countMap.&lt;span style="color:#a6e22e"&gt;entrySet&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Point pt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; e.&lt;span style="color:#a6e22e"&gt;getKey&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; cnt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; e.&lt;span style="color:#a6e22e"&gt;getValue&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Point mirror &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Point(sum &lt;span style="color:#f92672"&gt;-&lt;/span&gt; pt.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, pt.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (countMap.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(mirror, 0) &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; cnt) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x, y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Point(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; y) { &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; y; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(Object o) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; o) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;(o &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Point)) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Point p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (Point) o;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; x &lt;span style="color:#f92672"&gt;==&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; y &lt;span style="color:#f92672"&gt;==&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hashCode&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Objects.&lt;span style="color:#a6e22e"&gt;hash&lt;/span&gt;(x, y);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Проверка палиндрома в цикле без методов строк</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome-loop/</guid><description>&lt;h4&gt;71. Проверка палиндрома в цикле без методов строк&lt;/h4&gt;
 &lt;p&gt;Написать функцию для проверки палиндрома, обрабатывая строку только в циклах.
Нельзя использовать replace(), trim() и другие методы для обработки строк.
Нужно игнорировать пробелы и проверять только буквы/символы.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте два указателя: один с начала, другой с конца строки&lt;br&gt;
💡 Пропускайте пробелы, перемещая указатели внутрь строки&lt;br&gt;
💡 Сравнивайте символы, игнорируя регистр (Character.toLowerCase())&lt;br&gt;
💡 Продолжайте до тех пор, пока указатели не встретятся&lt;br&gt;
💡 Проверяйте, что символы совпадают на каждой итерации&lt;br&gt;
💡 Обработайте случай, когда строка состоит только из пробелов
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PalindromeChecker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isPalindrome&lt;/span&gt;(String s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (s &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; foundValidChars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (left &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; right) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Пропускаем пробелы слева&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (left &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; right &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;charAt&lt;/span&gt;(left) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Пропускаем пробелы справа&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (left &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; right &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;charAt&lt;/span&gt;(right) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Если после пропуска пробелов не осталось символов&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (left &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; right) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; foundValidChars;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Отмечаем, что нашли хотя бы одну пару символов для сравнения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; foundValidChars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Сравниваем символы (игнорируя регистр)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; leftChar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Character.&lt;span style="color:#a6e22e"&gt;toLowerCase&lt;/span&gt;(s.&lt;span style="color:#a6e22e"&gt;charAt&lt;/span&gt;(left));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; rightChar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Character.&lt;span style="color:#a6e22e"&gt;toLowerCase&lt;/span&gt;(s.&lt;span style="color:#a6e22e"&gt;charAt&lt;/span&gt;(right));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (leftChar &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; rightChar) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Перемещаем указатели&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Тестовые случаи из задания&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34; fly me to the moon &amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34; сел в озере березов лес &amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Дополнительные тесты&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;а роза упала на лапу азора&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false (только пробелы)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false (пустая строка)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Алгоритм по шагам:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Проверка повторяющихся символов в строке</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-string-repetition/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-string-repetition/</guid><description>&lt;h4&gt;34. Проверка повторяющихся символов в строке&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Реализуйте метод, который принимает на вход непустую строку и проверяет, что в строке отсутствуют символы, повторяющиеся более двух раз. Метод возвращает &lt;strong&gt;true&lt;/strong&gt;, если в строке нет символов с более чем двумя повторениями, и &lt;strong&gt;false&lt;/strong&gt;, если такие символы присутствуют.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Подсчет повторений:&lt;/strong&gt; Используйте &lt;code&gt;Map&amp;lt;Character, Integer&amp;gt;&lt;/code&gt; для подсчета количества появлений каждого символа в строке.&lt;br&gt;
💡 &lt;strong&gt;Проверка лимита:&lt;/strong&gt; Если для любого символа количество появлений становится больше двух, сразу возвращайте &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Обработка входных данных:&lt;/strong&gt; Добавьте проверку на пустую строку или &lt;code&gt;null&lt;/code&gt; для повышения надежности.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StringUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validateString&lt;/span&gt;(String input) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (input &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; input.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Строка не должна быть пустой&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Хранение количества повторений каждого символа&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Character, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; charCount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; c : input.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; charCount.&lt;span style="color:#a6e22e"&gt;getOrDefault&lt;/span&gt;(c, 0) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (count &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; charCount.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(c, count);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String validExample &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aabbcc&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// все символы повторяются не более двух раз&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String invalidExample &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aaabbc&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// символ &amp;#39;a&amp;#39; повторяется 3 раза&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Пример 1: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; validExample &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; -&amp;gt; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; validateString(validExample)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Пример 2: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; invalidExample &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; -&amp;gt; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; validateString(invalidExample)); &lt;span style="color:#75715e"&gt;// false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Эффективный подсчет:&lt;/strong&gt; Применение карты для быстрого подсчета повторений символов.&lt;br&gt;
✅ &lt;strong&gt;Ранняя остановка:&lt;/strong&gt; Метод возвращает &lt;code&gt;false&lt;/code&gt;, сразу как только встречается символ, повторяющийся более двух раз.&lt;br&gt;
✅ &lt;strong&gt;Обработка ошибок:&lt;/strong&gt; Добавлена проверка на &lt;code&gt;null&lt;/code&gt; и пустую строку для повышения надежности метода.&lt;/p&gt;</description></item><item><title>Проверка простого числа</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-check-prime/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-check-prime/</guid><description>&lt;h4&gt;42. Проверка простого числа&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Написать консольное приложение на Java, которое определяет, является ли введённое пользователем число простым.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Число больше 1 — только такие могут быть простыми.&lt;br&gt;
💡 Проверяйте делимость на 2 отдельно, затем только нечётные делители до √n.&lt;br&gt;
💡 Если делитель найден — число составное, можно сразу вернуть &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
💡 Не забывайте обрабатывать &lt;code&gt;n &amp;lt;= 1&lt;/code&gt; как не простые.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Scanner;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PrimeChecker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Scanner scanner &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Scanner(System.&lt;span style="color:#a6e22e"&gt;in&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Введите число: &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; number &lt;span style="color:#f92672"&gt;=&lt;/span&gt; scanner.&lt;span style="color:#a6e22e"&gt;nextInt&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (isPrime(number)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(number &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; — простое число.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(number &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; — не является простым.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scanner.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isPrime&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 1) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 0 и отрицательные не простые&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 2 — единственное чётное простое&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;%&lt;/span&gt; 2 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// все другие чётные составные&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; limit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) Math.&lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(n);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 3; i &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; limit; i &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; 2) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;%&lt;/span&gt; i &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что важно помнить:&lt;/strong&gt;&lt;br&gt;
✅ Обработка крайних случаев (&lt;code&gt;n &amp;lt;= 1&lt;/code&gt;, &lt;code&gt;n == 2&lt;/code&gt;).&lt;br&gt;
✅ Оптимизация: проверка только нечётных делителей до корня.&lt;br&gt;
✅ Немедленный выход при первом найденном делителе.&lt;/p&gt;</description></item><item><title>Проверка строки на палиндром</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-palindrome/</guid><description>&lt;h4&gt;66. Проверка строки на палиндром&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; app;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Arrays;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Описание: Палиндром — фраза которая наоборот читается также как и в
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * оригинале. Шалаш — это палиндром. В единственной строке записана фраза или
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * слово. Буквы могут быть только латинские. Фраза может состоять из строчных и
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * прописных латинских букв, цифр, знаков препинания.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Task1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;A man, a plan, a canal: Panama&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(isPalindrome(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;I love work in IT&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isPalindrome&lt;/span&gt;(String s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 Спойлеры к решению
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Убери все символы кроме букв и цифр с помощью replaceAll(&amp;quot;[^a-zA-Z0-9]&amp;quot;, &amp;ldquo;&amp;rdquo;).&lt;br&gt;
💡 Приведи строку к нижнему регистру для сравнения (toLowerCase).&lt;br&gt;
💡 Сравни строку с её реверсом (new StringBuilder(str).reverse().toString()).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isPalindrome&lt;/span&gt;(String s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (s &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String cleaned &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;replaceAll&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;[^a-zA-Z0-9]&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;toLowerCase&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cleaned.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; StringBuilder(cleaned).&lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Проектирование базы изделий (ведомость состава / BOM)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-bom-products-schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-bom-products-schema/</guid><description>&lt;h4&gt;60. Проектирование базы изделий (ведомость состава / BOM)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно спроектировать схему БД для хранения состава изделия (BOM).&lt;br&gt;
Есть изделие и его состав:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 Датчик
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2 Корпус 1 шт
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 3 Винт 8 шт
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 3 Винт 4 шт
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Задача: какие будут &lt;strong&gt;таблицы&lt;/strong&gt; и &lt;strong&gt;столбцы&lt;/strong&gt;, чтобы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;хранить все изделия/детали (нормативка);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;хранить структуру: какое изделие из каких компонентов состоит и в каком количестве;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;поддерживать повторное использование одной и той же детали (например, «Винт» в разных местах и в разном количестве).&lt;/p&gt;</description></item><item><title>Проектирование таблиц «Продукты» и «Наличие товаров по магазинам»</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-design-product-inventory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-design-product-inventory/</guid><description>&lt;h4&gt;46. Проектирование таблиц «Продукты» и «Наличие товаров по магазинам»&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Необходимо спроектировать структуру таблиц для сети магазинов, чтобы обеспечить:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Какие товары есть в том или ином магазине.&lt;/li&gt;
&lt;li&gt;В каких магазинах есть тот или иной товар.&lt;/li&gt;
&lt;li&gt;Общее количество каждого товара по всем магазинам.&lt;/li&gt;
&lt;li&gt;Информацию об отсутствующих товарах в конкретном магазине.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Основная таблица магазинов
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; store (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Таблица товаров
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; product (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sku TEXT &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- артикул
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description TEXT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Промежуточная таблица наличия товара в магазине
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; store_inventory (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; store_id BIGINT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; store(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product_id BIGINT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; product(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; quantity INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CHECK&lt;/span&gt; (quantity &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (store_id, product_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для связи «многие‑ко‑многим» между магазинами и товарами необходима &lt;strong&gt;junction‑таблица&lt;/strong&gt; &lt;code&gt;store_inventory&lt;/code&gt;.&lt;br&gt;
💡 Поле &lt;code&gt;quantity&lt;/code&gt; хранит текущее количество единиц товара в каждом магазине (может быть 0).&lt;br&gt;
💡 Уникальный ключ &lt;code&gt;(store_id, product_id)&lt;/code&gt; гарантирует отсутствие дублирующих записей.&lt;br&gt;
💡 Таблица &lt;code&gt;product&lt;/code&gt; содержит &lt;code&gt;sku&lt;/code&gt; (артикул) для внешних интеграций и поиск.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Пример наполнения:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; store (name) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;На опушке&amp;#39;&lt;/span&gt;), (&lt;span style="color:#e6db74"&gt;&amp;#39;Речной&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; product (name, sku, description)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Хлеб&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;BREAD-001&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Батон белый&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Молоко&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;MILK-001&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;2.5% жирности&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Яблоки&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;APPLE-001&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Зеленые&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Указываем наличие товаров в магазинах:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; store_inventory (store_id, product_id, quantity)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;), &lt;span style="color:#75715e"&gt;-- в магазине 1 — 50 штук Хлеба
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;), &lt;span style="color:#75715e"&gt;-- в магазине 1 — 30 штук Молока
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;), &lt;span style="color:#75715e"&gt;-- в магазине 2 — нет Молока
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;); &lt;span style="color:#75715e"&gt;-- в магазине 2 — 20 штук Яблок
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1) Товары в конкретном магазине:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; p.name, si.quantity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; store_inventory si
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; product p &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; p.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; si.product_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; si.store_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2) Магазины, где есть конкретный товар:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; s.name, si.quantity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; store_inventory si
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; store s &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; s.id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; si.store_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; si.product_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; si.quantity &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 3) Общее количество товара по всем магазинам:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; p.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SUM&lt;/span&gt;(si.quantity) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; total_quantity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; product p
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; store_inventory si &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; si.product_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; p.name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 4) Список магазинов, где товар отсутствует:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; s.name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; store s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; store_inventory si
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; si.store_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.id &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; si.product_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; COALESCE(si.quantity, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Пройти по коллекции и вывести уникальные значения городов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-cities-streams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-cities-streams/</guid><description>&lt;h4&gt;8. Пройти по коллекции и вывести уникальные значения городов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан список объектов &lt;code&gt;City&lt;/code&gt;. Нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Пройти по коллекции и вывести значения.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Создать &lt;strong&gt;уникальную коллекцию строк&lt;/strong&gt; (имена городов) через Stream API.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;City&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; cities &lt;span style="color:#f92672"&gt;=&lt;/span&gt; getCity();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Код сюда&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;City&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getCity&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;msk&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;msk&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;spb&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;ekb&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;City&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;City&lt;/span&gt;(String name) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для вывода — простой &lt;code&gt;forEach&lt;/code&gt;.&lt;br&gt;
💡 Для уникальных значений:&lt;br&gt;
 • нужно извлечь &lt;code&gt;city.getName()&lt;/code&gt;,&lt;br&gt;
 • вызвать &lt;code&gt;distinct()&lt;/code&gt;,&lt;br&gt;
 • собрать в &lt;code&gt;Set&lt;/code&gt; или &lt;code&gt;List&lt;/code&gt;.&lt;br&gt;
💡 Чтобы сохранить порядок — используйте &lt;code&gt;Collectors.toCollection(LinkedHashSet::new)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;City&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; cities &lt;span style="color:#f92672"&gt;=&lt;/span&gt; getCity();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. Пройти по коллекции и вывести значения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cities.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(City::getName)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;::println);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. Уникальная коллекция строк (через Stream API)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; uniqueNames &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cities.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(City::getName) &lt;span style="color:#75715e"&gt;// достаем строковые значения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;distinct&lt;/span&gt;() &lt;span style="color:#75715e"&gt;// убираем дубликаты&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toCollection&lt;/span&gt;(LinkedHashSet::&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// сохраняем порядок&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Уникальные города:&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uniqueNames.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;::println);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;City&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getCity&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;msk&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;msk&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;spb&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; City(&lt;span style="color:#e6db74"&gt;&amp;#34;ekb&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;City&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;City&lt;/span&gt;(String name) { &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; name; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; name; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Результат вывода:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Простейший метод, который приводит к StackOverflowError</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-stackoverflow-error/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-stackoverflow-error/</guid><description>&lt;h4&gt;102. Простейший метод, который приводит к StackOverflowError&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно написать &lt;strong&gt;простейший метод&lt;/strong&gt;, который при выполнении приведёт к &lt;code&gt;StackOverflowError&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;StackOverflowError&lt;/code&gt; возникает при переполнении стека вызовов.&lt;br&gt;
💡 Самый простой способ — &lt;strong&gt;бесконечная рекурсия без условия выхода&lt;/strong&gt;.&lt;br&gt;
💡 Это &lt;code&gt;Error&lt;/code&gt;, а не &lt;code&gt;Exception&lt;/code&gt;, и обычно его не ловят.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StackOverflowExample&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; overflow();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;overflow&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; overflow(); &lt;span style="color:#75715e"&gt;// бесконечная рекурсия&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Что происходит:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Работа с Set: объект Ball, equals / hashCode</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-set-ball/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-set-ball/</guid><description>&lt;h4&gt;105. Работа с Set: объект Ball, equals / hashCode&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Создать объект &lt;strong&gt;Ball&lt;/strong&gt; с полями &lt;code&gt;size&lt;/code&gt; и &lt;code&gt;color&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Создать &lt;strong&gt;4 мяча&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3 разных&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 должен &lt;strong&gt;совпадать&lt;/strong&gt; с одним из уже созданных&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Добавить мячи в &lt;code&gt;Set&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Показать, что дубликат &lt;strong&gt;не добавился&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Создать класс Ball(size, color)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Создать 4 объекта Ball&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Добавить их в Set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;Set&lt;/code&gt; использует &lt;code&gt;equals()&lt;/code&gt; и &lt;code&gt;hashCode()&lt;/code&gt; для определения уникальности.&lt;br&gt;
💡 Если их не переопределить — каждый объект будет считаться уникальным.&lt;br&gt;
💡 Чтобы 2 мяча считались одинаковыми, &lt;code&gt;equals&lt;/code&gt; и &lt;code&gt;hashCode&lt;/code&gt; должны учитывать &lt;code&gt;size&lt;/code&gt; и &lt;code&gt;color&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.HashSet;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Set;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ball ball1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Ball(5, &lt;span style="color:#e6db74"&gt;&amp;#34;red&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ball ball2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Ball(6, &lt;span style="color:#e6db74"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ball ball3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Ball(7, &lt;span style="color:#e6db74"&gt;&amp;#34;green&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ball ball4 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Ball(5, &lt;span style="color:#e6db74"&gt;&amp;#34;red&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// совпадает с ball1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Ball&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; balls &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashSet&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balls.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(ball1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balls.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(ball2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balls.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(ball3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balls.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(ball4); &lt;span style="color:#75715e"&gt;// не добавится&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Количество мячей в Set: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; balls.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; balls.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;::println);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Ball&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String color;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Ball&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; size, String color) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;color&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; color;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(Object o) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; o) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;(o &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Ball ball)) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; size &lt;span style="color:#f92672"&gt;==&lt;/span&gt; ball.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Objects.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(color, ball.&lt;span style="color:#a6e22e"&gt;color&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hashCode&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Objects.&lt;span style="color:#a6e22e"&gt;hash&lt;/span&gt;(size, color);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Ball{size=&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; size &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, color=&amp;#39;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; color &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;}&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Что произойдёт:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Разделение списка на партиции</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-partition-list/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-partition-list/</guid><description>&lt;h4&gt;10. Разделить список на подсписки фиксированного размера&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Нам нужно разделить список на &lt;strong&gt;подсписки фиксированного размера&lt;/strong&gt;.&lt;br&gt;
🔹 Если длина списка &lt;strong&gt;не делится нацело&lt;/strong&gt;, последний подсписок будет короче.&lt;br&gt;
🔹 Можно использовать &lt;strong&gt;подход с циклами&lt;/strong&gt; или &lt;strong&gt;Stream API&lt;/strong&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;1️⃣ Способ: Обычный цикл&lt;/strong&gt;&lt;br&gt;
Простой и понятный способ с использованием &lt;code&gt;subList()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PartitionList&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;partition&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; size) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; partitions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;(); i &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; size) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; partitions.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(list.&lt;span style="color:#a6e22e"&gt;subList&lt;/span&gt;(i, Math.&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; size, list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;())));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; partitions;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; numbers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 1; i &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 10; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numbers.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(i);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; partition(numbers, 3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Вывод:&lt;/strong&gt; &lt;code&gt;[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Разработка сервиса поиска обуви</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-shoes-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-shoes-service/</guid><description>&lt;h4&gt;19. Разработать сервиса поиска обуви&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
👞 &lt;strong&gt;Разработай сервис для поиска обуви!&lt;/strong&gt;&lt;br&gt;
Тебе нужно создать &lt;strong&gt;REST API&lt;/strong&gt; с эндпоинтом &lt;code&gt;POST /api/v1/search&lt;/code&gt;, который принимает запрос с фильтрами и возвращает список подходящих товаров.&lt;/p&gt;
&lt;p&gt;🔍 &lt;strong&gt;Фильтрация обуви:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Сапоги&lt;/strong&gt; → цвет &lt;strong&gt;красный&lt;/strong&gt; или &lt;strong&gt;зелёный&lt;/strong&gt;, цена &lt;strong&gt;от 5000 до 20000&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Туфли&lt;/strong&gt; → цена &lt;strong&gt;меньше 10000&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;📩 &lt;strong&gt;Пример запроса:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;сапоги&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;красный&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;зелёный&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;minPrice&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;maxPrice&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📤 &lt;strong&gt;Пример ответа:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;сапоги&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;красный&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;15000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com/shoe1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;сапоги&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;зелёный&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;price&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;18000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://example.com/shoe2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Используй Spring Boot + Spring Data JPA&lt;/strong&gt; для работы с БД.&lt;br&gt;
💡 &lt;strong&gt;Создай сущность &lt;code&gt;Shoe&lt;/code&gt;&lt;/strong&gt; с полями &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Напиши DTO-классы&lt;/strong&gt; для запроса и ответа.&lt;br&gt;
💡 &lt;strong&gt;Используй &lt;code&gt;JpaRepository&lt;/code&gt;&lt;/strong&gt; и напиши кастомный метод для поиска.&lt;br&gt;
💡 &lt;strong&gt;Контроллер должен принимать JSON-запрос&lt;/strong&gt; и возвращать список обуви.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;📌 &lt;strong&gt;1. Создаём сущность &lt;code&gt;Shoe&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Распределение загрузки на грузовики</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-trucks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-calc-trucks/</guid><description>&lt;h4&gt;46. Распределение загрузки на грузовики&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Реализовать метод &lt;code&gt;calcTrucks&lt;/code&gt;, который принимает массив весов грузов, количество грузовиков и их максимальную грузоподъемность, распределяет грузы по грузовикам так, чтобы &lt;strong&gt;максимально&lt;/strong&gt; загрузить их, и возвращает &lt;strong&gt;суммарную недогруженность&lt;/strong&gt; (общая свободная емкость).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param weights массив весов грузов
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param trucksCount количество грузовиков
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param truckMaxCapacity максимальная грузоподъемность одного грузовика
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return суммарная недогруженность (truckCount*truckMaxCapacity - суммарный вес размещённых грузов)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calcTrucks&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; weights, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; trucksCount, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; truckMaxCapacity) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Эту задачу можно свести к многоконтейнерному упаковочному (bin packing) с целью минимизации пустого места.&lt;br&gt;
💡 Один из эффективных эвристических методов — &lt;strong&gt;Best Fit Decreasing&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Реализация `hashCode` для класса Point</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-point-hashcode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-point-hashcode/</guid><description>&lt;h4&gt;39. Реализация `hashCode` для класса Point&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Реализовать метод &lt;code&gt;hashCode()&lt;/code&gt; для класса &lt;code&gt;Point&lt;/code&gt; с полями &lt;code&gt;int x&lt;/code&gt; и &lt;code&gt;int y&lt;/code&gt;. Объяснить, что возвращает &lt;code&gt;hashCode()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// конструкторы, геттеры/сеттеры&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hashCode&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: ваша реализация&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Для смешивания полей используйте &lt;strong&gt;простое умножение на простое число&lt;/strong&gt; (часто 31).&lt;br&gt;
💡 Начальная величина результата может быть, например, &lt;code&gt;17&lt;/code&gt; или &lt;code&gt;x&lt;/code&gt;.&lt;br&gt;
💡 Формула:&lt;/p&gt;</description></item><item><title>Реализация двоичного дерева</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-binary-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-binary-tree/</guid><description>&lt;h4&gt;29. Реализация двоичного дерева&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Напишите простую реализацию &lt;strong&gt;двоичного дерева&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;добавление элементов&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;обход в &lt;strong&gt;in-order&lt;/strong&gt; (сначала левый, потом текущий, потом правый)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🌳 &lt;strong&gt;Двоичное дерево поиска&lt;/strong&gt; (Binary Search Tree) хранит меньшие значения слева, большие — справа.&lt;br&gt;
📌 Для вставки используем рекурсивный метод &lt;code&gt;insertRec&lt;/code&gt;.&lt;br&gt;
📌 Обход in-order позволяет получить &lt;strong&gt;отсортированную последовательность&lt;/strong&gt; значений.&lt;br&gt;
💡 Используй &lt;code&gt;System.out.print()&lt;/code&gt; внутри рекурсивного обхода, чтобы увидеть структуру.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BinaryTree&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Node left;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Node right;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Node(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Node root;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; root &lt;span style="color:#f92672"&gt;=&lt;/span&gt; insertRec(root, value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Node &lt;span style="color:#a6e22e"&gt;insertRec&lt;/span&gt;(Node root, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (root &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Node(value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (value &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; root.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;) root.&lt;span style="color:#a6e22e"&gt;left&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; insertRec(root.&lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;, value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (value &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; root.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;) root.&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; insertRec(root.&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt;, value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; root;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;inOrderTraversal&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inOrderRec(root);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;inOrderRec&lt;/span&gt;(Node root) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (root &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inOrderRec(root.&lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(root.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inOrderRec(root.&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BinaryTree tree &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BinaryTree();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(5);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(7);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;insert&lt;/span&gt;(4);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;In-order traversal:&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tree.&lt;span style="color:#a6e22e"&gt;inOrderTraversal&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Output: 1 3 4 5 7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что ты реализовал:&lt;/strong&gt;&lt;br&gt;
✅ Добавление элементов в бинарное дерево.&lt;br&gt;
✅ Обход in-order (слева → текущий → справа).&lt;br&gt;
✅ Рекурсивную структуру дерева.&lt;br&gt;
✅ Пример работы — можно запустить и проверить.&lt;/p&gt;</description></item><item><title>Реализация класса с истекающими ключами</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-expiring-map/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-expiring-map/</guid><description>&lt;h4&gt;68. Реализация класса с истекающими ключами&lt;/h4&gt;
 &lt;p&gt;🔥 Написать класс, который позволяет сохранять пары ключ-значение, где каждому ключу ассоциировано время действия. После истечения этого интервала ключ должен стать недоступным.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы класса:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;set(String key, String value, int duration)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Принимает ключ в виде строки, значение типа &lt;code&gt;String&lt;/code&gt; и длительность в миллисекундах.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ключ становится недоступным после истечения указанной длительности.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Метод возвращает &lt;code&gt;true&lt;/code&gt;, если такой же ключ, который ещё не истек, уже существует, и &lt;code&gt;false&lt;/code&gt; в противном случае.&lt;/p&gt;</description></item><item><title>Реализация паттерна Singleton в Java</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-singleton/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-singleton/</guid><description>&lt;h4&gt;33. Реализация паттерна Singleton в Java&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Напишите реализацию паттерна Singleton в Java.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;strong&gt;private конструктор&lt;/strong&gt;, чтобы предотвратить создание экземпляров класса извне.&lt;br&gt;
💡 Применяй &lt;strong&gt;double-checked locking&lt;/strong&gt; с ключевым словом &lt;code&gt;volatile&lt;/code&gt; для обеспечения потокобезопасности и избежания избыточной синхронизации.&lt;br&gt;
💡 Метод &lt;code&gt;getInstance()&lt;/code&gt; возвращает единственный экземпляр класса, гарантируя создание объекта только при первом обращении.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Singleton&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// volatile гарантирует, что изменения переменной instance видны всем потокам&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;volatile&lt;/span&gt; Singleton instance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Приватный конструктор предотвращает создание экземпляров извне&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Singleton&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Метод для доступа к единственному экземпляру с использованием double-checked locking&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; Singleton &lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (instance &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Первичная проверка без синхронизации&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (Singleton.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (instance &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// Вторая проверка внутри синхронизированного блока&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Singleton();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; instance;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Пример метода, который демонстрирует работу с Singleton&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doSomething&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Singleton instance is working!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Пример использования&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Singleton singleton &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Singleton.&lt;span style="color:#a6e22e"&gt;getInstance&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; singleton.&lt;span style="color:#a6e22e"&gt;doSomething&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Вывод: Singleton instance is working!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Потокобезопасность:&lt;/strong&gt; Использование &lt;code&gt;volatile&lt;/code&gt; и блока &lt;code&gt;synchronized&lt;/code&gt; с двойной проверкой гарантирует корректную работу в многопоточной среде.&lt;br&gt;
✅ &lt;strong&gt;Контроль создания экземпляра:&lt;/strong&gt; Приватный конструктор предотвращает создание дополнительных экземпляров класса.&lt;br&gt;
✅ &lt;strong&gt;Эффективность:&lt;/strong&gt; Double-checked locking позволяет избежать блокировки при каждом вызове &lt;code&gt;getInstance()&lt;/code&gt; после инициализации.&lt;/p&gt;</description></item><item><title>Реализация проверки продажи товара по времени и типу с условиями if-else</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-if-else-can-sell/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-if-else-can-sell/</guid><description>&lt;h4&gt;75. Реализация проверки продажи товара по времени и типу с условиями if-else&lt;/h4&gt;
 &lt;p&gt;🔥 Нужно написать метод, который проверяет возможность продажи продукта в зависимости от времени и категории.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Дано&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IceCream&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; Product {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;abstract&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Alcohol&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; Product {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getAbv&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// крепость&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ТЗ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 13:00–14:00 — обед, продажа запрещена
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 23:00–02:59 — запрет на продажу любого алкоголя
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 03:00–07:59 — запрет на продажу крепкого алкоголя (&amp;gt;=40)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;checkSale&lt;/span&gt;(Product item, Integer hour) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// код тут&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Сначала проверь обеденное время.&lt;br&gt;
💡 В диапазоне 23:00–02:59 блокируй любой алкоголь.&lt;br&gt;
💡 В диапазоне 03:00–07:59 блокируй крепкий алкоголь (&lt;code&gt;abv &amp;gt;= 40&lt;/code&gt;).&lt;br&gt;
💡 Для остальных случаев возвращай &lt;code&gt;true&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;checkSale&lt;/span&gt;(Product item, Integer hour) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (hour &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; hour &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 0 &lt;span style="color:#f92672"&gt;||&lt;/span&gt; hour &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 23) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Некорректный час: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; hour);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Обед — запрет всех продаж&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (hour &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 13) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Ночной запрет на любой алкоголь&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (hour &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; 23 &lt;span style="color:#f92672"&gt;||&lt;/span&gt; hour &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 3) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (item &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Alcohol) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Утренний запрет на крепкий алкоголь&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (hour &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; 3 &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; hour &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 8) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (item &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Alcohol &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ((Alcohol) item).&lt;span style="color:#a6e22e"&gt;getAbv&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; 40) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Простые условия &lt;code&gt;if-else&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Реализация собственного MyArrayList по аналогии с ArrayList</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-implement-myarraylist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-implement-myarraylist/</guid><description>&lt;h4&gt;88. Реализация собственного MyArrayList по аналогии с ArrayList&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно реализовать свой динамический список &lt;code&gt;MyArrayList&amp;lt;T&amp;gt;&lt;/code&gt; с методами:&lt;br&gt;
&lt;code&gt;add&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, а также внутренней логикой расширения массива.&lt;br&gt;
Поведение должно быть аналогично &lt;code&gt;java.util.ArrayList&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код (входные данные):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MyArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; MyArrayList();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Привет&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Мир&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Java&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Элемент по индексу 1: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(1));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Размер: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;(1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;После удаления:&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; list.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;(); i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(list.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(i));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Внутри нужно хранить массив &lt;code&gt;Object[]&lt;/code&gt;.&lt;br&gt;
💡 Начальный capacity можно взять 10, как в &lt;code&gt;ArrayList&lt;/code&gt;.&lt;br&gt;
💡 При заполнении массива надо делать &lt;code&gt;grow()&lt;/code&gt; → расширять в 1.5–2 раза.&lt;br&gt;
💡 При удалении нужно сдвинуть элементы &lt;code&gt;System.arraycopy&lt;/code&gt;.&lt;br&gt;
💡 Не забыть проверки на выход за пределы.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Arrays;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyArrayList&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Object&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; DEFAULT_CAPACITY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyArrayList&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Object&lt;span style="color:#f92672"&gt;[&lt;/span&gt;DEFAULT_CAPACITY&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(T element) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ensureCapacity(size &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data&lt;span style="color:#f92672"&gt;[&lt;/span&gt;size&lt;span style="color:#f92672"&gt;++]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; element;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; T &lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; index) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; checkIndex(index);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (T) data&lt;span style="color:#f92672"&gt;[&lt;/span&gt;index&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; T &lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; index) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; checkIndex(index);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; T removed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (T) data&lt;span style="color:#f92672"&gt;[&lt;/span&gt;index&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; elementsAfter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; size &lt;span style="color:#f92672"&gt;-&lt;/span&gt; index &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (elementsAfter &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;arraycopy&lt;/span&gt;(data, index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1, data, index, elementsAfter);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data&lt;span style="color:#f92672"&gt;[--&lt;/span&gt;size&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// освобождаем ссылку&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; removed;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ensureCapacity&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minCapacity) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (minCapacity &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; data.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; newCapacity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (data.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; 1); &lt;span style="color:#75715e"&gt;// *1.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (newCapacity &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; minCapacity) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newCapacity &lt;span style="color:#f92672"&gt;=&lt;/span&gt; minCapacity;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;copyOf&lt;/span&gt;(data, newCapacity);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;checkIndex&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; index) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (index &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 0 &lt;span style="color:#f92672"&gt;||&lt;/span&gt; index &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; size) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IndexOutOfBoundsException(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Index &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; index &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; out of bounds for size &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Пример работы кода из Main:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Реализация стека с `push`, `pop`, `peekMax` за O(1)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-max-stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-max-stack/</guid><description>&lt;h4&gt;103. Реализация стека с `push`, `pop`, `peekMax` за O(1)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно реализовать свой класс &lt;strong&gt;стека&lt;/strong&gt;, который поддерживает операции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;push(x)&lt;/code&gt; — положить элемент в стек&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pop()&lt;/code&gt; — удалить верхний элемент&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;peekMax()&lt;/code&gt; — вернуть &lt;strong&gt;максимальный элемент в стеке за O(1)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Реализовать стек с поддержкой max за O(1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Классическое решение — использовать &lt;strong&gt;два стека&lt;/strong&gt;.&lt;br&gt;
💡 Основной стек хранит значения.&lt;br&gt;
💡 Второй стек хранит текущий максимум на каждом уровне.&lt;br&gt;
💡 Тогда &lt;code&gt;peekMax()&lt;/code&gt; работает за O(1).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayDeque;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Deque;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.NoSuchElementException;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MaxStack&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Deque&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; stack &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayDeque&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Deque&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; maxStack &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayDeque&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (maxStack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxStack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxStack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(value, maxStack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;()));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (stack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; NoSuchElementException(&lt;span style="color:#e6db74"&gt;&amp;#34;Stack is empty&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxStack.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; stack.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;peekMax&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (maxStack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; NoSuchElementException(&lt;span style="color:#e6db74"&gt;&amp;#34;Stack is empty&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; maxStack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Реализация стека с поддержкой получения минимума за O(1)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-min-stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-min-stack/</guid><description>&lt;h4&gt;40. Реализация стека с поддержкой получения минимума за O(1)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Написать класс &lt;code&gt;MinStack&lt;/code&gt; с методами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;void push(int x)&lt;/code&gt; — добавить элемент в стек;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int pop()&lt;/code&gt; — удалить и вернуть верхний элемент стека;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int top()&lt;/code&gt; — вернуть верхний элемент без удаления;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int peekMin()&lt;/code&gt; — вернуть минимальный элемент в стеке за O(1).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MinStack&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;strong&gt;два стека&lt;/strong&gt;: один для хранения всех элементов, другой — для хранения текущих минимумов.&lt;br&gt;
💡 При &lt;code&gt;push(x)&lt;/code&gt; добавляйте в стек-min либо &lt;code&gt;x&lt;/code&gt;, если стек-min пуст, либо &lt;code&gt;min(x, текущий минимум)&lt;/code&gt;.&lt;br&gt;
💡 При &lt;code&gt;pop()&lt;/code&gt; удаляйте элементы из обоих стеков одновременно.&lt;br&gt;
💡 &lt;code&gt;peekMin()&lt;/code&gt; просто возвращает верхний элемент из второго стека.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Stack;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MinStack&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Stack&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; stack;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Stack&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; minStack;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MinStack&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stack &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Stack&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minStack &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Stack&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Если стек мин пуст или новый элемент меньше текущего минимума — пушим его&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (minStack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;() &lt;span style="color:#f92672"&gt;||&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; minStack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minStack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Иначе дублируем текущий минимум&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minStack.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(minStack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (stack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RuntimeException(&lt;span style="color:#e6db74"&gt;&amp;#34;Стек пуст&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minStack.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; stack.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;top&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (stack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RuntimeException(&lt;span style="color:#e6db74"&gt;&amp;#34;Стек пуст&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; stack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;peekMin&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (minStack.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RuntimeException(&lt;span style="color:#e6db74"&gt;&amp;#34;Стек пуст&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; minStack.&lt;span style="color:#a6e22e"&gt;peek&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MinStack ms &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; MinStack();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ms.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(5);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ms.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ms.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(4);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Мин: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ms.&lt;span style="color:#a6e22e"&gt;peekMin&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ms.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Мин: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ms.&lt;span style="color:#a6e22e"&gt;peekMin&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ms.&lt;span style="color:#a6e22e"&gt;pop&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Мин: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ms.&lt;span style="color:#a6e22e"&gt;peekMin&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Top: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ms.&lt;span style="color:#a6e22e"&gt;top&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Реализовать код для отображения "Тик" и "Так" с разницей в одну секунду, используя два потока, с синхронизацией потоков в Java?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-thread-sync-tick-tock/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-thread-sync-tick-tock/</guid><description>&lt;h4&gt;5. Реализовать код для отображения &amp;#34;Тик&amp;#34; и &amp;#34;Так&amp;#34; с разницей в одну секунду, используя два потока&lt;/h4&gt;
 &lt;ul&gt;
&lt;li&gt;Один поток должен печатать &amp;ldquo;Тик&amp;rdquo;, а другой — &amp;ldquo;Так&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Потоки должны работать с разницей в одну секунду.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для синхронизации потоков можно использовать &lt;strong&gt;wait()&lt;/strong&gt; и &lt;strong&gt;notify()&lt;/strong&gt; или &lt;strong&gt;notifyAll()&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Используйте общий объект или блок синхронизации для координации потоков.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Вот пример кода для реализации задачи:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TickTock&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Object lock &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Object();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; tickTurn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Флаг для управления порядком&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tick&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (lock) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;tickTurn) { &lt;span style="color:#75715e"&gt;// Если очередь не для &amp;#34;Тика&amp;#34;, ждем&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (InterruptedException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;currentThread&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;interrupt&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Тик&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tickTurn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Смена очередности&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Будим другой поток&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tock&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;synchronized&lt;/span&gt; (lock) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (tickTurn) { &lt;span style="color:#75715e"&gt;// Если очередь не для &amp;#34;Така&amp;#34;, ждем&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (InterruptedException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;currentThread&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;interrupt&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Так&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tickTurn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Смена очередности&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.&lt;span style="color:#a6e22e"&gt;notify&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Будим другой поток&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TickTock tickTock &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; TickTock();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread tickThread &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Thread(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 5; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tickTock.&lt;span style="color:#a6e22e"&gt;tick&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(1000); &lt;span style="color:#75715e"&gt;// Задержка 1 секунда&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (InterruptedException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;currentThread&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;interrupt&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread tockThread &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Thread(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; 5; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tickTock.&lt;span style="color:#a6e22e"&gt;tock&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(1000); &lt;span style="color:#75715e"&gt;// Задержка 1 секунда&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (InterruptedException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Thread.&lt;span style="color:#a6e22e"&gt;currentThread&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;interrupt&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tickThread.&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tockThread.&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Реализовать паттерн Декоратор в Java?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-decorator-pattern/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-decorator-pattern/</guid><description>&lt;h4&gt;6. Реализовать паттерн Decorator&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Паттерн &lt;strong&gt;Декоратор&lt;/strong&gt; позволяет динамически добавлять новое поведение объекту, оборачивая его в другой объект.&lt;/li&gt;
&lt;li&gt;Для этого создается базовый интерфейс, который реализуют как декорируемые классы, так и их декораторы.&lt;/li&gt;
&lt;li&gt;Декораторы должны реализовывать тот же интерфейс и делегировать вызовы объекту, который они декорируют, добавляя дополнительные действия до или после делегирования.&lt;/li&gt;
&lt;li&gt;Паттерн полезен, если нужно добавлять функциональность объекту без изменения его кода.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Для демонстрации паттерна Декоратор создадим систему, где будем декорировать объект, добавляя разные действия, например, к текстовому сообщению.&lt;/p&gt;</description></item><item><title>Реализовать сервис для работы с токенами с ограничением на количество использований?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-token-limited-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-token-limited-usage/</guid><description>&lt;h4&gt;9. Реализовать класс-сервис для работы с токенами с ограничением на количество использований&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для реализации сервиса с токенами нужно создать структуру данных, которая будет отслеживать количество использований токенов.&lt;/li&gt;
&lt;li&gt;Можно использовать &lt;strong&gt;HashMap&lt;/strong&gt; или &lt;strong&gt;Redis&lt;/strong&gt; для хранения токенов с их статусами.&lt;/li&gt;
&lt;li&gt;Нужно хранить:
&lt;ul&gt;
&lt;li&gt;Токен (например, строка).&lt;/li&gt;
&lt;li&gt;Количество оставшихся использований для этого токена.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;После использования токена количество оставшихся использований уменьшается.&lt;/li&gt;
&lt;li&gt;Если количество использований исчерпано, токен становится невалидным.&lt;/li&gt;
&lt;li&gt;Пример ограничения использования токенов:
&lt;ul&gt;
&lt;li&gt;Токен может быть использован 5 раз.&lt;/li&gt;
&lt;li&gt;После пятого использования токен становится недействительным.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Пример реализации сервиса для работы с токенами:&lt;/p&gt;</description></item><item><title>Реверс строки</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-string/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-reverse-string/</guid><description>&lt;h4&gt;38. Реверс строки&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Напишите метод, который принимает строку и возвращает её реверс.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StringUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;(String input) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Проверьте вход на &lt;code&gt;null&lt;/code&gt; и при необходимости выбросьте &lt;code&gt;IllegalArgumentException&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;StringBuilder(input).reverse().toString()&lt;/code&gt; для простого и быстрого реверса.&lt;br&gt;
💡 Альтернативно можно обойти строку с конца до начала и собирать символы в новый &lt;code&gt;StringBuilder&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;StringUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;(String input) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (input &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Input string must not be null&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; StringBuilder(input).&lt;span style="color:#a6e22e"&gt;reverse&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(reverse(&lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// olleh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(reverse(&lt;span style="color:#e6db74"&gt;&amp;#34;Java&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// avaJ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Ревью и улучшение Spring-сервиса работы с контрактами</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-contract-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-contract-service/</guid><description>&lt;h4&gt;32. Ревью и улучшение Spring-сервиса работы с контрактами&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Проведите ревью кода сервиса для работы с контрактами. Сервис должен иметь два метода:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;save&lt;/strong&gt; — для сохранения контракта;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;getPage&lt;/strong&gt; — для получения контрактов постранично с использованием кэша, чтобы не обращаться к БД каждый раз.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String KT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;TOPIC&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; ONPAGE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; ContractRepository repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; KafkaTemplate&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; kafka;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Long, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; cache;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(Long a, String b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Contract x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Contract(a, b);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repo.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(x);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kafka.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(KT, &lt;span style="color:#e6db74"&gt;&amp;#34;contract was created&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; number) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;cache.&lt;span style="color:#a6e22e"&gt;containsKey&lt;/span&gt;(number)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; cs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; repo.&lt;span style="color:#a6e22e"&gt;findAll&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; ONPAGE; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Contract c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cs.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; number &lt;span style="color:#f92672"&gt;*&lt;/span&gt; ONPAGE);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cache.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(number, r);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cache.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(number);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Используй инъекцию зависимостей через конструктор&lt;/strong&gt; вместо публичных полей для &lt;code&gt;repo&lt;/code&gt; и &lt;code&gt;kafka&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Замени тип кэша&lt;/strong&gt; с &lt;code&gt;HashMap&amp;lt;Long, List&amp;lt;Contract&amp;gt;&amp;gt;&lt;/code&gt; на более подходящий тип, например, &lt;code&gt;Map&amp;lt;Integer, List&amp;lt;Contract&amp;gt;&amp;gt;&lt;/code&gt; с потокобезопасной реализацией (например, &lt;code&gt;ConcurrentHashMap&lt;/code&gt;).&lt;br&gt;
💡 &lt;strong&gt;Обновление кэша:&lt;/strong&gt; При сохранении нового контракта стоит сбросить кэш, чтобы последующие запросы получали актуальные данные.&lt;br&gt;
💡 &lt;strong&gt;Обработка границ:&lt;/strong&gt; В методе &lt;code&gt;getPage&lt;/code&gt; предусмотри случай, когда запрошенная страница выходит за пределы имеющихся данных, чтобы не возникала ошибка &lt;code&gt;IndexOutOfBoundsException&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.stereotype.Service;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.kafka.core.KafkaTemplate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Collections;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.concurrent.ConcurrentHashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String KT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;TOPIC&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; ONPAGE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ContractRepository repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; KafkaTemplate&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; kafka;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Используем потокобезопасный кэш&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; cache &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ConcurrentHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Инъекция зависимостей через конструктор&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractService&lt;/span&gt;(ContractRepository repo, KafkaTemplate&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; kafka) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;repo&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;kafka&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; kafka;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Метод сохранения контракта с последующим сбросом кэша&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(Long id, String data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Contract contract &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Contract(id, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repo.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(contract);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kafka.&lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(KT, &lt;span style="color:#e6db74"&gt;&amp;#34;contract was created&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Очистка кэша, чтобы данные оставались актуальными&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cache.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Метод получения контрактов по страницам с обработкой границ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPage&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; number) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cache.&lt;span style="color:#a6e22e"&gt;computeIfAbsent&lt;/span&gt;(number, page &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; allContracts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; repo.&lt;span style="color:#a6e22e"&gt;findAll&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; start &lt;span style="color:#f92672"&gt;=&lt;/span&gt; page &lt;span style="color:#f92672"&gt;*&lt;/span&gt; ONPAGE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (start &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; allContracts.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Если запрошенная страница выходит за пределы коллекции, вернем пустой список&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Collections.&lt;span style="color:#a6e22e"&gt;emptyList&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; end &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(start &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ONPAGE, allContracts.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(allContracts.&lt;span style="color:#a6e22e"&gt;subList&lt;/span&gt;(start, end));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Инъекция зависимостей через конструктор:&lt;/strong&gt; Улучшает тестируемость и делает код менее зависимым.&lt;br&gt;
✅ &lt;strong&gt;Потокобезопасный кэш:&lt;/strong&gt; Использование &lt;code&gt;ConcurrentHashMap&lt;/code&gt; обеспечивает корректную работу в многопоточной среде.&lt;br&gt;
✅ &lt;strong&gt;Сброс кэша при сохранении:&lt;/strong&gt; Гарантирует, что кэш не будет содержать устаревшие данные после добавления нового контракта.&lt;br&gt;
✅ &lt;strong&gt;Обработка границ страницы:&lt;/strong&gt; Метод &lt;code&gt;getPage&lt;/code&gt; возвращает пустой список, если запрошенная страница выходит за пределы имеющихся контрактов, что предотвращает ошибки.&lt;br&gt;
✅ &lt;strong&gt;Повышенная читаемость и поддерживаемость кода:&lt;/strong&gt; Улучшения делают сервис более надежным и соответствующим современным практикам разработки на Spring.&lt;/p&gt;</description></item><item><title>Рефакторинг BookingService для корректного бронирования</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-booking-service-refactor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-booking-service-refactor/</guid><description>&lt;h4&gt;63. Рефакторинг BookingService для корректного бронирования&lt;/h4&gt;
 &lt;p&gt;Дан код с ошибками. Сервис бронирования номеров. У Room есть статус: забронирован или свободен. Метод bookRoom() семантически написан правильно. Но надо подумать, почему этот код пройдет все тестовые стенды, но будет косячить на проде? Можно порефакторить&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BookingService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; RoomRepository roomRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bookRoom&lt;/span&gt;(Integer roomId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; roomBooked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Room room &lt;span style="color:#f92672"&gt;=&lt;/span&gt; roomRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(roomId);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(room.&lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;VACANT&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; room.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;BOOKED&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; room.&lt;span style="color:#a6e22e"&gt;setClientId&lt;/span&gt;(SecurityContext.&lt;span style="color:#a6e22e"&gt;getClientId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; roomRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(room);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; roomBooked &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; roomBooked;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Entity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Room&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String status; &lt;span style="color:#75715e"&gt;// VACANT, BOOKED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String clientId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String roomNumber;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RoomRepository&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; JpaRepository&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Room, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Состояние гонки возникает из‑за отсутствия &lt;strong&gt;транзакций&lt;/strong&gt; и &lt;strong&gt;блокировок&lt;/strong&gt; при чтении/записи.&lt;br&gt;
💡 Нужно обернуть логику в &lt;code&gt;@Transactional&lt;/code&gt;, чтобы всё происходило в одной транзакции.&lt;br&gt;
💡 Для гарантии атомарного обновления использовать &lt;strong&gt;пессимистическую&lt;/strong&gt; или &lt;strong&gt;оптимистическую блокировку&lt;/strong&gt; (версия в сущности).&lt;br&gt;
💡 Альтернатива: добавить в &lt;code&gt;RoomRepository&lt;/code&gt; метод &lt;code&gt;@Modifying @Query&lt;/code&gt; с условием &lt;code&gt;WHERE status = 'VACANT'&lt;/code&gt; и проверять количество обновлённых строк.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; javax.persistence.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.stereotype.Service;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.transaction.annotation.Transactional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Entity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Room&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Integer id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Long version; &lt;span style="color:#75715e"&gt;// для оптимистической блокировки&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String status; &lt;span style="color:#75715e"&gt;// VACANT, BOOKED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String clientId;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String roomNumber;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// геттеры/сеттеры omitted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RoomRepository&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; JpaRepository&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Room, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вариант с модифицирующим запросом:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Modifying&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;UPDATE Room r SET r.status = &amp;#39;BOOKED&amp;#39;, r.clientId = :clientId WHERE r.id = :roomId AND r.status = &amp;#39;VACANT&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bookIfVacant&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;@Param&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;roomId&amp;#34;&lt;/span&gt;) Integer roomId, &lt;span style="color:#a6e22e"&gt;@Param&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;clientId&amp;#34;&lt;/span&gt;) String clientId);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BookingService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; RoomRepository roomRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BookingService&lt;/span&gt;(RoomRepository roomRepository) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;roomRepository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; roomRepository;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вариант 1: Используем модифицирующий запрос — атомарность на уровне БД&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bookRoom&lt;/span&gt;(Integer roomId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String clientId &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SecurityContext.&lt;span style="color:#a6e22e"&gt;getClientId&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; updated &lt;span style="color:#f92672"&gt;=&lt;/span&gt; roomRepository.&lt;span style="color:#a6e22e"&gt;bookIfVacant&lt;/span&gt;(roomId, clientId);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; updated &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вариант 2: Оптимистическая блокировка через @Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bookRoomOptimistic&lt;/span&gt;(Integer roomId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Room room &lt;span style="color:#f92672"&gt;=&lt;/span&gt; roomRepository.&lt;span style="color:#a6e22e"&gt;findById&lt;/span&gt;(roomId)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;orElseThrow&lt;/span&gt;(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; EntityNotFoundException(&lt;span style="color:#e6db74"&gt;&amp;#34;Room not found: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; roomId));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;VACANT&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(room.&lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;())) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; room.&lt;span style="color:#a6e22e"&gt;setStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;BOOKED&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; room.&lt;span style="color:#a6e22e"&gt;setClientId&lt;/span&gt;(SecurityContext.&lt;span style="color:#a6e22e"&gt;getClientId&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; roomRepository.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(room); &lt;span style="color:#75715e"&gt;// при конфликте выбросит OptimisticLockException&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Рефакторинг DocumentService с паттерном Стратегия</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-document-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-document-service/</guid><description>&lt;h4&gt;56. Рефакторинг DocumentService с паттерном Стратегия&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть класс &lt;code&gt;DocumentService&lt;/code&gt; с методом &lt;code&gt;readDocument(String type)&lt;/code&gt;, в котором жёстко прописан выбор типа через &lt;code&gt;if-else&lt;/code&gt;. Нужно провести код‑ревью, выделить плюсы и минусы текущей реализации, и &lt;strong&gt;рефакторить&lt;/strong&gt; под паттерн &lt;strong&gt;Стратегия&lt;/strong&gt;, а также &lt;strong&gt;добавить реализацию&lt;/strong&gt; для чтения PDF.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; InputStream &lt;span style="color:#a6e22e"&gt;readDocument&lt;/span&gt;(String type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DocumentReader reader &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; DocumentReader();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PDF&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readPdf&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;DOCX&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readDocx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (type.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;XLSX&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reader.&lt;span style="color:#a6e22e"&gt;readXlsx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Сейчас в &lt;code&gt;readDocument&lt;/code&gt; жёсткая привязка к типам через &lt;code&gt;if-else&lt;/code&gt; — при добавлении новых форматов придётся править метод.&lt;br&gt;
💡 Плюс: простой и понятный код для трёх форматов.&lt;br&gt;
💡 Минус: нарушает принцип OCP (открытость/закрытость), сложно тестировать и расширять.&lt;br&gt;
💡 Решение: выделить интерфейс &lt;code&gt;DocumentReaderStrategy&lt;/code&gt;, реализовать для каждого формата и инжектить коллекцию стратегий в &lt;code&gt;DocumentService&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 1. Определяем стратегию&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentReaderStrategy&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;supports&lt;/span&gt;(String type);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; InputStream &lt;span style="color:#a6e22e"&gt;read&lt;/span&gt;(InputStream source);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 2. Реализация для PDF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Qualifier&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PDF&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PdfDocumentReader&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; DocumentReaderStrategy {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;supports&lt;/span&gt;(String type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;PDF&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equalsIgnoreCase&lt;/span&gt;(type);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; InputStream &lt;span style="color:#a6e22e"&gt;read&lt;/span&gt;(InputStream source) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: Реальная логика чтения PDF из source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Для примера просто возвращаем source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; source;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 3. Сервис с коллекцией стратегий&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;DocumentReaderStrategy&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; readers;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DocumentService&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;DocumentReaderStrategy&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; readers) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readers&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; readers;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; InputStream &lt;span style="color:#a6e22e"&gt;readDocument&lt;/span&gt;(String type, InputStream source) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; readers.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(r &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; r.&lt;span style="color:#a6e22e"&gt;supports&lt;/span&gt;(type))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;findFirst&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;orElseThrow&lt;/span&gt;(() &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Unsupported type: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; type))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;read&lt;/span&gt;(source);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 4. Пример вызова&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppRunner&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; CommandLineRunner {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; DocumentService documentService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppRunner&lt;/span&gt;(DocumentService documentService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;documentService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; documentService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run&lt;/span&gt;(String... args) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; InputStream pdfSource &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ByteArrayInputStream(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt;{&lt;span style="color:#75715e"&gt;/* ... */&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; InputStream result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; documentService.&lt;span style="color:#a6e22e"&gt;readDocument&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PDF&amp;#34;&lt;/span&gt;, pdfSource);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PDF прочитан, получен InputStream: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Рефакторинг SomeServiceImpl для асинхронности и корректности</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-someservice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fix-someservice/</guid><description>&lt;h4&gt;51. Рефакторинг SomeServiceImpl для асинхронности и корректности&lt;/h4&gt;
 &lt;p&gt;Дан код. Надо найти ошибки в классе и поправить. Дан высоконагруженный микросервис. Запущено в k8s 8 подов (реплик). Цель кода вычитать из БД записи и отправить в сервис аналитики. За это отвечает метод processJobRunning(). И вторая задача кода: отправить чеки в налоговую. Снаружи из другого нашего микросервиса приходит запрос sendReceipt(). Объект taxClient наподобие feign client. Налоговая может отвечать больше 10 сек, а нам нужно работать быстро. Как это порешать? Там, где написано &amp;ldquo;граница класса&amp;rdquo;, там ниже есть DTO-шки, репозитории, которые помогут прочитать код. И там ошибки не надо искать&lt;/p&gt;</description></item><item><title>Рефакторинг кода PersonService</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-personservice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-refactor-personservice/</guid><description>&lt;h4&gt;18. Рефакторинг кода PersonService&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Проведи &lt;strong&gt;рефакторинг&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PersonService&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// no usages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getAdultMaleUsersAverageBMI&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; totalIMT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.&lt;span style="color:#a6e22e"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; countOfPerson &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; heightInMeters &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0d;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; imt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0d;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; adultPersons &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Connection c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DriverManager.&lt;span style="color:#a6e22e"&gt;getConnection&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;jdbc:hsqldb:mem:test&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;qwerty54&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Statement s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; c.&lt;span style="color:#a6e22e"&gt;createStatement&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResultSet rs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;executeQuery&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT * FROM person WHERE sex = &amp;#39;male&amp;#39; AND age &amp;gt;= 18&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (rs.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Person p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Person();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setId&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getLong&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setSex&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getString&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;sex&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setName&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getString&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setAge&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getLong&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;age&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setWeight&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getLong&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p.&lt;span style="color:#a6e22e"&gt;setHeight&lt;/span&gt;(rs.&lt;span style="color:#a6e22e"&gt;getLong&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; adultPersons.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(p);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (Person p : adultPersons) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; heightInMeters &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;getHeight&lt;/span&gt;() &lt;span style="color:#f92672"&gt;/&lt;/span&gt; 100d;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; imt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;getWeight&lt;/span&gt;() &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (Double) (heightInMeters &lt;span style="color:#f92672"&gt;*&lt;/span&gt; heightInMeters);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; totalIMT &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; imt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countOfPerson &lt;span style="color:#f92672"&gt;=&lt;/span&gt; adultPersons.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (Exception e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.&lt;span style="color:#a6e22e"&gt;printStackTrace&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Average imt = &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; totalIMT &lt;span style="color:#f92672"&gt;/&lt;/span&gt; countOfPerson);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Избавься от ненужного списка &lt;code&gt;adultPersons&lt;/code&gt;&lt;/strong&gt; – сразу считай BMI во время чтения из &lt;code&gt;ResultSet&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Используй &lt;code&gt;try-with-resources&lt;/code&gt;&lt;/strong&gt; для автоматического закрытия соединений.&lt;br&gt;
💡 &lt;strong&gt;Избавься от избыточных переменных&lt;/strong&gt; – сразу вычисляй &lt;code&gt;imt&lt;/code&gt; и обновляй &lt;code&gt;totalIMT&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Добавь логирование ошибок&lt;/strong&gt; вместо &lt;code&gt;printStackTrace()&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.sql.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PersonService&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getAdultMaleUsersAverageBMI&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String query &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SELECT weight, height FROM person WHERE sex = &amp;#39;male&amp;#39; AND age &amp;gt;= 18&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; totalIMT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0.&lt;span style="color:#a6e22e"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; countOfPerson &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; (Connection c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DriverManager.&lt;span style="color:#a6e22e"&gt;getConnection&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;jdbc:hsqldb:mem:test&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;qwerty54&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Statement s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; c.&lt;span style="color:#a6e22e"&gt;createStatement&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ResultSet rs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;executeQuery&lt;/span&gt;(query)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (rs.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; heightInMeters &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rs.&lt;span style="color:#a6e22e"&gt;getDouble&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; 100.&lt;span style="color:#a6e22e"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; imt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; rs.&lt;span style="color:#a6e22e"&gt;getDouble&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (heightInMeters &lt;span style="color:#f92672"&gt;*&lt;/span&gt; heightInMeters);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; totalIMT &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; imt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countOfPerson&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (countOfPerson &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Average BMI = %.2f%n&amp;#34;&lt;/span&gt;, totalIMT &lt;span style="color:#f92672"&gt;/&lt;/span&gt; countOfPerson);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;No adult male users found.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (SQLException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Database error: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; e.&lt;span style="color:#a6e22e"&gt;getMessage&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Меньше кода&lt;/strong&gt; – убрали лишний список &lt;code&gt;adultPersons&lt;/code&gt;.&lt;br&gt;
✅ &lt;strong&gt;Оптимизирована память&lt;/strong&gt; – теперь &lt;code&gt;Person&lt;/code&gt; объекты не создаются, если не нужны.&lt;br&gt;
✅ &lt;strong&gt;Используется &lt;code&gt;try-with-resources&lt;/code&gt;&lt;/strong&gt; – ресурсы закрываются автоматически.&lt;br&gt;
✅ &lt;strong&gt;Добавлена проверка на пустой результат&lt;/strong&gt; – если мужчин нет, выводится сообщение.&lt;br&gt;
✅ &lt;strong&gt;Более чистый и понятный код&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Рефакторинг функции Фибоначчи</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fib-refactor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-fib-refactor/</guid><description>&lt;h4&gt;30. Рефакторинг функции Фибоначчи&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Проведи рефакторинг функции вычисления числа Фибоначчи.&lt;br&gt;
В оригинальном коде используется рекурсия без оптимизации, что приводит к экспоненциальной сложности.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fib&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 1) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; fib(n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;1) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; fib(n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Оригинальная сложность:&lt;/strong&gt; Рекурсивное вычисление без мемоизации имеет экспоненциальную сложность O(2^n).&lt;br&gt;
💡 &lt;strong&gt;Оптимизация:&lt;/strong&gt; Используй итеративное вычисление или мемоизацию (динамическое программирование), чтобы снизить сложность до O(n).&lt;br&gt;
💡 &lt;strong&gt;Итеративный подход:&lt;/strong&gt; Применение цикла для последовательного вычисления чисел Фибоначчи – эффективное решение для данной задачи.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Fibonacci&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Итеративная реализация с линейной сложностью O(n)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fib&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 1) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0, b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 2; i &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; n; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; next &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;fib(10) = &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; fib(10)); &lt;span style="color:#75715e"&gt;// Пример: 55&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Снижение сложности:&lt;/strong&gt; Итеративный подход снижает асимптотику с экспоненциальной до O(n).&lt;br&gt;
✅ &lt;strong&gt;Экономия памяти:&lt;/strong&gt; Использование двух переменных для хранения предыдущих значений вместо рекурсивного стека.&lt;br&gt;
✅ &lt;strong&gt;Повышенная производительность:&lt;/strong&gt; Новый подход позволяет эффективно вычислять Fibonacci для больших значений &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Решение задачи HackerRank "Repeat String"</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-repeated-string/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-repeated-string/</guid><description>&lt;h4&gt;35. Решение задачи HackerRank &amp;#34;Repeat String&amp;#34;&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дан строка &lt;code&gt;s&lt;/code&gt;, состоящая из строчных английских букв, которая повторяется бесконечно. Дано целое число &lt;code&gt;n&lt;/code&gt;. Необходимо посчитать количество букв &lt;code&gt;'a'&lt;/code&gt; в первых &lt;code&gt;n&lt;/code&gt; символах этой бесконечной строки.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;s = &amp;ldquo;abcac&amp;rdquo;, n = 10&lt;/li&gt;
&lt;li&gt;Подстрока из первых 10 символов: &amp;ldquo;abcacabcac&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Количество букв &amp;lsquo;a&amp;rsquo;: 4&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Result&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Complete the &amp;#39;repeatedString&amp;#39; function below.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * The function is expected to return a LONG_INTEGER.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * The function accepts following parameters:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 1. STRING s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 2. LONG_INTEGER n
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;strong&gt;Используй деление:&lt;/strong&gt; Определи число полных повторений строки, разделив &lt;code&gt;n&lt;/code&gt; на длину строки &lt;code&gt;s&lt;/code&gt;.&lt;br&gt;
💡 &lt;strong&gt;Подсчитай &amp;lsquo;a&amp;rsquo;:&lt;/strong&gt; Сначала посчитай количество &lt;code&gt;'a'&lt;/code&gt; в строке &lt;code&gt;s&lt;/code&gt;, а затем умножь на число полных повторений.&lt;br&gt;
💡 &lt;strong&gt;Обработка остатка:&lt;/strong&gt; Не забудь проверить первые &lt;code&gt;n % s.length()&lt;/code&gt; символов для корректного подсчёта.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Result&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repeatedString&lt;/span&gt;(String s, &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Подсчёт количества &amp;#39;a&amp;#39; в строке s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; countA &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; c : s.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (c &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; countA&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Определяем, сколько полных повторов строки укладывается в n символов&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; fullRepeats &lt;span style="color:#f92672"&gt;=&lt;/span&gt; n &lt;span style="color:#f92672"&gt;/&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; totalA &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fullRepeats &lt;span style="color:#f92672"&gt;*&lt;/span&gt; countA;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Обработка остатка: считаем &amp;#39;a&amp;#39; в первых (n % s.length()) символах&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; remainingChars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) (n &lt;span style="color:#f92672"&gt;%&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; remainingChars; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (s.&lt;span style="color:#a6e22e"&gt;charAt&lt;/span&gt;(i) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; totalA&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; totalA;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;abcac&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Количество &amp;#39;a&amp;#39;: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; repeatedString(s, n)); &lt;span style="color:#75715e"&gt;// Ожидаемый вывод: 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что улучшилось?&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Оптимальность:&lt;/strong&gt; Вместо создания бесконечной строки алгоритм учитывает полные повторения и остаток, что эффективно при больших &lt;code&gt;n&lt;/code&gt;.&lt;br&gt;
✅ &lt;strong&gt;Читаемость кода:&lt;/strong&gt; Ясное разделение логики на подсчёт &lt;code&gt;a&lt;/code&gt; в полном повторении и обработку остатка.&lt;br&gt;
✅ &lt;strong&gt;Стабильность:&lt;/strong&gt; Решение работает корректно даже для очень больших значений &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Рыбы с суммарным уловом на дату d менее n</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-fish-with-catch-less-than/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-fish-with-catch-less-than/</guid><description>&lt;h4&gt;26. Рыбы с суммарным уловом на дату d менее n&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;fish&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;catch&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;fish_id&lt;/code&gt;, &lt;code&gt;dt&lt;/code&gt;, &lt;code&gt;quantity&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо вывести &lt;strong&gt;наименования рыб&lt;/strong&gt;, для которых &lt;strong&gt;суммарный улов&lt;/strong&gt; на указанную дату &lt;code&gt;d&lt;/code&gt; &lt;strong&gt;меньше&lt;/strong&gt; чем &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Фильтр по дате делается в &lt;code&gt;WHERE dt = :d&lt;/code&gt;.&lt;br&gt;
💡 Суммарный улов считаем через &lt;code&gt;SUM(quantity)&lt;/code&gt; и группировку по &lt;code&gt;fish_id&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;HAVING SUM(quantity) &amp;lt; :n&lt;/code&gt; для первой реализации.&lt;br&gt;
💡 Во втором варианте можно применить &lt;strong&gt;подзапрос&lt;/strong&gt; либо &lt;strong&gt;LEFT JOIN&lt;/strong&gt; и фильтрацию по агрегату.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&amp;ndash; Решение 1: GROUP BY + HAVING&lt;/p&gt;</description></item><item><title>Самые повторяющиеся значения `value`</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-most-frequent-value/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-most-frequent-value/</guid><description>&lt;h4&gt;29. Самые повторяющиеся значения `value`&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица с колонками &lt;code&gt;key&lt;/code&gt; и &lt;code&gt;value&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key | value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;----+-------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 | sdfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2 | dsfg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3 | sdfs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Необходимо найти самое часто встречающееся значение в колонке &lt;code&gt;value&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY value&lt;/code&gt; для подсчёта количества вхождений каждого значения.&lt;br&gt;
💡 Отсортируйте результат по убыванию счётчика (&lt;code&gt;COUNT(*) DESC&lt;/code&gt;) и возьмите первую строку (&lt;code&gt;LIMIT 1&lt;/code&gt;).&lt;br&gt;
💡 Альтернативно примените оконную функцию &lt;code&gt;ROW_NUMBER()&lt;/code&gt; или &lt;code&gt;RANK()&lt;/code&gt;, чтобы выбрать значение с максимальным количеством.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: GROUP BY + ORDER BY + LIMIT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; your_table
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Оконная функция RANK()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RANK() OVER (&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; rnk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; your_table
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rnk &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Сжатие подряд идущих символов по ключу</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-compress-consecutive/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-compress-consecutive/</guid><description>&lt;h4&gt;53. Сжатие подряд идущих символов по ключу&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Даны два входных аргумента: строка &lt;code&gt;text&lt;/code&gt; и целое число &lt;code&gt;k&lt;/code&gt;. Необходимо заменить в строке все группы подряд идущих одинаковых символов так, чтобы каждые &lt;code&gt;k&lt;/code&gt; одинаковых символов заменялись одним символом. Например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;При &lt;code&gt;k = 1&lt;/code&gt; строка остаётся без изменений.&lt;/li&gt;
&lt;li&gt;При &lt;code&gt;k = 2&lt;/code&gt; группу &lt;code&gt;&amp;quot;aa&amp;quot;&lt;/code&gt; заменяем на &lt;code&gt;&amp;quot;a&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;При &lt;code&gt;k = 3&lt;/code&gt; группу &lt;code&gt;&amp;quot;aaa&amp;quot;&lt;/code&gt; также на &lt;code&gt;&amp;quot;a&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Если группа длиннее &lt;code&gt;k&lt;/code&gt;, например &lt;code&gt;&amp;quot;cccc&amp;quot;&lt;/code&gt; при &lt;code&gt;k = 2&lt;/code&gt;, результат — две буквы &lt;code&gt;&amp;quot;cc&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Собственный прокси для обеспечения отдельной транзакции</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transaction-proxy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transaction-proxy/</guid><description>&lt;h4&gt;45. Собственный прокси для обеспечения отдельной транзакции&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Дан класс с методами &lt;code&gt;methodA()&lt;/code&gt; и &lt;code&gt;methodB()&lt;/code&gt;, оба помечены аннотацией &lt;code&gt;@Transactional&lt;/code&gt;, при этом &lt;code&gt;methodB()&lt;/code&gt; должен выполняться в новой транзакции (&lt;code&gt;PROPAGATION_REQUIRES_NEW&lt;/code&gt;). Но при вызове &lt;code&gt;methodB()&lt;/code&gt; изнутри &lt;code&gt;methodA()&lt;/code&gt; через &lt;code&gt;this.methodB()&lt;/code&gt; прокси Spring не срабатывает, и новая транзакция не создаётся. Нужно написать свой прокси (или использовать self-injection), чтобы &lt;code&gt;methodB()&lt;/code&gt; вызывался через прокси.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TransactionService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodA&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; methodB(); &lt;span style="color:#75715e"&gt;// Внутренний вызов – прокси не применяется&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;(propagation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Propagation.&lt;span style="color:#a6e22e"&gt;REQUIRES_NEW&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodB&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// some logic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Spring AOP создаёт прокси вокруг Spring-бина и перехватывает только &lt;strong&gt;внешние&lt;/strong&gt; вызовы через прокси.&lt;br&gt;
💡 Чтобы вызвать &lt;code&gt;methodB()&lt;/code&gt; через прокси, нужно получить ссылку на сам прокси-бина внутри класса и вызывать &lt;code&gt;self.methodB()&lt;/code&gt; вместо &lt;code&gt;this.methodB()&lt;/code&gt;.&lt;br&gt;
💡 Можно внедрить сам бин &lt;code&gt;TransactionService&lt;/code&gt; через Spring — он будет прокси-обёрткой.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.aop.framework.AopContext;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.stereotype.Service;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.transaction.annotation.Propagation;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.transaction.annotation.Transactional;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TransactionService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вариант 1: использование AopContext для получения прокси&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodA&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// вместо this.methodB() – получаем текущий прокси&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ((TransactionService) AopContext.&lt;span style="color:#a6e22e"&gt;currentProxy&lt;/span&gt;()).&lt;span style="color:#a6e22e"&gt;methodB&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;(propagation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Propagation.&lt;span style="color:#a6e22e"&gt;REQUIRES_NEW&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;methodB&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// some logic in a new transaction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Дополнительно&lt;/strong&gt;, чтобы &lt;code&gt;AopContext.currentProxy()&lt;/code&gt; работал, нужно включить &lt;code&gt;exposeProxy&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Создать интерфейс с 2 методами. Написать класс, реализующий интерфейс для Integer. В класс можем бесконечно отправлять int-ы. И в любой момент можем вызвать getTopFive() и получить 5 максимальных чисел из тех, что отправили. Можно гуглить. Надо будет запустить, проверить работу</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-top-five-integers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-top-five-integers/</guid><description>&lt;h4&gt;14. Реализовать структуру данных, которая принимает поток целых чисел и в любой момент времени позволяет получить топ-5 наибольших значений&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;I1&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(T t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTopFive&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Нам нужно хранить числа и уметь извлекать 5 максимальных.&lt;br&gt;
🔹 Подойдет &lt;code&gt;PriorityQueue&lt;/code&gt;, так как это минимальная куча (min-heap).&lt;br&gt;
🔹 Размер очереди ограничим 5 элементами, удаляя меньшие значения.&lt;br&gt;
🔹 Используем &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt; для хранения результатов.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;I1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(T t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTopFive&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IntegerTopFive&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; I1 {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; PriorityQueue&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; minHeap &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; PriorityQueue&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(T t) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (t &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Integer) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (Integer) t;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minHeap.&lt;span style="color:#a6e22e"&gt;offer&lt;/span&gt;(value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (minHeap.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 5) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; minHeap.&lt;span style="color:#a6e22e"&gt;poll&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Удаляем минимальный элемент, если больше 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style="color:#e6db74"&gt;&amp;#34;Only integers are allowed&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTopFive&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(minHeap);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(Collections.&lt;span style="color:#a6e22e"&gt;reverseOrder&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// Сортируем по убыванию&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; IntegerTopFive topFive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; IntegerTopFive();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(10);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(5);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(20);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(3);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(8);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(25);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; topFive.&lt;span style="color:#a6e22e"&gt;putValue&lt;/span&gt;(15);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(topFive.&lt;span style="color:#a6e22e"&gt;getTopFive&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// [25, 20, 15, 10, 8]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Создать уникальную коллекцию (типа String) активных (атрибут Item.active со значением true) имен (атрибут Item.name), используя в качестве входных данных список items</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-active-item-names/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-active-item-names/</guid><description>&lt;h4&gt;1. Создать уникальную коллекцию (типа String) активных (атрибут Item.active со значением true) имен (атрибут Item.name), используя в качестве входных данных список items&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Getter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Setter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Item&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Long id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; active;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Item&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Collection&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; items.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Мы можем использовать &lt;strong&gt;Stream API&lt;/strong&gt; в Java для фильтрации элементов из списка и сбора результатов в уникальную коллекцию.&lt;br&gt;
🔍 Для этого воспользуемся &lt;strong&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/strong&gt; для выбора активных элементов и &lt;strong&gt;&lt;code&gt;map&lt;/code&gt;&lt;/strong&gt; для извлечения имен. Затем используем &lt;strong&gt;&lt;code&gt;Collectors.toSet()&lt;/code&gt;&lt;/strong&gt; для того, чтобы результат был уникальным.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Getter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Setter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Item&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Long id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; active;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Item&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; items &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ...; &lt;span style="color:#75715e"&gt;// Ваш список объектов Item&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Collection&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; items.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(Item::isActive) &lt;span style="color:#75715e"&gt;// Фильтруем активные элементы&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(Item::getName) &lt;span style="color:#75715e"&gt;// Извлекаем имя&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toSet&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// Собираем в уникальную коллекцию&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Сортировка массива чисел</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sort-array/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-sort-array/</guid><description>&lt;h4&gt;28. Сортировка массива чисел&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Напишите функцию, которая принимает массив &lt;code&gt;int[]&lt;/code&gt;, сортирует его по возрастанию и возвращает результат.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;strong&gt;алгоритм пузырьковой сортировки (Bubble Sort)&lt;/strong&gt;.&lt;br&gt;
💡 Сравнивай соседние элементы и меняй местами, если они стоят не в том порядке.&lt;br&gt;
💡 Повторяй процесс, пока массив не отсортируется.&lt;br&gt;
💡 Сложность такого алгоритма — O(n²), он подходит только для небольших массивов.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ArrayUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sortArray&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; arr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; arr.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; j &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; arr.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; i &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1; j&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; temp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr&lt;span style="color:#f92672"&gt;[&lt;/span&gt;j &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 1&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; arr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; nums &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {9, 4, 7, 3, 1};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; sorted &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sortArray(nums);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n : sorted) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вывод: 1 3 4 7 9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Что важно помнить:&lt;/strong&gt;&lt;br&gt;
✅ Мы не используем &lt;code&gt;Arrays.sort()&lt;/code&gt; — это ручная реализация.&lt;br&gt;
✅ Это &lt;strong&gt;пузырьковая сортировка&lt;/strong&gt;, простая в реализации.&lt;br&gt;
✅ Подходит для обучения и простых задач, но неэффективна для больших массивов.&lt;br&gt;
✅ Можно улучшить, добавив флаг для выхода при уже отсортированном массиве.&lt;/p&gt;</description></item><item><title>Сотрудник с максимальной зарплатой в каждом департаменте</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-employee-per-department/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-employee-per-department/</guid><description>&lt;h4&gt;45. Сотрудник с максимальной зарплатой в каждом департаменте&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы &lt;code&gt;departments(id, name)&lt;/code&gt; и &lt;code&gt;employees(id, name, department_id, salary)&lt;/code&gt;.&lt;br&gt;
Необходимо для каждого департамента вывести:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;название департамента (&lt;code&gt;department&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;имя сотрудника (&lt;code&gt;employee&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;его зарплату (&lt;code&gt;salary&lt;/code&gt;),
где сотрудник имеет &lt;strong&gt;максимальную&lt;/strong&gt; зарплату в своём департаменте.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; departments (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; employees (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id INT &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; departments(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary NUMERIC(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте оконную функцию &lt;code&gt;ROW_NUMBER()&lt;/code&gt; или &lt;code&gt;RANK()&lt;/code&gt; для нумерации сотрудников в каждом департаменте по убыванию зарплаты.&lt;br&gt;
💡 В подзапросе или CTE вычислите номер строки в разрезе &lt;code&gt;department_id&lt;/code&gt;, сортируя по &lt;code&gt;salary DESC&lt;/code&gt;.&lt;br&gt;
💡 Затем выберите только те записи, где номер строки = 1.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WITH&lt;/span&gt; ranked_emps &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ROW_NUMBER() OVER (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; e.department_id 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; e.salary &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; rn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; departments d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; employee,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; ranked_emps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; department;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Сотрудники, получающие зарплату выше своего руководителя</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-employees-higher-salary-than-chief/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-employees-higher-salary-than-chief/</guid><description>&lt;h4&gt;52. Сотрудники, получающие зарплату выше своего руководителя&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В таблице &lt;code&gt;EMPLOYEE(ID, NAME, SALARY, DEPARTMENT_ID, CHIEF_ID)&lt;/code&gt; нужно вывести &lt;strong&gt;список сотрудников&lt;/strong&gt;, чья зарплата больше, чем у их &lt;strong&gt;непосредственного руководителя&lt;/strong&gt; (&lt;code&gt;CHIEF_ID&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; EMPLOYEE (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ID int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NAME VARCHAR(&lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SALARY int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DEPARTMENT_ID int,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CHIEF_ID int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Пример данных
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ID | NAME | SALARY | DEPARTMENT_ID | CHIEF_ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ---+------------+--------+---------------+----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1 | Иванов | 150 | 1 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2 | Петров | 250 | 1 | 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 3 | Сидоров | 550 | 1 | 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 4 | Медведев | 350 | 2 | 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 5 | Соколов | 350 | 2 | 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 6 | Рыбников | 150 | 2 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 7 | Арбузов | 450 | 3 | null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 8 | Орехов | 650 | 3 | 7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 9 | Дынин | 50 | 3 | 7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;strong&gt;self join&lt;/strong&gt; — соедините таблицу &lt;code&gt;EMPLOYEE&lt;/code&gt; саму с собой.&lt;br&gt;
💡 Условие соединения: &lt;code&gt;e.CHIEF_ID = c.ID&lt;/code&gt;, где &lt;code&gt;c&lt;/code&gt; — начальник.&lt;br&gt;
💡 В &lt;code&gt;WHERE&lt;/code&gt; оставьте только тех, у кого &lt;code&gt;e.SALARY &amp;gt; c.SALARY&lt;/code&gt;.&lt;br&gt;
💡 Исключите записи, где &lt;code&gt;CHIEF_ID IS NULL&lt;/code&gt; — у них нет руководителя.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.NAME &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.SALARY &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.NAME &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; chief_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.SALARY &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; chief_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; EMPLOYEE e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; EMPLOYEE &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.CHIEF_ID &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.ID
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; e.SALARY &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.SALARY;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Результат для примера данных:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Спринг сервис. Идеи по улучшению кода. Как сделать так, чтобы при добавлении нового робота Spring сразу создавал нового робота и нам не пришлось работать ручками</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-spring-auto-robot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-spring-auto-robot/</guid><description>&lt;h4&gt;16. Спринг сервис. Идеи по улучшению кода. Как сделать так, чтобы при добавлении нового робота Spring сразу создавал нового робота и нам не пришлось работать ручками&lt;/h4&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// помыть полы&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot2&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// почистить стены&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot3&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// играет в футбол&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RobotProcessing&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Robot1 r1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Robot2 r2;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Robot3 r3;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startAllRobots&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r1.&lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r2.&lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r3.&lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🤖 Проблема в том, что &lt;strong&gt;при добавлении нового робота нужно вручную менять код в &lt;code&gt;RobotProcessing&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
⚙️ Можно использовать &lt;strong&gt;список &lt;code&gt;List&amp;lt;Robot&amp;gt;&lt;/code&gt; или &lt;code&gt;Map&amp;lt;String, Robot&amp;gt;&lt;/code&gt;&lt;/strong&gt;, чтобы Spring автоматически собирал всех бинов-роботов.&lt;br&gt;
📌 &lt;strong&gt;Интерфейс&lt;/strong&gt; поможет сделать код гибким и расширяемым.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; Robot {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Robot1 моет полы&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot2&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; Robot {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Robot2 чистит стены&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Robot3&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; Robot {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startWork&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Robot3 играет в футбол&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RobotProcessing&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Robot&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; robots;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Autowired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RobotProcessing&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Robot&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; robots) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;robots&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; robots;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startAllRobots&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; robots.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(Robot::startWork);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Спроектировать API для управления пользователем и изменения отдельных полей?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-api-user-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-api-user-management/</guid><description>&lt;h4&gt;8. Спроектировать REST API для управления пользователем и его атрибутами&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для создания API для управления пользователем необходимо использовать &lt;strong&gt;RESTful&lt;/strong&gt; подход.&lt;/li&gt;
&lt;li&gt;Используем стандартные HTTP методы:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/strong&gt; для получения данных пользователя,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/strong&gt; для создания нового пользователя,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/strong&gt; или &lt;strong&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/strong&gt; для обновления данных пользователя.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Для изменения &lt;strong&gt;отдельных полей&lt;/strong&gt; можно использовать &lt;strong&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/strong&gt;, так как это подходит для частичных обновлений.&lt;/li&gt;
&lt;li&gt;Также стоит продумать валидацию данных и обработку ошибок.&lt;/li&gt;
&lt;li&gt;Рекомендуется использовать модель &lt;strong&gt;DTO&lt;/strong&gt; (Data Transfer Object) для передачи данных.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Предположим, что у нас есть таблица пользователей &lt;strong&gt;users&lt;/strong&gt;, структура которой следующая:&lt;/p&gt;</description></item><item><title>Спроектировать http запрос который возвращает договор по номеру</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-get-contract/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-get-contract/</guid><description>&lt;h4&gt;11. Спроектировать REST Controller, возвращающий договор по номеру&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Нужно создать &lt;strong&gt;REST-контроллер&lt;/strong&gt; с эндпоинтом &lt;code&gt;GET /contract/{number}&lt;/code&gt;.&lt;br&gt;
🔹 Договор должен извлекаться из &lt;strong&gt;сервиса&lt;/strong&gt; или &lt;strong&gt;репозитория&lt;/strong&gt;.&lt;br&gt;
🔹 Используем &lt;code&gt;@RestController&lt;/code&gt; и &lt;code&gt;@GetMapping&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Пример простого Spring Boot REST API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.web.bind.annotation.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RestController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequestMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/contract&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ContractService contractService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractController&lt;/span&gt;(ContractService contractService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;contractService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; contractService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/{number}&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Contract &lt;span style="color:#a6e22e"&gt;getContract&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;@PathVariable&lt;/span&gt; String number) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; contractService.&lt;span style="color:#a6e22e"&gt;findByNumber&lt;/span&gt;(number);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Сервис для поиска договора:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Спроектировать http запрос который создает новый договор</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-post-contract/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-http-post-contract/</guid><description>&lt;h4&gt;12. Спроектировать REST Controller, создающий новый договор&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 🔹 Нужно создать &lt;strong&gt;POST-запрос&lt;/strong&gt; &lt;code&gt;/contract&lt;/code&gt;, который принимает JSON с данными договора.&lt;br&gt;
🔹 Используем &lt;code&gt;@PostMapping&lt;/code&gt; и &lt;code&gt;@RequestBody&lt;/code&gt;.&lt;br&gt;
🔹 Данные должны сохраняться в &lt;strong&gt;хранилище&lt;/strong&gt; (можно использовать &lt;code&gt;Map&lt;/code&gt; как временную БД).
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Пример REST API для создания договора:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.http.ResponseEntity;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; org.springframework.web.bind.annotation.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RestController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequestMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/contract&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ContractService contractService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ContractController&lt;/span&gt;(ContractService contractService) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;contractService&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; contractService;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@PostMapping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; ResponseEntity&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Contract&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createContract&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;@RequestBody&lt;/span&gt; Contract contract) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Contract savedContract &lt;span style="color:#f92672"&gt;=&lt;/span&gt; contractService.&lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(contract);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ResponseEntity.&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt;(savedContract);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;📌 &lt;strong&gt;Сервис для сохранения договора:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Спроектировать и реализовать сервис для сокращения URL-адресов?</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-url-shortener-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-url-shortener-service/</guid><description>&lt;h4&gt;7. Спроектировать и реализовать класс-сервис для сокращения URL-адресов&lt;/h4&gt;
 &lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;Для реализации сервиса сокращения URL можно использовать &lt;strong&gt;хеширование&lt;/strong&gt; или создание уникальных идентификаторов.&lt;/li&gt;
&lt;li&gt;Можно использовать структуру данных, которая будет хранить пары &lt;strong&gt;исходный URL&lt;/strong&gt; → &lt;strong&gt;сокращенный URL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Каждый раз, когда пользователь вводит длинный URL, мы генерируем уникальный идентификатор для этого URL и сохраняем его в базе данных или памяти.&lt;/li&gt;
&lt;li&gt;Для хранения данных можно использовать &lt;strong&gt;Map&lt;/strong&gt;, где ключом будет уникальный идентификатор, а значением — оригинальный URL.&lt;/li&gt;
&lt;li&gt;После этого, при запросе по сокращенному URL, сервис должен возвращать оригинальный URL.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Для начала реализуем простой сервис сокращения URL-адресов с использованием Map для хранения данных и генерации коротких URL.&lt;/p&gt;</description></item><item><title>Средний возраст мужчин в списке</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-average-age-males/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-average-age-males/</guid><description>&lt;h4&gt;60. Средний возраст мужчин в списке&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;Person&lt;/code&gt; с полями &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;age&lt;/code&gt;, &lt;code&gt;sex&lt;/code&gt;. В &lt;code&gt;main&lt;/code&gt; создаётся список &lt;code&gt;persons&lt;/code&gt; и стрим. Нужно написать код, который найдёт &lt;strong&gt;средний возраст всех мужчин&lt;/strong&gt; из списка.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Person&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; persons &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;asList&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Alice&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, 25, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;female&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Bob&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, 30, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;male&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Eve&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, 35, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;female&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;Jack&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, 28, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;male&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; averageAgeOfMales &lt;span style="color:#f92672"&gt;=&lt;/span&gt; persons.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;filter(...)&lt;/code&gt; для отбора по &lt;code&gt;sex.equalsIgnoreCase(&amp;quot;male&amp;quot;)&lt;/code&gt;.&lt;br&gt;
💡 Примените &lt;code&gt;mapToInt(Person::getAge)&lt;/code&gt;, чтобы получить &lt;code&gt;IntStream&lt;/code&gt;.&lt;br&gt;
💡 Вызов &lt;code&gt;average()&lt;/code&gt; вернёт &lt;code&gt;OptionalDouble&lt;/code&gt;, учитывающий отсутствие элементов.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OptionalDouble averageAgeOfMales &lt;span style="color:#f92672"&gt;=&lt;/span&gt; persons.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(p &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; p.&lt;span style="color:#a6e22e"&gt;getSex&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;equalsIgnoreCase&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;male&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;mapToInt&lt;/span&gt;(Person::getAge)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;average&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Статистика по отделам</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-stats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-department-stats/</guid><description>&lt;h4&gt;43. Статистика по отделам&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы &lt;code&gt;Employees(EmployeeID, Name, DepartmentID, Salary)&lt;/code&gt; и &lt;code&gt;Departments(DepartmentID, DepartmentName)&lt;/code&gt;.&lt;br&gt;
Необходимо для каждого отдела вывести:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;название отдела,&lt;/li&gt;
&lt;li&gt;количество сотрудников в отделе,&lt;/li&gt;
&lt;li&gt;среднюю зарплату (округлённую до 2 знаков),&lt;/li&gt;
&lt;li&gt;максимальную зарплату,&lt;/li&gt;
&lt;li&gt;минимальную зарплату.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Отсортировать результат по количеству сотрудников в отделе по убыванию.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;LEFT JOIN&lt;/code&gt;, чтобы включить отделы без сотрудников (если нужно).&lt;br&gt;
💡 Агрегируйте по &lt;code&gt;d.DepartmentName&lt;/code&gt; с помощью &lt;code&gt;COUNT()&lt;/code&gt;, &lt;code&gt;AVG()&lt;/code&gt;, &lt;code&gt;MAX()&lt;/code&gt;, &lt;code&gt;MIN()&lt;/code&gt;.&lt;br&gt;
💡 Для округления средней зарплаты примените функцию &lt;code&gt;ROUND(..., 2)&lt;/code&gt;.&lt;br&gt;
💡 Сортируйте по нужной колонке через &lt;code&gt;ORDER BY employee_count DESC&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.DepartmentName &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; department_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(e.EmployeeID) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ROUND(&lt;span style="color:#66d9ef"&gt;AVG&lt;/span&gt;(e.Salary), &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; average_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(e.Salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; max_salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(e.Salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; min_salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Departments d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Employees e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.DepartmentID &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.DepartmentID
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.DepartmentName
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; employee_count &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Строки, соответствующие любому шаблону</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-match-strings-with-masks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-match-strings-with-masks/</guid><description>&lt;h4&gt;33. Строки, соответствующие любому шаблону&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть две таблицы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;t1(str)&lt;/code&gt; – содержит строки&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t2(mask)&lt;/code&gt; – содержит шаблоны для &lt;code&gt;LIKE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо выбрать все строки из &lt;code&gt;t1&lt;/code&gt;, которые соответствуют хотя бы одному шаблону из &lt;code&gt;t2&lt;/code&gt; с помощью &lt;code&gt;SQL LIKE&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;JOIN&lt;/code&gt; по условию &lt;code&gt;t1.str LIKE t2.mask&lt;/code&gt;, чтобы отфильтровать подходящие строки.&lt;br&gt;
💡 Можно удалить дубликаты с помощью &lt;code&gt;DISTINCT&lt;/code&gt;, если одна строка подходит под несколько шаблонов.&lt;br&gt;
💡 Вариант с &lt;code&gt;EXISTS&lt;/code&gt; помогает избежать дублирования и читабелен для проверки &amp;ldquo;хотя бы одного&amp;rdquo; шаблона.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: JOIN + DISTINCT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt; t1.str
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; t1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; t2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; t1.str &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; t2.mask;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: EXISTS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; t1.str
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; t1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;EXISTS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; t2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; t1.str &lt;span style="color:#66d9ef"&gt;LIKE&lt;/span&gt; t2.mask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Сумма выручки по продавцам</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salespersons-revenue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salespersons-revenue/</guid><description>&lt;h4&gt;47. Сумма выручки по продавцам&lt;/h4&gt;
 &lt;p&gt;🔥 Напишите SQL-запрос, который извлекает идентификаторы всех продавцов и общую сумму, заработанную каждым. В выборке должны быть и продавцы без заказов (с суммой 0). Результат отсортирован по id продавца.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; Salespersons
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; Customers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salesperson_id INT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; Orders
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; customer_id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; price INT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TRUNCATE&lt;/span&gt; Orders;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; Orders (customer_id, price)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2480&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;654&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2938&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ... (&lt;span style="color:#960050;background-color:#1e0010"&gt;больше&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;строк&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1548&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; Salespersons (name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Stephanie&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Rebecca&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Deborah&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;Maria&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; Customers (salesperson_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Начинай запрос от таблицы &lt;code&gt;Salespersons&lt;/code&gt;, чтобы гарантировать наличие всех продавцов.&lt;br&gt;
💡 Используй &lt;code&gt;LEFT JOIN&lt;/code&gt; с &lt;code&gt;Customers&lt;/code&gt; и &lt;code&gt;Orders&lt;/code&gt;, чтобы не потерять продавцов без продаж.&lt;br&gt;
💡 Для суммирования выручки применяй &lt;code&gt;SUM(o.price)&lt;/code&gt;.&lt;br&gt;
💡 Чтобы у продавцов без заказов не было &lt;code&gt;NULL&lt;/code&gt;, используй &lt;code&gt;COALESCE(..., 0)&lt;/code&gt;.&lt;br&gt;
💡 Группировка должна быть по &lt;code&gt;s.id&lt;/code&gt;, сортировка — &lt;code&gt;ORDER BY s.id&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; s.id &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; salesperson_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; COALESCE(&lt;span style="color:#66d9ef"&gt;SUM&lt;/span&gt;(o.price), &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; total_earned
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Salespersons s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Customers &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.salesperson_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; Orders o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; o.customer_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;c&lt;/span&gt;.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; s.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; s.id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Схема БД для иерархического справочника организаций</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-org-directory-schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-org-directory-schema/</guid><description>&lt;h4&gt;59. Схема БД для иерархического справочника организаций&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно спроектировать структуру БД для &lt;strong&gt;классического справочника организаций&lt;/strong&gt; с иерархией уровней (холдинг → управление → отдел → бюро и т.д.).&lt;br&gt;
Нужно ответить:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;одну таблицу делаем или несколько?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;какие столбцы понадобятся для хранения дерева вида:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ТН - Технологии
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Управление ИБ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Отдел разработки решений ИБ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Бюро разработки
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Бюро эксплуатации
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Управление ИТ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Отдел ИТ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Отдел архитектуры
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ТН - Дальний восток
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; РНУ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; НПС 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; НПС 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для иерархии чаще всего используют &lt;strong&gt;adjacency list&lt;/strong&gt;: у каждой строки есть &lt;code&gt;parent_id&lt;/code&gt;.&lt;br&gt;
💡 Можно сделать &lt;strong&gt;одну таблицу&lt;/strong&gt; &lt;code&gt;org_unit&lt;/code&gt;, где верхний уровень (ТН) имеет &lt;code&gt;parent_id = NULL&lt;/code&gt;.&lt;br&gt;
💡 Полезно хранить:&lt;br&gt;
– &lt;code&gt;id&lt;/code&gt;&lt;br&gt;
– &lt;code&gt;parent_id&lt;/code&gt;&lt;br&gt;
– &lt;code&gt;name&lt;/code&gt;&lt;br&gt;
– тип или уровень (&lt;code&gt;type&lt;/code&gt; / &lt;code&gt;level&lt;/code&gt;)&lt;br&gt;
– сортировку в рамках одного родителя (&lt;code&gt;sort_order&lt;/code&gt;).&lt;br&gt;
💡 Если нужно несколько организаций, можно добавить &lt;code&gt;root_id&lt;/code&gt; или &lt;code&gt;tree_id&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;hr&gt;
&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;Для типового справочника я бы сделал &lt;strong&gt;одну таблицу&lt;/strong&gt; с иерархией по &lt;code&gt;parent_id&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Таблицы для авторов и книг (многие-ко-многим)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-authors-books/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-authors-books/</guid><description>&lt;h4&gt;25. Таблицы для авторов и книг (многие-ко-многим)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть две сущности: &lt;strong&gt;Авторы&lt;/strong&gt; и &lt;strong&gt;Книги&lt;/strong&gt;.&lt;br&gt;
Каждый автор может иметь много книг, и каждая книга может иметь много авторов (отношение «многие-ко-многим»).&lt;br&gt;
Необходимо описать структуру таблиц для реализации такой связи.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 В классической реляционной модели многие-ко-многим реализуется через &lt;strong&gt;промежуточную (junction) таблицу&lt;/strong&gt;.&lt;br&gt;
💡 Основные таблицы — &lt;code&gt;authors&lt;/code&gt; и &lt;code&gt;books&lt;/code&gt; — содержат информацию об авторах и книгах соответственно.&lt;br&gt;
💡 Junction-таблица хранит пары &lt;code&gt;(author_id, book_id)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Основная таблица авторов
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; authors (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Основная таблица книг
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; books (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id SERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Промежуточная таблица для связи многие-ко-многим
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; author_book (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; author_id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; book_id INT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (author_id, book_id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (author_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; authors(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FOREIGN&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (book_id) &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; books(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Товары с максимальной ценой в каждой категории товаров</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-max-price-by-category/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-max-price-by-category/</guid><description>&lt;h4&gt;15. Товары с максимальной ценой в каждой категории товаров&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📊 &lt;strong&gt;Составить SQL-запрос, который выводит наименования товаров с максимальной ценой в каждой категории.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;📌 &lt;strong&gt;Таблица &lt;code&gt;Prices&lt;/code&gt; (данные о товарах):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt; – название товара&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Category&lt;/code&gt; – категория товара&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Price&lt;/code&gt; – цена товара&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🚀 &lt;strong&gt;Требуется вернуть:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Category&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt; (товар с максимальной ценой в категории)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Price&lt;/code&gt; (максимальная цена в категории)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Дана таблица Prices в БД.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name Category Price
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Апельсин Фрукты 50
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Мандарин Фрукты 45
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Яблоко Фрукты 30
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Огурец Овощи 35
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Томат Овощи 40
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Картофель Овощи 25
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Молоко Молочные продукты 30
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Творог Молочные продукты 40
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для каждой категории находим &lt;strong&gt;максимальную цену&lt;/strong&gt; с помощью &lt;code&gt;MAX(Price)&lt;/code&gt;.&lt;br&gt;
💡 Затем выбираем товары, у которых &lt;code&gt;Price&lt;/code&gt; равно найденному максимуму.&lt;br&gt;
💡 Используем &lt;code&gt;JOIN&lt;/code&gt; или &lt;code&gt;WHERE&lt;/code&gt; с подзапросом.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; p1.Category, p1.Name, p1.Price
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Prices p1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; p1.Price &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(p2.Price) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Prices p2 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; p1.Category &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p2.Category
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Топ-10 телефонов, получивших больше всего SMS</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-sms-recipients/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-sms-recipients/</guid><description>&lt;h4&gt;18. Топ-10 телефонов, получивших больше всего SMS&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 &lt;strong&gt;Написать SQL-запрос для получения номеров телефонов (&lt;code&gt;phone&lt;/code&gt;), которые получили более одной SMS.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Отсортировать список по убыванию количества сообщений.&lt;/li&gt;
&lt;li&gt;Оставить только &lt;strong&gt;топ-10&lt;/strong&gt; номеров с наибольшим количеством полученных SMS.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt;: sms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id &lt;span style="color:#f92672"&gt;|&lt;/span&gt; phone &lt;span style="color:#f92672"&gt;|&lt;/span&gt; message
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9876552222&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;some&lt;/span&gt; message
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9876552222&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;some&lt;/span&gt; message
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9876552234&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; another message
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используй &lt;code&gt;GROUP BY&lt;/code&gt;, чтобы сгруппировать данные по &lt;code&gt;phone&lt;/code&gt;.&lt;br&gt;
💡 &lt;code&gt;HAVING COUNT(*) &amp;gt; 1&lt;/code&gt; поможет отфильтровать только те номера, у которых более одной SMS.&lt;br&gt;
💡 &lt;code&gt;ORDER BY COUNT(*) DESC&lt;/code&gt; обеспечит сортировку от большего количества к меньшему.&lt;br&gt;
💡 &lt;code&gt;LIMIT 10&lt;/code&gt; позволит оставить только топ-10 номеров.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; phone, &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; sms_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; sms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; phone
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HAVING&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; sms_count &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Топ-3 посетителя по числу визитов</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-3-visitors-by-visit-count/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-top-3-visitors-by-visit-count/</guid><description>&lt;h4&gt;22. Топ-3 посетителя по числу визитов&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;visits(visit_id, visitor_name, timestamp)&lt;/code&gt;.&lt;br&gt;
Необходимо вывести имена трёх посетителей, у которых наибольшее количество записей в таблице (визитов).&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;GROUP BY visitor_name&lt;/code&gt; для подсчёта визитов по каждому человеку.&lt;br&gt;
💡 Отсортируйте результат по убыванию количества визитов (&lt;code&gt;COUNT(*) DESC&lt;/code&gt;).&lt;br&gt;
💡 Примените &lt;code&gt;LIMIT 3&lt;/code&gt; для выборки трех записей.&lt;br&gt;
💡 Альтернативно можно воспользоваться оконной функцией &lt;code&gt;ROW_NUMBER()&lt;/code&gt; или &lt;code&gt;RANK()&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: GROUP BY + ORDER BY + LIMIT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; visitor_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; visit_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; visits
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visitor_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visit_count &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Оконная функция ROW_NUMBER()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; visitor_name, visit_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; visitor_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visitor_name) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; visit_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ROW_NUMBER() OVER (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visitor_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visitor_name) &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; rn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; visits
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visitor_name, visit_count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; visit_count &lt;span style="color:#66d9ef"&gt;DESC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Транзакции: сколько будет при вызове b() и как сделать a() транзакционным</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transactions-self-invocation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-transactions-self-invocation/</guid><description>&lt;h4&gt;96. Транзакции: сколько будет при вызове b() и как сделать a() транзакционным&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан код:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SomeService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;(propagation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Required_New)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Transactional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SomeService.&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Нужно ответить:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Сколько будет транзакций при вызове &lt;code&gt;b()&lt;/code&gt;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Почему?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Что сделать, чтобы второй вызов (&lt;code&gt;a()&lt;/code&gt;) тоже был транзакционным (&lt;code&gt;REQUIRES_NEW&lt;/code&gt;)?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 &lt;code&gt;@Transactional&lt;/code&gt; работает через Spring AOP proxy.&lt;br&gt;
💡 Вызов &lt;code&gt;a()&lt;/code&gt; внутри &lt;code&gt;b()&lt;/code&gt; — это &lt;strong&gt;self-invocation&lt;/strong&gt; (внутренний вызов внутри одного объекта), он проходит мимо proxy.&lt;br&gt;
💡 Поэтому &lt;code&gt;REQUIRES_NEW&lt;/code&gt; не применится, если &lt;code&gt;a()&lt;/code&gt; вызывается напрямую как &lt;code&gt;a()&lt;/code&gt;.&lt;br&gt;
💡 Нужно вызывать &lt;code&gt;a()&lt;/code&gt; через прокси: вынести &lt;code&gt;a()&lt;/code&gt; в другой бин или получить self-proxy и вызвать через него.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;&lt;strong&gt;1) Сколько транзакций будет?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Удаление дублей из таблицы emails</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-delete-duplicates-emails/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-delete-duplicates-emails/</guid><description>&lt;h4&gt;50. Удаление дублей из таблицы emails&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 В таблице &lt;code&gt;emails(id, email)&lt;/code&gt; могут встречаться &lt;strong&gt;дублирующиеся email-адреса&lt;/strong&gt;.&lt;br&gt;
Нужно написать SQL-запрос, который удаляет дубликаты, оставляя только &lt;strong&gt;одну запись&lt;/strong&gt; для каждого уникального email.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; emails (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email VARCHAR(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; emails(id, email)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;aa@yandex.ru&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;bb@yandex.ru&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;aa@yandex.ru&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Чтобы удалить дубли, сначала нужно определить, какая запись считается &amp;ldquo;уникальной&amp;rdquo; — например, с &lt;strong&gt;минимальным id&lt;/strong&gt;.&lt;br&gt;
💡 Можно использовать &lt;strong&gt;CTE&lt;/strong&gt; с &lt;code&gt;ROW_NUMBER()&lt;/code&gt; или подзапрос с &lt;code&gt;MIN(id)&lt;/code&gt;.&lt;br&gt;
💡 Убедитесь, что удаляете только дубли, а не все строки.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ✅ Вариант 1. Через CTE и ROW_NUMBER()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WITH&lt;/span&gt; duplicates &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ROW_NUMBER() OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; email &lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; id) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; rn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; emails
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DELETE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; emails
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; id &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; id &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; duplicates &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rn &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ✅ Вариант 2. Без CTE (через подзапрос)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DELETE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; emails
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; id &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;MIN&lt;/span&gt;(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; emails
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; email
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;🧠 &lt;strong&gt;Пояснение:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Удаление нечётных элементов списка</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-even-index/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-even-index/</guid><description>&lt;h4&gt;62. Удаление нечётных элементов списка&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан список строк &lt;code&gt;inList&lt;/code&gt;. Нужно получить новый список, в котором &lt;strong&gt;удалены все элементы с нечётными индексами&lt;/strong&gt; (то есть оставить элементы с индексами 0, 2, 4, …).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; inList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;a&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;b&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;c&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;d&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;e&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;g&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; outList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; inList &lt;span style="color:#75715e"&gt;/*do something*/&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(outList); &lt;span style="color:#75715e"&gt;//[a, c, e]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;IntStream.range(0, inList.size())&lt;/code&gt; для генерации индексов.&lt;br&gt;
💡 Отфильтруйте только чётные индексы: &lt;code&gt;i % 2 == 0&lt;/code&gt;.&lt;br&gt;
💡 Преобразуйте индексы обратно в элементы списка через &lt;code&gt;mapToObj(inList::get)&lt;/code&gt;.&lt;br&gt;
💡 Соберите результат в &lt;code&gt;List&lt;/code&gt; через &lt;code&gt;Collectors.toList()&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; inList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;g&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; outList &lt;span style="color:#f92672"&gt;=&lt;/span&gt; IntStream.&lt;span style="color:#a6e22e"&gt;range&lt;/span&gt;(0, inList.&lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(i &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; i &lt;span style="color:#f92672"&gt;%&lt;/span&gt; 2 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;mapToObj&lt;/span&gt;(inList::get)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(outList); &lt;span style="color:#75715e"&gt;// [a, c, e]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Уникальные значения на складах</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-values-in-storages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-unique-values-in-storages/</guid><description>&lt;h4&gt;7. Уникальные значения на складах&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дана карта складов &lt;code&gt;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; storage&lt;/code&gt;, где ключ — имя склада, а значение — список телефонов/номеров.&lt;br&gt;
Нужно с помощью &lt;strong&gt;Stream API&lt;/strong&gt; вывести все &lt;strong&gt;уникальные значения&lt;/strong&gt; (номера), присутствующие на складах.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; storage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storage.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;s1&amp;#34;&lt;/span&gt;, Arrays.&lt;span style="color:#a6e22e"&gt;asList&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;555-1123&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;555-3389&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storage.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;s2&amp;#34;&lt;/span&gt;, Arrays.&lt;span style="color:#a6e22e"&gt;asList&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;555-1123&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;555-5264&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storage.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;s3&amp;#34;&lt;/span&gt;, Arrays.&lt;span style="color:#a6e22e"&gt;asList&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;555-6654&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;555-3242&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Используйте &lt;code&gt;values()&lt;/code&gt; у &lt;code&gt;Map&lt;/code&gt;, чтобы получить коллекцию всех списков.&lt;br&gt;
💡 Примените &lt;code&gt;flatMap(...)&lt;/code&gt;, чтобы развернуть &lt;code&gt;List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;&lt;/code&gt; в &lt;code&gt;Stream&amp;lt;String&amp;gt;&lt;/code&gt;.&lt;br&gt;
💡 Метод &lt;code&gt;distinct()&lt;/code&gt; оставит только уникальные значения.&lt;br&gt;
💡 Итог можно собрать в &lt;code&gt;Set&lt;/code&gt; или просто вывести через &lt;code&gt;forEach(System.out::println)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storage.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;() &lt;span style="color:#75715e"&gt;// Stream&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;flatMap&lt;/span&gt;(List::stream) &lt;span style="color:#75715e"&gt;// Stream&amp;lt;String&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;distinct&lt;/span&gt;() &lt;span style="color:#75715e"&gt;// убираем дубликаты&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;::println); &lt;span style="color:#75715e"&gt;// выводим уникальные значения&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Вывод:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Уникальные слова по признаку анаграмм (оставить по одному представителю)</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-unique-words-by-anagram-signature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-unique-words-by-anagram-signature/</guid><description>&lt;h4&gt;100. Уникальные слова по признаку анаграмм (оставить по одному представителю)&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дана коллекция слов. Нужно получить &lt;strong&gt;уникальные слова&lt;/strong&gt;, где уникальность определяется так:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;слова считаются одинаковыми&lt;/strong&gt;, если одно является &lt;strong&gt;анаграммой&lt;/strong&gt; другого (без учёта регистра);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;в результате нужно оставить &lt;strong&gt;по одному&lt;/strong&gt; слову из каждой группы анаграмм (например, первое встретившееся).&lt;br&gt;
Повторы одного и того же слова (например, &lt;code&gt;&amp;quot;angel&amp;quot;&lt;/code&gt; встречается дважды) тоже должны схлопываться в один элемент.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyCode&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt; (String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; anagrams &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Race&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;NIghT&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Angle&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;CaRe&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;angel&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;ThiNG&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;agnel&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;angel&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ожидаемо: по одному слову на каждую &amp;#34;анаграмм-группу&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// например: [&amp;#34;Race&amp;#34;, &amp;#34;NIghT&amp;#34;, &amp;#34;Angle&amp;#34;] (если берём первый встретившийся)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(removeAnagrams(anagrams));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//need to implement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;removeAnagrams&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; anagrams){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; anagrams;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для каждого слова постройте &lt;strong&gt;канонический ключ&lt;/strong&gt;: &lt;code&gt;lowercase&lt;/code&gt; + отсортированные буквы.&lt;br&gt;
💡 Используйте &lt;code&gt;Map&amp;lt;key, originalWord&amp;gt;&lt;/code&gt;, чтобы хранить &lt;strong&gt;первое&lt;/strong&gt; слово в группе.&lt;br&gt;
💡 Чтобы сохранить порядок появления групп — берите &lt;code&gt;LinkedHashMap&lt;/code&gt;.&lt;br&gt;
💡 В конце верните &lt;code&gt;map.values()&lt;/code&gt; как список.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;removeAnagrams&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (words &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; words.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// key -&amp;gt; representative (первое встретившееся слово этой анаграмм-группы)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; repByKey &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LinkedHashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String w : words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (w &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// по желанию: можно либо пропускать, либо падать ошибкой&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; canonicalKey(w);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repByKey.&lt;span style="color:#a6e22e"&gt;putIfAbsent&lt;/span&gt;(key, w);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;(repByKey.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;canonicalKey&lt;/span&gt;(String s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; chars &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s.&lt;span style="color:#a6e22e"&gt;toLowerCase&lt;/span&gt;(Locale.&lt;span style="color:#a6e22e"&gt;ROOT&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(chars);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; String(chars);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Почему так:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Упростить вложенные лямбда-выражения</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-avoid-complex-lambdas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-avoid-complex-lambdas/</guid><description>&lt;h4&gt;2. Упростить вложенные лямбда-выражения&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Разобраться, что делает данный код, и улучшить читаемость за счёт рефакторинга.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AvoidComplexLambdas&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashSet&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Set&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findEditors&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(u &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; u.&lt;span style="color:#a6e22e"&gt;getRoles&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;anyMatch&lt;/span&gt;(r &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; r.&lt;span style="color:#a6e22e"&gt;getPermissions&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(Permission.&lt;span style="color:#a6e22e"&gt;EDIT&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(toSet());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к ответу&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Метод &lt;code&gt;findEditors()&lt;/code&gt; ищет пользователей, которые имеют хотя бы одну роль с разрешением &lt;code&gt;EDIT&lt;/code&gt;.&lt;br&gt;
💡 Вложенные лямбды ухудшают читаемость.&lt;br&gt;
💡 Хорошей практикой будет &lt;strong&gt;вынести вложенную логику&lt;/strong&gt; в отдельный метод с понятным названием.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;h3 id="-что-делает-код"&gt;
 🔍 Что делает код?
 &lt;a class="anchor" href="#-%d1%87%d1%82%d0%be-%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d1%82-%d0%ba%d0%be%d0%b4"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Метод &lt;code&gt;findEditors()&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Ускорение BFF: параллельные вызовы корзины и рекомендаций</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-parallel-cart-and-recommendations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-bff-parallel-cart-and-recommendations/</guid><description>&lt;h4&gt;83. Ускорение BFF: параллельные вызовы корзины и рекомендаций&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Наш BFF обращается к двум сервисам: &lt;code&gt;cart-service&lt;/code&gt; (0.7s) и &lt;code&gt;recommendations-service&lt;/code&gt; (0.5s). Последовательный вызов даёт &amp;gt;1s. Требование бизнеса — уложиться &lt;strong&gt;менее чем в 1 секунду&lt;/strong&gt;. Нужно предложить решение и показать, как реализовать его в коде.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@FeignClient&lt;/span&gt;(name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cart-service&amp;#34;&lt;/span&gt;, url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://shopping-cart&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ShoppingCartServiceClient&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/v1/shopping-cart&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CartDto &lt;span style="color:#a6e22e"&gt;getClientCart&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@FeignClient&lt;/span&gt;(name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;recommendations-service&amp;#34;&lt;/span&gt;, url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://recommendations&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RecommendationsServiceClient&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/v1/recommendations&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RecommendationDto&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getClientRecommendations&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;record&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ClientCartScreenDto&lt;/span&gt;(CartDto cart, List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RecommendationDto&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; recommendations) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ClientCartScreenService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; ClientCartScreenDto &lt;span style="color:#a6e22e"&gt;getScreenData&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// todo: вызвать свои сервисы здесь&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ClientCartScreenDto(cart, recommendations);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Делайте вызовы &lt;strong&gt;параллельно&lt;/strong&gt;: &lt;code&gt;CompletableFuture.supplyAsync(...)&lt;/code&gt; и &lt;code&gt;CompletableFuture.allOf(...)&lt;/code&gt;.&lt;br&gt;
💡 Введите &lt;strong&gt;timeouts&lt;/strong&gt; и &lt;strong&gt;фолбэки&lt;/strong&gt; (например, пустые рекомендации при истечении времени), чтобы стабильно укладываться &amp;lt; 1s.&lt;br&gt;
💡 Дополнительно можно применить &lt;strong&gt;Resilience4j&lt;/strong&gt; (bulkhead/circuit breaker), а также &lt;strong&gt;кэширование&lt;/strong&gt; рекомендаций.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ClientCartScreenService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; ShoppingCartServiceClient cartClient;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; RecommendationsServiceClient recommendationsClient;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; ClientCartScreenDto &lt;span style="color:#a6e22e"&gt;getScreenData&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Параллельные вызовы&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CompletableFuture&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;CartDto&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; cartFuture &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CompletableFuture.&lt;span style="color:#a6e22e"&gt;supplyAsync&lt;/span&gt;(cartClient::getClientCart);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CompletableFuture&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RecommendationDto&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; recsFuture &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CompletableFuture.&lt;span style="color:#a6e22e"&gt;supplyAsync&lt;/span&gt;(recommendationsClient::getClientRecommendations)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Жёсткий таймаут на рекомендации, чтобы не вылетать за 1s SLA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;orTimeout&lt;/span&gt;(700, java.&lt;span style="color:#a6e22e"&gt;util&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concurrent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;TimeUnit&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;MILLISECONDS&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Фолбэк: при таймауте/ошибке — пустой список рекомендаций&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;exceptionally&lt;/span&gt;(ex &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Collections.&lt;span style="color:#a6e22e"&gt;emptyList&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Ждём оба результата&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CompletableFuture.&lt;span style="color:#a6e22e"&gt;allOf&lt;/span&gt;(cartFuture, recsFuture).&lt;span style="color:#a6e22e"&gt;join&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CartDto cart &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cartFuture.&lt;span style="color:#a6e22e"&gt;join&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// если корзина упадёт — пусть упадёт явно&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RecommendationDto&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; recommendations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; recsFuture.&lt;span style="color:#a6e22e"&gt;join&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ClientCartScreenDto(cart, recommendations);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Устранение дублирования записей из-за регистра в email</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-deduplicate-client-email/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-deduplicate-client-email/</guid><description>&lt;h4&gt;38. Устранение дублирования записей из-за регистра в email&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблица &lt;code&gt;client_service&lt;/code&gt; с колонками:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client_id&lt;/code&gt; — идентификатор клиента&lt;/li&gt;
&lt;li&gt;&lt;code&gt;employee_email&lt;/code&gt; — почта сотрудника, обслуживающего клиента&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Из-за разного регистра в &lt;code&gt;employee_email&lt;/code&gt; (“User@domain.com” и “user@domain.com”) появляются дубликаты записей. Нужно написать SQL-решение, чтобы устранить задвоение.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Приведите &lt;code&gt;employee_email&lt;/code&gt; к одному регистру (например, к нижнему) при выборке или в самой таблице.&lt;br&gt;
💡 Для выборки без дубликатов после нормализации используйте &lt;code&gt;SELECT DISTINCT … LOWER(employee_email)&lt;/code&gt;.&lt;br&gt;
💡 Можно создать &lt;strong&gt;уникальный индекс&lt;/strong&gt; по выражению &lt;code&gt;LOWER(employee_email)&lt;/code&gt;, чтобы в будущем избежать вставки дублей с разным регистром.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 1. Выборка без задвоения по разному регистру:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;LOWER&lt;/span&gt;(employee_email) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; employee_email_normalized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; client_service;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 2. Обновление существующих записей в таблице:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;UPDATE&lt;/span&gt; client_service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SET&lt;/span&gt; employee_email &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LOWER&lt;/span&gt;(employee_email);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 3. Создание уникального индекса по нормализованному email:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- В PostgreSQL можно воспользоваться выражением:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;UNIQUE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; ux_client_service_email_ci
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; client_service (client_id, &lt;span style="color:#66d9ef"&gt;LOWER&lt;/span&gt;(employee_email));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;Объяснение решения:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Фильтр по фамилии</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-filter-sort-surnames/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-filter-sort-surnames/</guid><description>&lt;h4&gt;4. Фильтр по фамилии&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;📌 Дан список строк, содержащих полные ФИО (фамилия, имя, отчество).&lt;br&gt;
Нужно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Выделить фамилии&lt;/li&gt;
&lt;li&gt;Оставить только те, длина которых больше &lt;strong&gt;3 символов&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Отсортировать результат &lt;strong&gt;в алфавитном порядке&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Вывести список&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="код"&gt;
 Код:
 &lt;a class="anchor" href="#%d0%ba%d0%be%d0%b4"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.*;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; fios &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Петров Петр Петрович&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Иванов Иван Иванович&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Алексеев Алексей Алексеевич&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Васильев Василий Васильевич&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Сидоров Сидор Сидорович&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Николаев Николай Николаевич&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Андреев Андрей Андреевич&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 Спойлеры к решению
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Метод &lt;code&gt;split(&amp;quot; &amp;quot;)&lt;/code&gt; разобьет строку на части (разделитель — пробел)&lt;br&gt;
💡 &lt;code&gt;full.split(&amp;quot; &amp;quot;)[0]&lt;/code&gt; достанет &lt;strong&gt;фамилию&lt;/strong&gt; (первая часть)&lt;br&gt;
💡 Условие &lt;code&gt;surname.length() &amp;gt; 3&lt;/code&gt; проверяет длину фамилии&lt;br&gt;
💡 &lt;code&gt;sorted()&lt;/code&gt; сортирует в алфавитном порядке&lt;br&gt;
💡 &lt;code&gt;toList()&lt;/code&gt; собирает поток в итоговый список
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; out &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fios.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(fio &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; fio.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// берём фамилию&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(surname &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; surname.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 3) &lt;span style="color:#75715e"&gt;// фильтруем&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;sorted&lt;/span&gt;() &lt;span style="color:#75715e"&gt;// сортируем&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Фильтрация заказов через стратегию с лямбдами</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-filter-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-order-filter-strategy/</guid><description>&lt;h4&gt;61. Фильтрация заказов через стратегию с лямбдами&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дан класс &lt;code&gt;Order&lt;/code&gt; с полями &lt;code&gt;price&lt;/code&gt; (BigDecimal), &lt;code&gt;date&lt;/code&gt; (LocalDate) и &lt;code&gt;status&lt;/code&gt; (String). Требуется реализовать стратегию фильтрации списка заказов по разным критериям (по цене, по дате, по статусу), используя &lt;strong&gt;лambdas&lt;/strong&gt; вместо конкретных классов стратегий. При этом основная логика фильтрации не должна меняться при добавлении новых критериев.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.math.BigDecimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.time.LocalDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.function.Predicate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Order&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; BigDecimal price;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; LocalDate date;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String status;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Order&lt;/span&gt;(BigDecimal price, LocalDate date, String status) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;price&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; price;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;date&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; date;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; status;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; BigDecimal &lt;span style="color:#a6e22e"&gt;getPrice&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; price; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; LocalDate &lt;span style="color:#a6e22e"&gt;getDate&lt;/span&gt;() { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; date; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;(){ &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; status;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Order{&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; price &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; date &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;, &amp;#39;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; status &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;}&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Фильтрует список заказов по заданному условию.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param orders список заказов
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param filterStrategy лямбда-стратегия фильтрации
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @return отфильтрованный список
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; orders, Predicate&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; filterStrategy) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: реализовать метод&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; orders &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;100.00&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 1, 10), &lt;span style="color:#e6db74"&gt;&amp;#34;NEW&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;250.50&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 2, 5), &lt;span style="color:#e6db74"&gt;&amp;#34;SHIPPED&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;75.75&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 1, 20), &lt;span style="color:#e6db74"&gt;&amp;#34;NEW&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;300.00&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 3, 1), &lt;span style="color:#e6db74"&gt;&amp;#34;DELIVERED&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Применение различных фильтров (TODO)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Основная функция принимает &lt;code&gt;Predicate&amp;lt;Order&amp;gt;&lt;/code&gt; — это и есть стратегия фильтрации.&lt;br&gt;
💡 Для фильтрации по цене используйте &lt;code&gt;o -&amp;gt; o.getPrice().compareTo(new BigDecimal(&amp;quot;...&amp;quot;)) &amp;gt; 0&lt;/code&gt;.&lt;br&gt;
💡 Для фильтрации по дате — &lt;code&gt;o -&amp;gt; o.getDate().isAfter(...)&lt;/code&gt;.&lt;br&gt;
💡 Для фильтрации по статусу — &lt;code&gt;o -&amp;gt; o.getStatus().equalsIgnoreCase(&amp;quot;...&amp;quot;)&lt;/code&gt;.&lt;br&gt;
💡 Новый фильтр можно добавить просто передав другую лямбду в &lt;code&gt;filterOrders(...)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.math.BigDecimal;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.time.LocalDate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.List;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.function.Predicate;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.stream.Collectors;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;OrderService&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; orders, Predicate&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; filterStrategy) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; orders.&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(filterStrategy)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;collect&lt;/span&gt;(Collectors.&lt;span style="color:#a6e22e"&gt;toList&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; orders &lt;span style="color:#f92672"&gt;=&lt;/span&gt; List.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;100.00&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 1, 10), &lt;span style="color:#e6db74"&gt;&amp;#34;NEW&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;250.50&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 2, 5), &lt;span style="color:#e6db74"&gt;&amp;#34;SHIPPED&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;75.75&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 1, 20), &lt;span style="color:#e6db74"&gt;&amp;#34;NEW&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Order(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;300.00&amp;#34;&lt;/span&gt;), LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 3, 1), &lt;span style="color:#e6db74"&gt;&amp;#34;DELIVERED&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Фильтрация по цене &amp;gt; 200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; expensive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; OrderService.&lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(orders,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; o.&lt;span style="color:#a6e22e"&gt;getPrice&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;compareTo&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; BigDecimal(&lt;span style="color:#e6db74"&gt;&amp;#34;200.00&amp;#34;&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; 0);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Expensive: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; expensive);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Фильтрация по дате после 2023-01-15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; recent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; OrderService.&lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(orders,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; o.&lt;span style="color:#a6e22e"&gt;getDate&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;isAfter&lt;/span&gt;(LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 1, 15)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Recent: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; recent);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Фильтрация по статусу NEW&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; newOrders &lt;span style="color:#f92672"&gt;=&lt;/span&gt; OrderService.&lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(orders,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;NEW&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equalsIgnoreCase&lt;/span&gt;(o.&lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;()));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;New orders: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; newOrders);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Добавление нового фильтра без изменения OrderService:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// заказы, доставленные после 2023-02-01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; List&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Order&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; deliveredAfterFeb &lt;span style="color:#f92672"&gt;=&lt;/span&gt; OrderService.&lt;span style="color:#a6e22e"&gt;filterOrders&lt;/span&gt;(orders,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; o &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;DELIVERED&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;equalsIgnoreCase&lt;/span&gt;(o.&lt;span style="color:#a6e22e"&gt;getStatus&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; o.&lt;span style="color:#a6e22e"&gt;getDate&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;isAfter&lt;/span&gt;(LocalDate.&lt;span style="color:#a6e22e"&gt;of&lt;/span&gt;(2023, 2, 1)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Delivered after Feb: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; deliveredAfterFeb);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Фильтрация и группировка имён</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-stream-group-names/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-stream-stream-group-names/</guid><description>&lt;h4&gt;12. Фильтрация и группировка имён&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Есть список строк с именами пользователей. Необходимо:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Выбрать имена, начинающиеся с буквы «А».
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Сгруппировать имена по длине.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Вернуть результат в виде Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt;, где ключ — длина имени, значение — список имен такой длины.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Пример входных данных:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * [&amp;#34;Анна&amp;#34;, &amp;#34;Александр&amp;#34;, &amp;#34;Андрей&amp;#34;, &amp;#34;Антон&amp;#34;, &amp;#34;Борис&amp;#34;, &amp;#34;Богдан&amp;#34;, &amp;#34;Мария&amp;#34;, &amp;#34;Максим&amp;#34;, &amp;#34;Артём&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Ожидаемый результат:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * {4=[Анна], 5=[Антон, Артём], 6=[Андрей], 9=[Александр]}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public static Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; processNames(List&amp;lt;String&amp;gt; names) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return null;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Фильтрация списка пользователей in-place</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-users-in-place/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-filter-users-in-place/</guid><description>&lt;h4&gt;36. Фильтрация списка пользователей in-place&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
🔥 Реализовать метод &lt;code&gt;filterUsers&lt;/code&gt;, который &lt;strong&gt;in-place&lt;/strong&gt; отфильтровывает список &lt;code&gt;users&lt;/code&gt;, оставляя только тех, у кого имя начинается с &lt;code&gt;namePrefix&lt;/code&gt; и возраст больше 18.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; lombok.Data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterUsers&lt;/span&gt;(ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users, String namePrefix) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ваш код&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 Спойлеры к решению
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Для удаления элементов in-place используйте Iterator и его метод remove().&lt;br&gt;
💡 Можно также воспользоваться методом List.removeIf(&amp;hellip;) из Java 8.&lt;br&gt;
💡 Для проверки префикса используйте String.startsWith(namePrefix).&lt;br&gt;
💡 Условие фильтрации: user.getAge() &amp;gt; 18.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; lombok.Data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.ArrayList;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.Iterator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserUtils&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterUsers&lt;/span&gt;(ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; users, String namePrefix) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Iterator&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; iterator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; users.&lt;span style="color:#a6e22e"&gt;iterator&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (iterator.&lt;span style="color:#a6e22e"&gt;hasNext&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; User user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; iterator.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;user.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;startsWith&lt;/span&gt;(namePrefix) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; user.&lt;span style="color:#a6e22e"&gt;getAge&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; 18) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iterator.&lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Альтернативный вариант с removeIf:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// public static void filterUsers(ArrayList&amp;lt;User&amp;gt; users, String namePrefix) {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// users.removeIf(user -&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// !user.getName().startsWith(namePrefix) || user.getAge() &amp;lt;= 18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// );&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;User&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Alice&amp;#34;&lt;/span&gt;, 20));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Bob&amp;#34;&lt;/span&gt;, 17));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Alex&amp;#34;&lt;/span&gt;, 25));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; User(&lt;span style="color:#e6db74"&gt;&amp;#34;Anna&amp;#34;&lt;/span&gt;, 18));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filterUsers(list, &lt;span style="color:#e6db74"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; list.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(u &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(u.&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; u.&lt;span style="color:#a6e22e"&gt;getAge&lt;/span&gt;()));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вывод:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Alice 20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Alex 25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Форматирование текста в консоли</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-printformattedtext/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-printformattedtext/</guid><description>&lt;h4&gt;17. Реализовать форматирование текста в консоли&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
Напиши метод, который принимает строку и выводит на консоль отформатированный текст в виде рамки. В рамках должна быть отображена каждая часть строки в отдельной строке так, как показано в примере ниже.&lt;br&gt;
😊 &lt;strong&gt;Пример вывода:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;****************
* I *
* am *
* Java *
* Developer *
****************
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Task1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String TEXT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;I am Java Developer&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; ****************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * I *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * am *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Java *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Developer *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; ****************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Реализовать функцию вывода на консоль текста в параметре TEXT в формате, указанном выше.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printFormattedText&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; UnsupportedOperationException(&lt;span style="color:#e6db74"&gt;&amp;#34;Implemented it!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Разбей строку на слова:&lt;/strong&gt;&lt;br&gt;
Используй метод &lt;code&gt;split(&amp;quot; &amp;quot;)&lt;/code&gt;, чтобы получить массив слов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Вычисли максимальную длину слова:&lt;/strong&gt;&lt;br&gt;
Это поможет правильно установить ширину рамки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Построй рамку:&lt;/strong&gt;&lt;br&gt;
Используй символ &lt;code&gt;*&lt;/code&gt; для создания верхней и нижней границы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Форматированный вывод:&lt;/strong&gt;&lt;br&gt;
При выводе каждого слова используй форматирование, чтобы добавить пробелы до нужной длины.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Task1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String TEXT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;I am Java Developer&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Функция выводит текст, разбитый на слова, в виде рамки.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * Пример:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * ****************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * * I *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * * am *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * * Java *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * * Developer *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * ****************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printFormattedText&lt;/span&gt;(String text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (text &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; text.&lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Текст пустой!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Разбиваем строку на слова&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; words &lt;span style="color:#f92672"&gt;=&lt;/span&gt; text.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;\\s+&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Находим максимальную длину слова&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String word : words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (word.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; maxLength) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxLength &lt;span style="color:#f92672"&gt;=&lt;/span&gt; word.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Формируем верхнюю и нижнюю границы рамки&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String border &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;repeat&lt;/span&gt;(maxLength &lt;span style="color:#f92672"&gt;+&lt;/span&gt; 6);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Вывод рамки&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(border);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (String word : words) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Форматируем вывод так, чтобы слово выводилось с отступами&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;* %-&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;maxLength&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;s *%n&amp;#34;&lt;/span&gt;, word);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(border);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Task1 task &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Task1();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; task.&lt;span style="color:#a6e22e"&gt;printFormattedText&lt;/span&gt;(TEXT);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Чередование вывода `foo` и `bar`</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-foobar-alternate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-foobar-alternate/</guid><description>&lt;h4&gt;54. Чередование вывода `foo` и `bar`&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Дана класс &lt;code&gt;FooBar&lt;/code&gt;, в котором методы &lt;code&gt;foo()&lt;/code&gt; и &lt;code&gt;bar()&lt;/code&gt; выводят строки &lt;code&gt;&amp;quot;foo&amp;quot;&lt;/code&gt; и &lt;code&gt;&amp;quot;bar&amp;quot;&lt;/code&gt; по &lt;code&gt;n&lt;/code&gt; раз каждый. Одна и та же инстанция передаётся двум потокам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Поток A вызывает &lt;code&gt;foo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Поток B вызывает &lt;code&gt;bar()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Необходимо изменить реализацию так, чтобы вывод был чередованием &lt;code&gt;&amp;quot;foobarfoobar...&amp;quot;&lt;/code&gt; ровно &lt;code&gt;n&lt;/code&gt; раз.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; java.util.concurrent.Semaphore;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FooBar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: добавить синхронизацию&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FooBar&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: инициализация&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; InterruptedException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; n; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: ожидание и вывод &amp;#34;foo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: разрешить bar()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bar&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; InterruptedException {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; n; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: ожидание и вывод &amp;#34;bar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// TODO: разрешить foo()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Используйте два &lt;code&gt;Semaphore&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Число сотрудников с одинаковой зарплатой в каждом департаменте</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salary-count-per-department/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-salary-count-per-department/</guid><description>&lt;h4&gt;42. Число сотрудников с одинаковой зарплатой в каждом департаменте&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть таблицы &lt;code&gt;department(id, name)&lt;/code&gt; и &lt;code&gt;employee(id, surname, name, salary, department_id)&lt;/code&gt;.&lt;br&gt;
Необходимо вывести для каждого департамента и каждой зарплаты количество сотрудников, имеющих эту зарплату.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; department (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; employee (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id BIGSERIAL,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; surname VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name VARCHAR(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary BIGINT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; department_id BIGINT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;REFERENCES&lt;/span&gt; department(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Желаемый результат:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dep_name | salary | count
-------------+--------+------
Dep_name_1 | 1000 | 3
Dep_name_1 | 2000 | 4
Dep_name_2 | 2000 | 30
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Соедините &lt;code&gt;department&lt;/code&gt; и &lt;code&gt;employee&lt;/code&gt; по &lt;code&gt;department_id&lt;/code&gt;.&lt;br&gt;
💡 Используйте &lt;code&gt;GROUP BY d.name, e.salary&lt;/code&gt; и &lt;code&gt;COUNT(*)&lt;/code&gt;.&lt;br&gt;
💡 В альтернативном варианте можно применить оконную функцию &lt;code&gt;COUNT(*) OVER (PARTITION BY department_id, salary)&lt;/code&gt;.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 1: GROUP BY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; dep_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Решение 2: Оконная функция + DISTINCT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DISTINCT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d.name &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; dep_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e.salary,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;COUNT&lt;/span&gt;(&lt;span style="color:#f92672"&gt;*&lt;/span&gt;) OVER (PARTITION &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; e.department_id, e.salary) &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; department d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; employee e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; e.department_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dep_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; salary;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item><item><title>Эквивалент LEFT OUTER JOIN без использования OUTER JOIN</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-leftjoin-equivalent/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-sql-leftjoin-equivalent/</guid><description>&lt;h4&gt;39. Эквивалент LEFT OUTER JOIN без использования OUTER JOIN&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Есть две таблицы &lt;code&gt;t1(A)&lt;/code&gt; и &lt;code&gt;t2(B)&lt;/code&gt;.&lt;br&gt;
Исходный запрос:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; t1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LEFT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;OUTER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;JOIN&lt;/span&gt; t2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; t1.A &lt;span style="color:#f92672"&gt;=&lt;/span&gt; t2.B;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Необходимо переписать его эквивалентно &lt;strong&gt;без&lt;/strong&gt; использования &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;p&gt;💡 Разбейте на два подзапроса:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;INNER JOIN&lt;/strong&gt; для совпадающих строк.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Строки из &lt;code&gt;t1&lt;/code&gt;, для которых нет совпадений в &lt;code&gt;t2&lt;/code&gt;.&lt;br&gt;
💡 Объедините их с помощью &lt;code&gt;UNION ALL&lt;/code&gt;.&lt;br&gt;
💡 Для второго подзапроса используйте &lt;code&gt;NOT EXISTS&lt;/code&gt; или &lt;code&gt;NOT IN&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Являются ли строки перестановками друг друга</title><link>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-permutations-of-strings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krios2146.github.io/java-backend-interview-prep/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8/livecoding/task-livecoding-java-permutations-of-strings/</guid><description>&lt;h4&gt;85. Являются ли строки перестановками друг друга&lt;/h4&gt;
 &lt;p&gt;&lt;strong&gt;Условие задачи:&lt;/strong&gt;&lt;br&gt;
📌 Нужно написать метод, который проверяет являются ли строки перестановками друг друга?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Код:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Напишите метод arePermutations(String a, String b)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(arePermutations(&lt;span style="color:#e6db74"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;bca&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(arePermutations(&lt;span style="color:#e6db74"&gt;&amp;#34;aab&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;aba&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(arePermutations(&lt;span style="color:#e6db74"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;abcc&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(arePermutations(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(arePermutations(&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="book-hint warning"&gt;
 &lt;strong&gt;Спойлеры к решению&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;details &gt;&lt;summary&gt;Подсказки&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 💡 Сразу отсекайте разные длины.&lt;br&gt;
💡 Подход 1 (простой): отсортировать массивы символов и сравнить.&lt;br&gt;
💡 Подход 2 (линейный): посчитать частоты символов (Map) и сверить.&lt;br&gt;
💡 Если нужно игнорировать регистр/пробелы — нормализуйте входные строки перед сравнением.
 &lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;&lt;summary&gt;Решение&lt;/summary&gt;
 &lt;div class="markdown-inner"&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Вариант 1: через сортировку (O(n log n), простой и надёжный)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arePermutations&lt;/span&gt;(String a, String b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (a &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; b &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (a.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; b.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;()) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; ca &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; cb &lt;span style="color:#f92672"&gt;=&lt;/span&gt; b.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(ca);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(cb);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Arrays.&lt;span style="color:#a6e22e"&gt;equals&lt;/span&gt;(ca, cb);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Вариант 2: через частоты символов (O(n), без доп. сортировки)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;boolean&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arePermutationsLinear&lt;/span&gt;(String a, String b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (a &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; b &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (a.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;() &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; b.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;()) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Character, Integer&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; freq &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; c : a.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; freq.&lt;span style="color:#a6e22e"&gt;merge&lt;/span&gt;(c, 1, Integer::sum);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; c : b.&lt;span style="color:#a6e22e"&gt;toCharArray&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Integer cnt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; freq.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cnt &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (cnt &lt;span style="color:#f92672"&gt;==&lt;/span&gt; 1) freq.&lt;span style="color:#a6e22e"&gt;remove&lt;/span&gt;(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; freq.&lt;span style="color:#a6e22e"&gt;put&lt;/span&gt;(c, cnt &lt;span style="color:#f92672"&gt;-&lt;/span&gt; 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; freq.&lt;span style="color:#a6e22e"&gt;isEmpty&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/details&gt;</description></item></channel></rss>