Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
32 photos
2 videos
1.13K links
Download Telegram
Какие Spring Scope есть ?
Спросят с вероятностью 44%

В Spring Framework существует несколько областей видимости (scopes) для бинов, каждая из которых определяет жизненный цикл и видимость бина в контексте приложения. Вот основные из них:

1️⃣ Singleton: Это область видимости по умолчанию. Бин с данной областью видимости создается один раз на каждый контейнер Spring IoC и кэшируется для последующих запросов. Все запросы на получение бина возвращают один и тот же экземпляр бина.
@Component
@Scope("singleton")
public class MySingletonBean {
}


2️⃣ Prototype: Бин с данной областью видимости создается заново каждый раз, когда он запрашивается из контейнера. Это полезно, когда необходимы разные экземпляры бина для разных задач.
@Component
@Scope("prototype")
public class MyPrototypeBean {
}


3️⃣ Request: Эта область видимости используется в веб-приложениях. Бин создается для каждого HTTP-запроса и уничтожается после обработки запроса. Бины с данной областью видимости доступны только в контексте одного HTTP-запроса.
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyRequestBean {
}


4️⃣ Session: Бин с данной областью видимости создается для каждой пользовательской сессии. Бин живет в течение всей сессии и уничтожается, когда сессия завершается. Это полезно для хранения информации, специфичной для пользователя, в течение всего времени его сессии.
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MySessionBean {
}


5️⃣ Application: Бин с данной областью видимости создается один раз для всего сервлет-контекста. Это полезно для данных, которые должны быть общими для всех пользователей и сессий в приложении.
@Component
@Scope(value = "application", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyApplicationBean {
}


6️⃣ WebSocket: Бин с данной областью видимости создается для каждой сессии WebSocket. Это полезно для работы с данными, специфичными для каждой WebSocket-сессии.
@Component
@Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyWebSocketBean {
}


Каждая из этих областей видимости предоставляет разные способы управления жизненным циклом бинов в приложении, позволяя выбирать наиболее подходящий вариант для конкретного случая.

Spring предлагает разные области видимости для бинов, такие как Singleton, Prototype, Request, Session, Application и WebSocket, которые определяют, как и когда бины будут создаваться, жить и уничтожаться. Это позволяет управлять жизненным циклом бинов в соответствии с потребностями приложения.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍271🔥1
Чем rebase отличается от merge ?
Спросят с вероятностью 12%

rebase и merge являются двумя различными способами интеграции изменений из одной ветки git в другую. Оба метода используются для синхронизации изменений, но они делают это по-разному и служат разным целям.

Merge (слияние)

Используется для объединения изменений из одной ветки в другую. При выполнении слияния git создает новый коммит, который является "коммитом слияния" и имеет двух родителей — каждый из родительских коммитов представляет собой последние изменения в каждой из сливаемых веток.

Преимущества:
История коммитов сохраняет время и порядок всех изменений.
Коммиты слияния явно указывают на то, что произошло слияние двух веток.

Недостатки:
История коммитов может стать сложной и запутанной из-за большого количества коммитов слияния, особенно в проектах с активной разработкой и многими ветками.

Rebase (перебазирование)

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

Преимущества:
Создает чистую, линейную историю коммитов, что облегчает понимание последовательности изменений.
Упрощает процесс обзора истории изменений перед вливанием в основную ветку.

Недостатки:
Может создать проблемы с сохранностью истории, если он выполняется на коммитах, уже опубликованных в общедоступном репозитории, так как это изменяет историю коммитов.
Требует большей осторожности и понимания процесса, поскольку может привести к потере изменений при неправильном использовании.

В чем разница?

Основное отличие между merge и rebase заключается в том, как они интегрируют изменения. Merge сохраняет историю ветвления и слияния, в то время как rebase создает линейную историю, как если бы все изменения были сделаны последовательно в одной ветке. Выбор между merge и rebase зависит от предпочтений команды и требований к управлению историей изменений в проекте.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
В чём разница между JDK и JRE ?
Спросят с вероятностью 19%

JDK (Java Development Kit) и JRE (Java Runtime Environment) — это две взаимосвязанные платформы, используемые для разработки и выполнения приложений, но они предназначены для разных целей.

Java Development Kit (JDK)

Является полным ПО для разработки, включающим в себя JRE (то есть всё, что нужно для запуска Java-приложений), а также компилятор Java (javac), стандартные Java библиотеки, инструменты для разработки и отладки программ (например, jdb для отладки). Предназначен для разработчиков Java-приложений, поскольку он предоставляет все необходимые инструменты для разработки, компиляции, отладки и запуска программ.

Java Runtime Environment (JRE)

Представляет собой часть ПО, которая необходима для запуска Java-приложений, но не для их разработки. Она включает в себя Java Virtual Machine (JVM), которая интерпретирует скомпилированный Java-код (байт-код) и позволяет приложению выполняться на любой платформе, не зависящей от аппаратного обеспечения, а также набор базовых библиотек классов, необходимых для выполнения приложений.

Основные различия

Назначение: JDK используется для разработки Java-приложений, включая их компиляцию и отладку, тогда как JRE предназначен исключительно для их запуска.
Содержание: JDK включает JRE (то есть все, что нужно для запуска Java-приложений), а также дополнительные инструменты разработки, такие как компилятор и отладчик. JRE включает JVM и библиотеки классов, необходимые для выполнения приложений, но не содержит инструменты разработки.
Использование: Разработчики устанавливают JDK, чтобы иметь возможность разрабатывать и тестировать свои приложения, в то время как конечные пользователи могут установить только JRE для запуска Java-приложений.

Важно отметить, что для запуска Java-приложения на компьютере пользователя достаточно наличия JRE. Однако для полноценной разработки, компиляции и отладки Java-программ необходим JDK.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍245
В чем преимущества и недостатки ООП по сравнению с процедурным и функциональным программированием ?
Спросят с вероятностью 12%

Объектно-ориентированное программирование (ООП), процедурное и функциональное программирование — три основных парадигмы программирования, каждая из которых имеет свои преимущества и недостатки. Понимание этих различий помогает выбрать наиболее подходящий подход для конкретного проекта или задачи.

Объектно-ориентированное программирование (ООП)

Преимущества:

Модульность: Облегчает разбиение программы на небольшие, управляемые части (классы и объекты), что упрощает разработку и тестирование.
Повторное использование кода: Наследование позволяет создавать новые классы на основе существующих, что способствует повторному использованию кода.
Скрытие данных: Инкапсуляция позволяет скрыть детали реализации класса и предотвращает непреднамеренное изменение данных.
Расширяемость: Полиморфизм и наследование обеспечивают гибкость в добавлении новой функциональности и модификации существующей без изменения существующего кода.

Недостатки:

Сложность: Может вносить дополнительную сложность в проектирование и реализацию программы.
Производительность: Создание объектов и выполнение методов может потреблять больше времени и памяти, чем в процедурном программировании.
Кривая обучения: Освоение принципов ООП и их эффективное применение может потребовать значительного времени и опыта.

Процедурное

Преимущества:

Простота: Легче понять и использовать для начинающих программистов, поскольку оно следует прямолинейной логике выполнения программы.
Производительность: Программы, написанные в процедурном стиле, могут быть более быстрыми и эффективными по памяти, так как они напрямую управляют структурами данных и операциями.

Недостатки:

Трудности в управлении сложными программами: Может стать трудно управляемым при работе с большими и сложными программами.
Ограниченное повторное использование кода: Отсутствие наследования и инкапсуляции затрудняет повторное использование кода.

Функциональное

Преимущества:

Непеременность данных: Использует неизменяемые данные, что упрощает разработку конкурентных программ и повышает их надежность.
Повторное использование кода: Функции высшего порядка и функции как объекты первого класса облегчают создание выразительных и модульных программ.
Простота тестирования: Функции в нем легко тестировать изолированно благодаря отсутствию побочных эффектов.

Недостатки:

Кривая обучения: Концепции, такие как чистые функции, рекурсия и монады, могут быть непривычными и сложными для понимания новичками.
Производительность: Интенсивное использование рекурсии и создание большого количества временных неизменяемых структур данных может привести к снижению производительности в некоторых случаях.

Выбор между ООП, процедурным и функциональным программированием зависит от конкретных требований проекта, предпочтений и специфики задач, которые предстоит решить. Каждый из этих подходов имеет свои сильные и слабые стороны, и в некоторых проектах может быть целесообразным комбинировать их для достижения оптимальных результатов.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍253🔥1
Зачем нужны Hash Code & Equals Contract ?
Спросят с вероятностью 56%

hashCode() и equals() играют важную роль в работе с объектами, особенно когда речь идет о коллекциях, таких как HashSet, HashMap, и Hashtable. Они определены в классе Object, и поэтому доступны для переопределения всеми классами. Правильное переопределение этих методов важно для эффективной работы коллекций, которые используют хеширование.

Контракт hashCode() и equals() - определяет, как эти методы должны взаимодействовать друг с другом:

1️⃣ Согласованность: Если два объекта равны согласно методу equals(Object obj), тогда вызов hashCode() на каждом из объектов должен возвращать одинаковое целое значение. Это не значит, что объекты, не равные друг другу, должны возвращать различные хеш-коды. Однако, разные хеш-коды могут помочь улучшить производительность хеш-таблиц.

2️⃣ Обратное не требуется: Если hashCode() двух объектов возвращает одинаковое значение, это не обязательно означает, что объекты равны согласно equals(). Ситуация, когда разные объекты имеют одинаковые хеш-коды, называется коллизией.

Переопределение equals(Object obj) используется для проверки равенства двух объектов. По умолчанию, этот метод проверяет равенство ссылок, что означает, что два объекта считаются равными, только если они указывают на одно и то же место в памяти. Переопределение метода equals() позволяет сравнивать объекты по содержанию.

При переопределении equals(), убедитесь, что он:
Рефлексивен: для любого ненулевого ссылочного значения x, x.equals(x) должно возвращать true.
Симметричен: для любых ненулевых ссылочных значений x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает true.
Транзитивен: для любых ненулевых ссылочных значений x, y, и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то и x.equals(z) должно возвращать true.
Консистентен: для любых ненулевых ссылочных значений x и y, многократные вызовы x.equals(y) должны последовательно возвращать true или последовательно возвращать false.
Для любого ненулевого ссылочного значения x, x.equals(null) должно возвращать false.

Переопределение hashCode() возвращает хеш-код объекта, который используется хеш-таблицами для определения места хранения объекта. При переопределении equals(), необходимо также переопределить (), чтобы поддерживать общий контракт для методов hashCode() и equals().
public class Person {
private String name;
private int age;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}

В этом примере, equals() сравнивает объекты по name и age, а hashCode() использует эти же поля для генерации хеш-кода. Это обеспечивает соблюдение контракта между equals() и hashCode().

Правильное переопределение equals() и hashCode() критически важно для корректной работы коллекций, основанных на хеш-таблицах. Это обеспечивает эффективное распределение объектов в коллекции и корректное сравнение объектов по содержанию.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍263
Какой принцип объектно-ориентированного программирования не подразумевает использование наследования для достижения модульности и переиспользования кода?
Anonymous Quiz
28%
Инкапсуляция
20%
Полиморфизм
37%
Композиция
15%
Абстракция
🤔24👾3🤯21👍1
Какие есть шаблоны проектирования ?
Спросят с вероятностью 12%

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

Порождающие шаблоны (Creational Patterns)

Эти шаблоны связаны с процессом создания объектов, делая систему независимой от способа их создания, композиции и представления.

- Одиночка (Singleton): Обеспечивает создание только одного экземпляра класса и предоставляет глобальную точку доступа к этому экземпляру.
- Абстрактная фабрика (Abstract Factory): Позволяет создавать семейства связанных объектов без указания их конкретных классов.
- Фабричный метод (Factory Method): Определяет интерфейс для создания объекта, но оставляет выбор класса объекта подклассам.
- Строитель (Builder): Позволяет создавать сложные объекты пошагово.
- Прототип (Prototype): Позволяет копировать существующие объекты без создания зависимости от их классов.

Структурные шаблоны (Structural Patterns)

Описывают способы построения объектов и классов в более крупные структуры, при этом сохраняя гибкость и эффективность структур.

- Адаптер (Adapter): Позволяет объектам с несовместимыми интерфейсами работать вместе.
- Мост (Bridge): Разделяет абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга.
- Компоновщик (Composite): Позволяет группировать объекты в древовидные структуры для представления иерархий часть-целое.
- Декоратор (Decorator): Динамически добавляет новые обязанности объектам.
- Фасад (Facade): Предоставляет упрощённый интерфейс к сложной системе классов, библиотеке или фреймворку.
- Прокси (Proxy): Предоставляет заместителя или плейсхолдер для другого объекта для контроля доступа к нему.

Поведенческие шаблоны (Behavioral Patterns)

Рассматривают эффективное взаимодействие и распределение обязанностей между объектами.

- Наблюдатель (Observer): Позволяет объектам получать уведомления об изменениях состояния других объектов.
- Стратегия (Strategy): Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
- Команда (Command): Превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов.
- Состояние (State): Позволяет объекту изменять своё поведение при изменении его внутреннего состояния.
- Цепочка обязанностей (Chain of Responsibility): Позволяет передавать запросы вдоль цепочки обработчиков. При этом каждый обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепочке.
- Посредник (Mediator): Уменьшает связанность множества классов, вынося взаимодействие между объектами в один класс-посредник.
- Итератор (Iterator): Предоставляет способ последовательного доступа к элементам объекта-агрегата без раскрытия его внутреннего представления.

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

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer
👍27
Что такое deadlock ?
Спросят с вероятностью 31%

Deadlock (взаимная блокировка) — это ситуация в многопоточном программировании, при которой два или более потока вечно ожидают друг друга, освободят ли они ресурсы, занятые в данный момент. Каждый из потоков держит замок (lock) на некотором ресурсе и ожидает получения замка на другом ресурсе, который в это время занят другим потоком. В результате ни один из потоков не может продолжить выполнение, поскольку каждый из них ждет освобождения ресурса, занятого другим потоком.

Представьте ситуацию, где есть два потока и два ресурса (например, два файла или два объекта в памяти).

Поток 1 захватывает ресурс A и ждет освобождения ресурса B.
Поток 2 захватывает ресурс B и ждет освобождения ресурса A.

В такой ситуации оба потока не могут продолжить выполнение, так как каждый из них ожидает освобождения ресурса, уже захваченного другим потоком. Это и есть deadlock.

Чтобы избежать такой ситуации, нужно использовать стратегии, такие как:

1️⃣ Предотвращение зацикливания: Все потоки должны запрашивать ресурсы в одном и том же порядке, даже если это означает, что некоторым потокам придется ждать дольше.
2️⃣ Использование тайм-аутов: Потоки могут пытаться захватить ресурс с тайм-аутом. Если ресурс не получен за отведенное время, поток откатывает все свои текущие захваты ресурсов и пытается заново захватить их.
3️⃣ Обнаружение взаимных блокировок: Система может активно обнаруживать циклы ожидания и прерывать один из потоков для разрешения блокировки.
4️⃣ Использование однопоточных моделей: В некоторых случаях можно избежать проблем с многопоточностью, используя асинхронное программирование или реактивные модели, где логика выполнения не блокируется ожиданием ресурсов.

Deadlock — это состояние, когда два или более потока вечно ждут друг друга, освободят ли они занятые ресурсы, что приводит к остановке выполнения программы. Избежать этого можно с помощью правильного проектирования и стратегий управления доступом к ресурсам.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍11
Что такое JDBC ?
Спросят с вероятностью 12%

JDBC (Java Database Connectivity) — это API (прикладной программный интерфейс), который позволяет выполнять взаимодействие с различными базами данных. Он предоставляет унифицированный способ для установления соединения с базой данных, выполнения SQL-запросов и обработки результатов для получения и модификации данных. Этот интерфейс служит мостом между приложениями и различными системами управления базами данных (СУБД).

Ключевые компоненты:

1️⃣ DriverManager: Класс, который управляет списком драйверов баз данных. Он используется для установления соединения с базой данных.

2️⃣ Connection: Интерфейс, представляющий соединение с базой данных. Через объект Connection можно выполнять SQL-запросы и управлять транзакциями.

3️⃣ Statement: Интерфейс, используемый для выполнения статических SQL-запросов без параметров. С его помощью можно создавать и выполнять SQL-запросы к базе данных.

4️⃣ PreparedStatement: Расширение интерфейса Statement, предназначенное для выполнения SQL-запросов с предварительной компиляцией и возможностью использования параметров. Это повышает производительность и безопасность приложения.

5️⃣ CallableStatement: Интерфейс, используемый для выполнения хранимых процедур в базе данных.

6️⃣ ResultSet: Интерфейс, представляющий результат выполнения SQL-запроса. С его помощью можно читать данные, возвращенные запросом.

Пример:
import java.sql.*;

public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost/test";
String user = "user";
String password = "password";

try (Connection connection = DriverManager.getConnection(url, user, password)) {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");
while (resultSet.next()) {
String data = resultSet.getString("mycolumn");
System.out.println(data);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}


В этом примере устанавливается соединение с базой данных PostgreSQL, выполняется SQL-запрос на выборку данных из таблицы mytable и выводятся результаты.

JDBC является критически важным компонентом для разработки приложений, работающих с базами данных. Он обеспечивает универсальный способ доступа к данным, позволяя эффективно взаимодействовать с базой данных, независимо от её конкретной реализации.

➡️ Примеры ответов
➡️ Список всех вопросов на Java Developer
👍17🔥31
Является ли коллекция HashMap потоком безопасной ?
Спросят с вероятностью 12%

Коллекция HashMap не является потокобезопасной. Это означает, что при одновременном доступе к нему из нескольких потоков без должной синхронизации могут возникнуть проблемы, такие как потеря данных, гонки за данные и другие виды состояний гонки. Если один поток изменяет ее структуру (например, добавляя или удаляя элементы), в то время как другой поток итерирует по ней или также пытается внести изменения, результаты могут быть непредсказуемыми.

Для работы в многопоточной среде рекомендуется использовать потокобезопасные альтернативы, такие как:

1️⃣Collections.synchronizedMap(Map): Оборачивает ее (или любую другую карту) в потокобезопасную обёртку, гарантируя безопасность при доступе из разных потоков. Однако при использовании этого метода важно помнить, что если итерация по коллекции происходит в многопоточной среде, необходимо синхронизировать весь блок итерации на возвращённой карте для предотвращения конкурентных модификаций.
        Map<String, String> map = Collections.synchronizedMap(new HashMap<>());


2️⃣ConcurrentHashMap: Предоставляет потокобезопасную реализацию карты без блокировки всей карты. ConcurrentHashMap разработан для высокой конкуренции и эффективности при доступе из множества потоков, обеспечивая лучшую производительность по сравнению с synchronizedMap. ConcurrentHashMap позволяет одновременно читать данные из карты несколькими потоками без блокировки и записывать данные при минимальной блокировке.
        Map<String, String> concurrentMap = new ConcurrentHashMap<>();


Использование ConcurrentHashMap является предпочтительным вариантом для многопоточных приложений, где требуются операции чтения и записи в карту, поскольку она специально разработана для таких сценариев, обеспечивая высокую производительность и потокобезопасность.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33😁32
Какой метод из класса Object будет вызван по умолчанию, если объект используется в строковой конкатенации?
Anonymous Quiz
3%
finalize()
3%
getClass ( )
4%
hashCode ()
90%
toString()
😁12👍65
Что такое mock ?
Спросят с вероятностью 12%

"mock" (подделка, макет) — это объект, который имитирует поведение реального компонента в контролируемом окружении. Такие объекты часто используются в модульном тестировании для имитации взаимодействия между компонентами программы, позволяя тестировать каждый компонент изолированно от остальных. Это особенно полезно в ситуациях, когда реальные объекты трудно настроить, они медленно работают или их использование в тестах может привести к нежелательным побочным эффектам (например, изменение данных в базе данных).

Ключевые аспекты:

Изоляция тестируемого компонента: Объекты позволяют изолировать тестируемый компонент от его зависимостей, что обеспечивает точность тестирования и помогает точно определить причины возникновения ошибок.
Контроль взаимодействий: С помощью него объектов можно точно определить, как тестируемый компонент взаимодействует с его зависимостями, включая проверку вызовов методов, передачу аргументов и возвращаемые значения.
Тестирование в различных сценариях: Объекты позволяют легко настраивать различные условия тестирования, например, имитируя различные ситуации ошибок или исключительных состояний, которые могут быть трудно воспроизвести с реальными объектами.
Ускорение тестирования: Поскольку такие объекты имитируют только необходимые аспекты реальных объектов, они могут существенно ускорить выполнение тестов по сравнению с использованием реальных компонентов, особенно если последние медленно работают или требуют сложной настройки.

Пример:
import static org.mockito.Mockito.*;

public class SomeTest {
@Test
public void testSomeMethod() {
// Создание mock объекта
MyDependency myMock = mock(MyDependency.class);

// Настройка поведения mock объекта
when(myMock.someMethod()).thenReturn("expected value");

// Создание экземпляра тестируемого класса с mock зависимостью
MyClass myClass = new MyClass(myMock);

// Вызов тестируемого метода
String result = myClass.useDependency();

// Проверка результата
assertEquals("expected value", result);

// Проверка взаимодействия с mock объектом
verify(myMock).someMethod();
}
}


В этом примере используется mock объект для зависимости MyDependency класса MyClass, что позволяет тестировать поведение MyClass в изоляции от реализации MyDependency, предоставляя при этом контролируемое окружение для проверки взаимодействий и результатов выполнения.

Mock объекты являются важным инструментом при написании модульных тестов. Они облегчают тестирование, позволяя точно и изолированно проверять поведение компонентов программы в различных сценариях.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
Что такое коллекции и зачем они нужны ?
Спросят с вероятностью 12%

Коллекции — это структуры данных, предназначенные для хранения группы объектов. Они представлены Java Collection Framework (JCF), который включает в себя различные интерфейсы и классы, такие как списки (List), множества (Set), очереди (Queue) и карты (Map). Эти структуры данных позволяют эффективно управлять наборами данных, обеспечивая удобный доступ к элементам, их хранение и манипулирование ими.

Зачем они нужны:

1️⃣Гибкое управление данными: Позволяют хранить объекты динамически, в отличие от массивов, размер которых фиксирован. Это означает, что вы можете добавлять, удалять и изменять элементы в коллекции в любое время.

2️⃣Поддержка различных структур данных: Каждая структура данных имеет свои особенности и предназначена для решения определённых задач. Например, List поддерживает упорядоченную коллекцию с дубликатами, Set — набор уникальных элементов, Map — хранение пар ключ-значение.

3️⃣Улучшение производительности: Многие реализации коллекций оптимизированы для быстрого выполнения часто используемых операций, таких как поиск, сортировка и вставка элементов.

4️⃣Повышение читаемости и упрощение кода: Использование их и их методов помогает сделать код более понятным и сократить количество написанного кода за счёт использования готовых абстракций.

5️⃣Облегчение выполнения сложных операций: Они в сочетании с Stream API и более новых версиях предоставляют мощные инструменты для обработки данных, включая фильтрацию, преобразование, сортировку и агрегацию.

Пример:
import java.util.ArrayList;
import java.util.List;

public class CollectionExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");

for (String fruit : fruits) {
System.out.println(fruit);
}
}
}


В этом примере используется ArrayList, одна из реализаций интерфейса List, для хранения и вывода списка фруктов. ArrayList позволяет легко добавлять новые элементы и автоматически расширяется для их хранения.

Коллекции необходимы для эффективного управления наборами данных. Они предоставляют гибкие и мощные средства для хранения, доступа и манипулирования объектами, делая код более чистым, понятным и эффективным.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍262🤯1
В чем разница Spring Boot и Spring ?
Спросят с вероятностью 12%

Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.

Spring Framework

Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.

Основные характеристики:
1️⃣ Повышение производительности и упрощение управления транзакциями.
2️⃣ Облегчение интеграции с другими Java фреймворками и библиотеками.
3️⃣ Поддержка модульного программирования через разделение приложения на отдельные компоненты.

Spring Boot

С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.

Основные характеристики:
1️⃣ Автоматическая конфигурация Spring-приложений в соответствии с "лучшими практиками".
2️⃣ Встроенные серверы приложений, такие как Tomcat, Jetty, чтобы можно было запускать веб-приложения без внешнего сервера.
3️⃣ Обширная поддержка стартеров, которые автоматически добавляют зависимости и автоконфигурацию для различных модулей Spring (например, Spring MVC, Spring Data JPA).
4️⃣ Упрощение управления зависимостями и версиями.
5️⃣ Поддержка быстрого создания исполняемых JAR- и WAR-файлов для упрощения развертывания.

Различия

- Цель: Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
- Конфигурация: В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
- Встроенный сервер: Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.

Spring Boot не заменяет Spring Framework, а дополняет его, предоставляя более простой и быстрый способ для создания готовых к развертыванию приложений, оптимизируя и автоматизируя многие процессы конфигурации.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35
Какой интерфейс в иерархии коллекций
Java не наследуется ни от одного другого интерфейса коллекций?
Anonymous Quiz
4%
List
9%
Set
14%
Queue
73%
Collection
7
В чем разница между ArrayList и Вектором ?
Спросят с вероятностью 12%

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

Основные различия:

1️⃣Синхронизация:
Vector: Все методы Vector синхронизированы. Это означает, что они потокобезопасны и могут использоваться без дополнительных мер предосторожности в многопоточных средах. Однако из-за этого Vector может работать медленнее, чем ArrayList, в однопоточных приложениях из-за накладных расходов на синхронизацию.
ArrayList: Методы ArrayList не синхронизированы. Это делает ArrayList более быстрым, чем Vector, в средах, где потокобезопасность не является требованием. Для использования в многопоточных средах необходимо обеспечить внешнюю синхронизацию или использовать Collections.synchronizedList() для оборачивания ArrayList.

2️⃣Рост:
Vector: По умолчанию увеличивает свою емкость на 100% (удваивается), когда требуется расширение, если не указан иной коэффициент расширения.
ArrayList: Увеличивает свою емкость примерно на 50% при необходимости расширения.

3️⃣Производительность:
Из-за синхронизированных методов Vector может быть менее производительным в сравнении с ArrayList, особенно в приложениях, где требуется высокая скорость работы с коллекциями в однопоточном режиме.

4️⃣Использование:
Vector считается немного устаревшим и рекомендуется к использованию в особых случаях, когда требуется встроенная потокобезопасность без внешней синхронизации.
ArrayList является предпочтительным выбором для новых разработок из-за его производительности в большинстве сценариев.

Пример:
import java.util.*;

public class ListExample {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");

List<String> vector = new Vector<>();
vector.add("C++");
vector.add("JavaScript");
}
}


Выбор между ArrayList и Vector зависит от конкретных требований к приложению. Если потокобезопасность является ключевым требованием и вы готовы пожертвовать некоторой производительностью, то Vector может быть подходящим выбором. В большинстве других случаев предпочтительнее использовать ArrayList из-за его лучшей производительности и широкой распространённости в современном коде.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114😁2
Какие состояния объекта есть в Hibernate ?
Спросят с вероятностью 12%

В Hibernate, фреймворке для отображения объектно-реляционных данных, объект может находиться в одном из трёх основных состояний:

1️⃣Transient (Временное)

Объект только что создан с использованием оператора new и ещё не связан с сессией Hibernate.
Объект ещё не сохранён в базе данных, и у него нет представления в базе данных.
Объект во временном состоянии не управляется Hibernate, и изменения, сделанные в объекте, не отслеживаются.
Чтобы сохранить объект в базе данных, его необходимо явно передать в сессию Hibernate с использованием методов save(), persist() или аналогичных.

2️⃣Persistent (Постоянное)

Объект связан с уникальной сессией Hibernate и имеет соответствующую запись в базе данных.
Любые изменения, внесённые в объект в состоянии Persistent, автоматически синхронизируются с базой данных при фиксации транзакции или закрытии сессии (если включено автоматическое применение изменений).
Объекты в состоянии Persistent могут быть извлечены из базы данных с помощью запросов или методов get(), load().

3️⃣Detached (Отсоединённое)

Объект был в состоянии Persistent, но его сессия была закрыта.
Объект всё ещё имеет соответствующую запись в базе данных, но любые изменения, внесённые в объект после закрытия сессии, не отслеживаются и не синхронизируются с базой данных автоматически.
Чтобы снова синхронизировать состояние объекта с базой данных, его необходимо повторно связать с новой сессией Hibernate с использованием методов update(), merge() или saveOrUpdate().

4️⃣Removed (Удалённое)

Это неформальное состояние, когда объект был в состоянии Persistent, но затем был удалён из базы данных с использованием метода delete().
После удаления объект по-прежнему существует в памяти, но больше не имеет соответствующей записи в базе данных и не связан с сессией Hibernate.

Работа с этими состояниями объектов позволяет Hibernate эффективно управлять жизненным циклом объектов, их сохранением, обновлением и удалением в базе данных, а также оптимизировать взаимодействие с базой данных, минимизируя количество необходимых запросов.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Please open Telegram to view this post
VIEW IN TELEGRAM
👍392🔥2😁1