Базовые вопросы по Core Java на собеседовании
1. В чём разница между
2. Объясните концепцию ООП в Java.
3. Чем отличаются HashMap, LinkedHashMap, TreeMap и Hashtable?
4. В чём разница между ArrayList и LinkedList?
5. Что такое контракт
6, Как работает управление памятью в Java (heap, stack, GC)?
7. Разница между
8. Какие бывают типы исключений в Java? Checked vs Unchecked?
9. Что такое синглтон-класс? Как его реализовать?
10. Объясните ключевые слова
👉 Java Portal
1. В чём разница между
==
и .equals()
в Java?2. Объясните концепцию ООП в Java.
3. Чем отличаются HashMap, LinkedHashMap, TreeMap и Hashtable?
4. В чём разница между ArrayList и LinkedList?
5. Что такое контракт
hashCode()
и equals()
?6, Как работает управление памятью в Java (heap, stack, GC)?
7. Разница между
final, finally
и finalize()
?8. Какие бывают типы исключений в Java? Checked vs Unchecked?
9. Что такое синглтон-класс? Как его реализовать?
10. Объясните ключевые слова
volatile, synchronized
и transient
Please open Telegram to view this post
VIEW IN TELEGRAM
Тридцатый день рождения Java
Сегодня 23 мая и Java исполняется 30 лет!
Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года
С юбилеем, родной🥇
👉 Java Portal
Сегодня 23 мая и Java исполняется 30 лет!
Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года
С юбилеем, родной
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассмотрим следующий Java-файл, в котором объявлены два класса —
Следующая программа использует оба класса, но из другого пакета. При этом она не ссылается напрямую на класс Escape по имени — и успешно компилируется и выполняется без ошибок:
Но если последнюю переменную c тоже объявить с использованием
то компиляция завершится ошибкой:
🔥 — знал об этом
👍 — полезно
👉 Java Portal
Library
и Escape
. Обратите внимание: класс Escape имеет package-private доступ, так как у него нет явного модификатора доступа:// internal/Library.java
package internal;
public interface Library {
static Escape create() {
return new Escape();
}
}
class Escape {}
Следующая программа использует оба класса, но из другого пакета. При этом она не ссылается напрямую на класс Escape по имени — и успешно компилируется и выполняется без ошибок:
void main() {
Object a = internal.Library.create();
IO.println(a);
var b = internal.Library.create();
IO.println(b);
Object c = internal.Library.create();
IO.println(c.toString()); // обратите внимание на вызов toString()
}
Но если последнюю переменную c тоже объявить с использованием
var
, как здесь:var c = internal.Library.create();
то компиляция завершится ошибкой:
"Object.toString() is defined in an inaccessible class or interface"
🔥 — знал об этом
👍 — полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Гайд на кэширование в Java с помощью Spring Boot, Redis и Docker
Если ты хочешь понять, как эффективно реализовать кэш в Java-приложении — в этом гайде рассказывается, как использовать связку Spring Boot + Redis внутри Docker-контейнера.
Подробно разбирается:
> как работает кэш, аннотации Spring (
Также показано, как протестировать кэш и избежать типичных ошибок.
Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД😡
👉 Java Portal
Если ты хочешь понять, как эффективно реализовать кэш в Java-приложении — в этом гайде рассказывается, как использовать связку Spring Boot + Redis внутри Docker-контейнера.
Подробно разбирается:
> как работает кэш, аннотации Spring (
@Cacheable
и др), настройка Redis и интеграция всего этого в микросервис.Также показано, как протестировать кэш и избежать типичных ошибок.
Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД
Please open Telegram to view this post
VIEW IN TELEGRAM
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
👉 Java Portal
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
$ mvn archetype:generate
Создание нового Maven-проекта
$ mvn clean
Очистка директории target
$ mvn compile
Компиляция исходного кода
$ mvn test
Запуск unit-тестов
$ mvn package
Сборка проекта в JAR/WAR
$ mvn install
Установка артефакта в локальный Maven-репозиторий
$ mvn install -DskipTests
Пропустить тесты при сборке
$ mvn spring-boot:run
Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)
$ mvn dependency:resolve
Обновление зависимостей
$ mvn dependency:tree
Вывод дерева зависимостей
$ mvn clean compile package
Запуск целей в указанной фазе
$ mvn validate
Проверка структуры проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое JWT?
⇨ JSON Web Token — это открытый стандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта.
⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.
Структура JWT
JWT состоит из трёх частей, разделённых точками (.):
1. Header
⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).
2. Payload (Claims)
⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.
Типы claims:
➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д.
➁ Public claims — настраиваются вашим приложением.
➂ Private claims — используются по соглашению между сторонами.
3. Signature
⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа.
⇨ Гарантирует подлинность и целостность токена.
Безопасность
При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.
Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.
Такие помощники формируют привычку писать безопасный и чистый код с самого начала💖
👉 Java Portal
⇨ JSON Web Token — это открытый стандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта.
⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.
Структура JWT
JWT состоит из трёх частей, разделённых точками (.):
1. Header
⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).
2. Payload (Claims)
⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.
Типы claims:
➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д.
➁ Public claims — настраиваются вашим приложением.
➂ Private claims — используются по соглашению между сторонами.
3. Signature
⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа.
⇨ Гарантирует подлинность и целостность токена.
Безопасность
При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.
Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.
Такие помощники формируют привычку писать безопасный и чистый код с самого начала
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации кэширования Spring Boot
👉 Java Portal
@EnableCaching
// Включает кэш в проекте
// Ставится на конфигурационный класс
@Cacheable
// Кэширует результат метода
// Используй для дорогих в вычислении методов
@CachePut
// Обновляет кэш новым результатом
// Когда метод меняет данные и нужно обновить кэш
@CacheEvict
// Удаляет записи из кэша
// При удалении или обновлении данных
@Caching
// Объединяет несколько кэш-аннотаций
// Когда на методе нужно и @Put, и @Evict, и т.д.
@CacheConfig
// Общие настройки кэша на уровне класса
// Чтобы не дублировать параметры в каждой аннотации
Please open Telegram to view this post
VIEW IN TELEGRAM
Нашёл полезную и простую статью про докеризацию Spring Boot.
Внутри — три подхода к сборке Docker-образов
> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle
— примеры кода, запуск, деплой, советы и сравнение подходов.
Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.
Рекомендую, чтиво полезное😊
👉 Java Portal
Внутри — три подхода к сборке Docker-образов
> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle
— примеры кода, запуск, деплой, советы и сравнение подходов.
Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.
Рекомендую, чтиво полезное
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы использовали сопоставление с образцом (pattern matching) для
До Pattern Matching:
Здесь нужно вручную приводить тип, хотя компилятор уже знает, что
С Pattern Matching (начиная с Java 16+):
👉 Java Portal
instanceof
?До Pattern Matching:
Object obj = "Hello Java!";
if (obj instanceof String) {
String s = (String) obj; // Лишнее приведение типа
System.out.println(s.length());
}
Здесь нужно вручную приводить тип, хотя компилятор уже знает, что
obj
— это String.С Pattern Matching (начиная с Java 16+):
Object obj = "Hello Modern Java!";
if (obj instanceof String s) { // s автоматически приводится к типу String
System.out.println(s.length());
}
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. Приятного чтения 💪
> источник
👉 Java Portal
> источник
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс JpaRepository
Это готовое решение для CRUD-операций. Просто унаследуйся от
👉 Java Portal
Это готовое решение для CRUD-операций. Просто унаследуйся от
JpaRepository<Entity, ID>
— и получи save, find, delete, update
без лишнего кодаPlease open Telegram to view this post
VIEW IN TELEGRAM
Как работает FlatMap в Java?
Mapping
Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.
Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.
Flattening
Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.
Синтаксис и параметры для flatMap():
> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.
👉 Java Portal
Mapping
Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.
Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.
Flattening
Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.
Синтаксис и параметры для flatMap():
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-05-27_07-57-06.png
255 KB
Java Lombok: Аннотация
Аннотация
>
>
>
>
>
👉 Java Portal
@Data
— всё в одномАннотация
@Data
объединяет в себе несколько часто используемых аннотаций Lombok:>
@ToString
— генерирует метод toString()>
@Getter
— создаёт геттеры для всех нестатических полей>
@Setter
— создаёт сеттеры для всех нестатических полей>
@EqualsAndHashCode
— генерирует equals() и hashCode()>
@RequiredArgsConstructor
— создаёт конструктор для всех final и @NonNull
полейPlease open Telegram to view this post
VIEW IN TELEGRAM
JDK 25: String::hashCode стал быстрее
В новой версии JDK 25 улучшили производительность класса String: теперь метод
Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки
⏩ Подробнее: https://social.ora.cl/6014274Ew
👉 Java Portal
В новой версии JDK 25 улучшили производительность класса String: теперь метод
String::hashCode
в большинстве случаев сворачивается на этапе компиляции (constant folding).Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки
Please open Telegram to view this post
VIEW IN TELEGRAM
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:
> Используешь DI, когда аннотируешь поле
> Вызываешь
> Передаёшь
>
>
> Оборачиваешь
👉 Java Portal
> Используешь DI, когда аннотируешь поле
@Autowired
или полагаешься на Spring для автосвязывания бинов.> Вызываешь
Executors.newFixedThreadPool()
— это паттерн Factory, возвращающий настроенный объект.> Передаёшь
Comparator
в Collections.sort()
— это паттерн Strategy, позволяющий задать поведение на лету.>
PropertyChangeListener
в Swing
или ApplicationListener
в Spring — это паттерн Observer.>
StringBuilder.append()
— это паттерн Builder, пошагово создающий объект.> Оборачиваешь
BufferedReader
вокруг InputStreamReader
— это паттерн DecoratorPlease open Telegram to view this post
VIEW IN TELEGRAM
Spring Batch упрощает управление ETL-задачами
Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам
Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий
Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык🪑
👉 Java Portal
Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам
Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий
Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Звучит знакомо:
Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?
Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией🥺
👉 Java Portal
Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?
Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией
@SpringBoot
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java API
Используйте
Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку☕️
👉 Java Portal
Используйте
@FunctionalInterface
как защиту на уровне компиляцииОна помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом гайде автор показывает, как парсить структурированные строки в Java
Большинство разработчиков используют регулярные выражения,
Класс😃
👉 Java Portal
Большинство разработчиков используют регулярные выражения,
split()
или ручную нарезку строк. Но эти техники подвержены ошибкам, плохо читаются и, что важнее всего — небезопасны на этапе компиляции.Класс
StringFormat
делает парсинг настолько простым, что даже новичок может реализовать его в одну строку. Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java: предпочитай внедрение через конструктор, а не через поля
На то есть разные причины:
> Зависимости можно пометить как
> Повышает надёжность класса и безопасность при работе с потоками
> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
👉 Java Portal
На то есть разные причины:
> Зависимости можно пометить как
final
, гарантируя, что они не изменятся после создания.> Повышает надёжность класса и безопасность при работе с потоками
> Заставляет вызывающий код (или DI-контейнер) передать все необходимые зависимости
> Упрощает модульное тестирование, позволяя подставлять моки или стабы через конструктор
> Все зависимости видны в конструкторе, что чётко показывает, что нужно классу для работы.
> Внедрение через конструктор не использует рефлексию или доступ к приватным полям (в отличие от внедрения через поля), что повышает производительность и снижает риски
Please open Telegram to view this post
VIEW IN TELEGRAM