🤔 Что стоит в центре парадигмы?
В центре функциональной парадигмы стоит функция как объект первого класса, которую можно передавать, возвращать, комбинировать и вызывать. Также ключевыми являются неизменяемость данных, композиция и декларативность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
В центре функциональной парадигмы стоит функция как объект первого класса, которую можно передавать, возвращать, комбинировать и вызывать. Также ключевыми являются неизменяемость данных, композиция и декларативность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊16🤔4👍1
🤔 Чем отличаются методы Thread.sleep() и Thread.yield()?
Методы
🚩Thread.sleep()
Метод
🚩Как это работает?
Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).
Результат
🚩Thread.yield()
Метод
🚩Как это работает?
Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.
Результат (примерный, зависит от планировщика ОС)
Ставь 👍 и забирай 📚 Базу знаний
Методы
Thread.sleep() и Thread.yield() в Java используются для управления потоком, но работают по-разному. 🚩Thread.sleep()
Метод
Thread.sleep(milliseconds) приостанавливает выполнение текущего потока на указанное время. 🚩Как это работает?
Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).
public class SleepExample {
public static void main(String[] args) {
System.out.println("Начало работы...");
try {
Thread.sleep(2000); // Пауза на 2 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Прошло 2 секунды");
}
}Результат
Начало работы...
(пауза 2 секунды)
Прошло 2 секунды
🚩Thread.yield()
Метод
Thread.yield() даёт возможность другим потокам выполнить работу. 🚩Как это работает?
Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.
public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
Thread.yield(); // Позволяет другим потокам выполняться
}
};
Thread t1 = new Thread(task, "Поток-1");
Thread t2 = new Thread(task, "Поток-2");
t1.start();
t2.start();
}
}Результат (примерный, зависит от планировщика ОС)
Поток-1 - 1
Поток-2 - 1
Поток-1 - 2
Поток-2 - 2
...
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Для чего используется оператор ORDER BY?
ORDER BY используется для сортировки результата запроса по одному или нескольким столбцам:
- по возрастанию (ASC) или убыванию (DESC);
- может использовать индексы (при наличии).
Без ORDER BY СУБД не гарантирует порядок строк в ответе.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
ORDER BY используется для сортировки результата запроса по одному или нескольким столбцам:
- по возрастанию (ASC) или убыванию (DESC);
- может использовать индексы (при наличии).
Без ORDER BY СУБД не гарантирует порядок строк в ответе.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Чем полезны неизменяемые (Immutable) объекты в Java?
Неизменяемые (immutable) объекты не могут быть изменены после создания.
Если нужно изменить данные – создаётся новый объект.
🚩Почему неизменяемые объекты полезны?
🟠Потокобезопасность (Thread Safety)
Неизменяемые объекты можно безопасно использовать в многопоточной среде – их не нужно синхронизировать.
🟠Отсутствие неожиданных изменений (безопасность данных)
Если объект неизменяемый, его нельзя случайно изменить.
🟠Упрощает отладку и поддержку кода
Изменяемые объекты могут менять состояние в неожиданный момент.
🟠Можно использовать в качестве ключей в `HashMap` и `HashSet`
Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в
🟠Совместимость с кэшем (например, в Hibernate, Spring)
Неизменяемые объекты можно безопасно кешировать, так как они не меняются.
🚩Как создать неизменяемый класс?
Все поля
Нет сеттеров.
Если есть массивы или списки – копируем их перед возвратом.
Ставь 👍 и забирай 📚 Базу знаний
Неизменяемые (immutable) объекты не могут быть изменены после создания.
Если нужно изменить данные – создаётся новый объект.
🚩Почему неизменяемые объекты полезны?
🟠Потокобезопасность (Thread Safety)
Неизменяемые объекты можно безопасно использовать в многопоточной среде – их не нужно синхронизировать.
String message = "Hello";
String newMessage = message.replace("H", "J");
System.out.println(message); // Hello
System.out.println(newMessage); // Jello
🟠Отсутствие неожиданных изменений (безопасность данных)
Если объект неизменяемый, его нельзя случайно изменить.
class BankAccount {
private final String accountNumber;
public BankAccount(String accountNumber) {
this.accountNumber = accountNumber;
}
public String getAccountNumber() {
return accountNumber;
}
}🟠Упрощает отладку и поддержку кода
Изменяемые объекты могут менять состояние в неожиданный момент.
List<String> list = new ArrayList<>();
list.add("Java");
modifyList(list); // Метод может изменить список!
System.out.println(list); // Ожидаем ["Java"], но может быть что угодно!
🟠Можно использовать в качестве ключей в `HashMap` и `HashSet`
Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в
HashMap.Map<String, String> map = new HashMap<>();
map.put("key", "value");
System.out.println(map.get("key")); // Всегда "value", так как String неизменяемый
🟠Совместимость с кэшем (например, в Hibernate, Spring)
Неизменяемые объекты можно безопасно кешировать, так как они не меняются.
🚩Как создать неизменяемый класс?
Все поля
private final. Нет сеттеров.
Если есть массивы или списки – копируем их перед возвратом.
final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Что известно про особое свойство React?
- Компонентность: интерфейс разбит на переиспользуемые компоненты;
- Однонаправленный поток данных (props → down);
- JSX — декларативный синтаксис, близкий к HTML, но с возможностями JS;
- Виртуальный DOM — ключ к высокой производительности;
- Хуки — способ управлять состоянием и побочными эффектами в функциональных компонентах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Компонентность: интерфейс разбит на переиспользуемые компоненты;
- Однонаправленный поток данных (props → down);
- JSX — декларативный синтаксис, близкий к HTML, но с возможностями JS;
- Виртуальный DOM — ключ к высокой производительности;
- Хуки — способ управлять состоянием и побочными эффектами в функциональных компонентах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊12
🤔 В чем разница между Statement и PreparedStatement?
Это два интерфейса в JDBC, которые используются для выполнения SQL-запросов к базе данных. Основные различия между ними касаются производительности, безопасности и удобства использования.
🚩Statement
Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
🟠PreparedStatement
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
🚩Основные различия
🟠Производительность
🟠Безопасность
🟠Удобство использования
🟠Типы запросов
Оба интерфейса могут выполнять запросы типа
Ставь 👍 и забирай 📚 Базу знаний
Это два интерфейса в JDBC, которые используются для выполнения SQL-запросов к базе данных. Основные различия между ними касаются производительности, безопасности и удобства использования.
🚩Statement
Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
Statement stmt = connection.createStatement();
String query = "SELECT * FROM employees WHERE department = 'HR'";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
stmt.close();
🟠PreparedStatement
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
String query = "SELECT * FROM employees WHERE department = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, "HR");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
pstmt.close();
🚩Основные различия
🟠Производительность
Statement: Каждый запрос компилируется заново, что снижает производительность при многократном выполнении одного и того же запроса.PreparedStatement: Запрос компилируется один раз и может многократно выполняться с разными параметрами, что повышает производительность.🟠Безопасность
Statement: Уязвим к SQL-инъекциям, поскольку запросы формируются путем конкатенации строк.PreparedStatement: Использует параметризованные запросы, что защищает от SQL-инъекций.🟠Удобство использования
Statement: Подходит для простых, одноразовых запросов.PreparedStatement: Удобен для многократного выполнения запросов с разными параметрами.🟠Типы запросов
Оба интерфейса могут выполнять запросы типа
SELECT, INSERT, UPDATE, DELETE, но PreparedStatement более удобен для запросов с параметрами.Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое ключевое слово final?
final используется для:
1. Классов: предотвращает наследование.
2. Методов: предотвращает переопределение.
3. Переменных: значение не может быть изменено после инициализации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Классов: предотвращает наследование.
2. Методов: предотвращает переопределение.
3. Переменных: значение не может быть изменено после инициализации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Какая коллекция реализует дисциплину обслуживания FIFO?
FIFO (First-In, First-Out) – это принцип обработки данных: "первым вошёл – первым вышел".
🟠Коллекции, реализующие FIFO
Пример работы FIFO с
🟠Разница `poll()`, `remove()` и `peek()`
Ставь 👍 и забирай 📚 Базу знаний
FIFO (First-In, First-Out) – это принцип обработки данных: "первым вошёл – первым вышел".
🟠Коллекции, реализующие FIFO
Пример работы FIFO с
Queue import java.util.*;
public class FifoExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>(); // Можно заменить на ArrayDeque
queue.add("Первый");
queue.add("Второй");
queue.add("Третий");
System.out.println(queue.poll()); // Первый
System.out.println(queue.poll()); // Второй
System.out.println(queue.poll()); // Третий
}
}
🟠Разница `poll()`, `remove()` и `peek()`
Queue<Integer> queue = new LinkedList<>();
queue.add(10);
System.out.println(queue.peek()); // 10 (но не удаляет)
System.out.println(queue.poll()); // 10 (удаляет)
System.out.println(queue.poll()); // null (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Какие виды ссылок на методы есть?
1. Ссылка на статический метод — ClassName::staticMethod;
2. Ссылка на метод экземпляра конкретного объекта — object::instanceMethod;
3. Ссылка на метод экземпляра произвольного объекта типа — ClassName::instanceMethod;
4. Ссылка на конструктор — ClassName::new.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Ссылка на статический метод — ClassName::staticMethod;
2. Ссылка на метод экземпляра конкретного объекта — object::instanceMethod;
3. Ссылка на метод экземпляра произвольного объекта типа — ClassName::instanceMethod;
4. Ссылка на конструктор — ClassName::new.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥5👍2
🤔 В чем разница между Spring аннотациями Component, Repository и Service?
Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.
🚩`@Component` – базовая аннотация для бина
Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
🚩`@Service` – для бизнес-логики
Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
🚩`@Repository` – для работы с базой данных
Автоматически перехватывает SQL-исключения (
Ставь 👍 и забирай 📚 Базу знаний
Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.
🚩`@Component` – базовая аннотация для бина
@Component помечает класс как Spring-бин (компонент). Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
@Component
public class MyComponent {
public void doWork() {
System.out.println("Работа компонента");
}
}
🚩`@Service` – для бизнес-логики
@Service – это специализированный @Component, используемый для сервисных классов (логика приложения). Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
@Service
public class UserService {
public String getUser() {
return "Пользователь Иван";
}
}
🚩`@Repository` – для работы с базой данных
@Repository – это специализированный @Component для слоя доступа к данным (DAO, Repository). Автоматически перехватывает SQL-исключения (
PersistenceExceptionTranslationPostProcessor) и преобразует их в DataAccessException. @Repository
public class UserRepository {
public String findUserById(int id) {
return "Пользователь с ID " + id;
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какие есть виды Stream?
- Sequential Stream — последовательно обрабатывает элементы;
- Parallel Stream — использует многопоточность для ускорения обработки;
- Infinite Stream — поток без конца (например, генерация случайных чисел).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Sequential Stream — последовательно обрабатывает элементы;
- Parallel Stream — использует многопоточность для ускорения обработки;
- Infinite Stream — поток без конца (например, генерация случайных чисел).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6👍1🤔1
🤔 Как найти ошибку в программе?
Это процесс отладки (debugging), который позволяет выявить и исправить дефекты в коде. Ошибки в программе могут быть синтаксическими, логическими или связанными с выполнением программы.
1⃣Понимание ошибки
Симптомы ошибки: Программа выдает ошибочное поведение, например, неожиданный результат, исключение или сбой.
Типы ошибок:
Синтаксические: Ошибки в написании кода (например, пропущенная точка с запятой).
Логические: Код выполняется без ошибок, но результат не соответствует ожиданиям.
Ошибки выполнения: Программа завершает работу из-за исключения (например, деление на ноль).
2⃣Использование сообщений об ошибках
Компилятор/интерпретатор: Сообщает о синтаксических ошибках и указывает строку, где возникла проблема.
Стек вызовов (stack trace): Для ошибок выполнения предоставляет информацию о том, где произошла ошибка.
Пример:
3⃣Ручное исследование кода
Прочитайте проблемный участок кода и проверьте его на соответствие логике задачи.
Ищите типичные ошибки, такие как:
Неправильное использование переменных.
Ошибки в условных операторах (
Пропущенные или лишние элементы кода.
4⃣Использование инструментов отладки
Отладчик (Debugger):
Отладчики встроены в IDE, такие как IntelliJ IDEA, Eclipse или NetBeans.
Позволяют ставить точки останова (breakpoints), чтобы программа останавливалась в конкретных местах.
Позволяют пошагово выполнять код и проверять значения переменных.
Логирование (Logging):
Используйте
Пример
5⃣Тестирование
Покрытие тестами: Напишите автоматические тесты для выявления ошибки.
Используйте фреймворки, такие как JUnit или TestNG.
6⃣Анализ чужого кода
Если ошибка в сторонней библиотеке, проверьте документацию и известные проблемы. Убедитесь, что вы правильно используете методы и классы.
7⃣Рефакторинг и исправление
Исправьте ошибку, убедившись, что исправление не приводит к новым ошибкам. Проверьте весь код на предмет аналогичных ошибок.
Ставь 👍 и забирай 📚 Базу знаний
Это процесс отладки (debugging), который позволяет выявить и исправить дефекты в коде. Ошибки в программе могут быть синтаксическими, логическими или связанными с выполнением программы.
1⃣Понимание ошибки
Симптомы ошибки: Программа выдает ошибочное поведение, например, неожиданный результат, исключение или сбой.
Типы ошибок:
Синтаксические: Ошибки в написании кода (например, пропущенная точка с запятой).
Логические: Код выполняется без ошибок, но результат не соответствует ожиданиям.
Ошибки выполнения: Программа завершает работу из-за исключения (например, деление на ноль).
2⃣Использование сообщений об ошибках
Компилятор/интерпретатор: Сообщает о синтаксических ошибках и указывает строку, где возникла проблема.
Стек вызовов (stack trace): Для ошибок выполнения предоставляет информацию о том, где произошла ошибка.
Пример:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)
3⃣Ручное исследование кода
Прочитайте проблемный участок кода и проверьте его на соответствие логике задачи.
Ищите типичные ошибки, такие как:
Неправильное использование переменных.
Ошибки в условных операторах (
if, switch).Пропущенные или лишние элементы кода.
4⃣Использование инструментов отладки
Отладчик (Debugger):
Отладчики встроены в IDE, такие как IntelliJ IDEA, Eclipse или NetBeans.
Позволяют ставить точки останова (breakpoints), чтобы программа останавливалась в конкретных местах.
Позволяют пошагово выполнять код и проверять значения переменных.
Логирование (Logging):
Используйте
System.out.println для вывода промежуточных данных: System.out.println("Value of x: " + x);
Пример
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
int x = 10;
int y = 0;
try {
int result = x / y;
} catch (ArithmeticException e) {
logger.error("Division by zero!", e);
}
}
}
5⃣Тестирование
Покрытие тестами: Напишите автоматические тесты для выявления ошибки.
Используйте фреймворки, такие как JUnit или TestNG.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}
}
6⃣Анализ чужого кода
Если ошибка в сторонней библиотеке, проверьте документацию и известные проблемы. Убедитесь, что вы правильно используете методы и классы.
7⃣Рефакторинг и исправление
Исправьте ошибку, убедившись, что исправление не приводит к новым ошибкам. Проверьте весь код на предмет аналогичных ошибок.
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какой жизненный цикл Maven?
Жизненный цикл Maven состоит из стадий:
1. validate — проверка проекта.
2. compile — компиляция исходников.
3. test — запуск тестов.
4. package — упаковка (например, в .jar).
5. verify — проверка результата.
6. install — установка в локальный репозиторий.
7. deploy — публикация в удалённый репозиторий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Жизненный цикл Maven состоит из стадий:
1. validate — проверка проекта.
2. compile — компиляция исходников.
3. test — запуск тестов.
4. package — упаковка (например, в .jar).
5. verify — проверка результата.
6. install — установка в локальный репозиторий.
7. deploy — публикация в удалённый репозиторий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊6👍2🔥2
🤔 В чем разница Spring Boot и Spring?
Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.
🚩Spring Framework
Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.
🚩Spring Boot
С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.
🚩Различия
🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.
🚩Spring Framework
Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.
🚩Spring Boot
С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.
🚩Различия
🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какие виды join знаешь?
Существуют такие виды JOIN, как INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN и CROSS JOIN, каждый из которых используется для специфического метода соединения таблиц в базе данных
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4🔥1
🤔 В чем разница Spring Boot и Spring?
Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.
🚩Spring Framework
Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.
🚩Spring Boot
С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.
🚩Различия
🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.
🚩Spring Framework
Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.
🚩Spring Boot
С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.
🚩Различия
🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
🔥2👍1
🤔 Как package-private можно связать с инкапсуляцией?
Package-private (доступ по умолчанию) усиливает инкапсуляцию, так как ограничивает видимость классов и методов только рамками одного пакета. Это позволяет:
- Скрывать реализацию, но при этом предоставлять доступ к необходимым компонентам внутри пакета.
- Разделять внутреннюю логику и публичный API.
- Предотвращать ненужное использование методов извне, сохраняя принцип "минимального раскрытия".
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Скрывать реализацию, но при этом предоставлять доступ к необходимым компонентам внутри пакета.
- Разделять внутреннюю логику и публичный API.
- Предотвращать ненужное использование методов извне, сохраняя принцип "минимального раскрытия".
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🤔2
🤔 Как устроена память JVM?
JVM (Java Virtual Machine) управляет памятью приложения и делит её на несколько областей.
🟠Heap (Куча) – область для объектов
Здесь хранятся ВСЕ объекты и массивы, созданные через
Управляется Garbage Collector (GC)
🟠Stack (Стек) – область для методов и переменных
Локальные переменные (
Ссылки на объекты в
Вызовы методов (кадры стека)
🟠Metaspace – метаданные классов
Хранит информацию о загруженных классах (названия, методы, поля, байт-код).
При загрузке нового класса
В Java 8 заменил устаревший
🟠Program Counter (PC Register)
Хранит адрес текущей инструкции, выполняемой потоком.
У каждого потока свой PC Register.
Работает как указатель в машинном коде.
🟠Native Method Stack
Хранит данные, связанные с вызовами нативных методов (
Если Java вызывает C++-код, информация о вызове хранится здесь.
Ставь 👍 и забирай 📚 Базу знаний
JVM (Java Virtual Machine) управляет памятью приложения и делит её на несколько областей.
🟠Heap (Куча) – область для объектов
Здесь хранятся ВСЕ объекты и массивы, созданные через
new. Управляется Garbage Collector (GC)
🟠Stack (Стек) – область для методов и переменных
Локальные переменные (
int, double, String – если не new) Ссылки на объекты в
Heap Вызовы методов (кадры стека)
public class StackExample {
public static void main(String[] args) {
int a = 5;
int b = sum(a, 10);
}
public static int sum(int x, int y) {
return x + y;
}
}🟠Metaspace – метаданные классов
Хранит информацию о загруженных классах (названия, методы, поля, байт-код).
При загрузке нового класса
ClassLoader выделяет память в Metaspace. В Java 8 заменил устаревший
PermGen. while (true) {
ClassLoader loader = new MyClassLoader();
Class<?> clazz = loader.loadClass("MyDynamicClass");
}🟠Program Counter (PC Register)
Хранит адрес текущей инструкции, выполняемой потоком.
У каждого потока свой PC Register.
Работает как указатель в машинном коде.
🟠Native Method Stack
Хранит данные, связанные с вызовами нативных методов (
JNI – Java Native Interface). Если Java вызывает C++-код, информация о вызове хранится здесь.
public class NativeExample {
public native void callCMethod();
}Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что такое «анонимные классы», где они применяются?
Анонимные классы — это классы без имени, определённые внутри метода.
Применяются, когда:
- нужно реализовать интерфейс или абстрактный класс на месте;
- использовать в Runnable, обработчиках событий и т.п.
С Java 8 и лямбдами используются реже, но применяются в случаях, где нужен доступ к контексту.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Анонимные классы — это классы без имени, определённые внутри метода.
Применяются, когда:
- нужно реализовать интерфейс или абстрактный класс на месте;
- использовать в Runnable, обработчиках событий и т.п.
С Java 8 и лямбдами используются реже, но применяются в случаях, где нужен доступ к контексту.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Что такое функциональный интерфейс?
Функциональный интерфейс —это интерфейс, который содержит только один абстрактный метод. Это позволяет использовать лямбда-выражения для создания его анонимных реализаций, делая код более лаконичным и читаемым. Функциональные интерфейсы являются основой для лямбда-выражений и методов ссылок, начиная с версии 8.
Примером этого может служить интерфейс
Чтобы явно указать, что интерфейс предназначен для использования как функциональный, используется аннотация
Ставь 👍 и забирай 📚 Базу знаний
Функциональный интерфейс —это интерфейс, который содержит только один абстрактный метод. Это позволяет использовать лямбда-выражения для создания его анонимных реализаций, делая код более лаконичным и читаемым. Функциональные интерфейсы являются основой для лямбда-выражений и методов ссылок, начиная с версии 8.
Примером этого может служить интерфейс
java.util.function.Predicate<T> который принимает объект типа T и возвращает значение типа boolean. Вот пример использования:Predicate<String> isNotEmpty = s -> !s.isEmpty();
System.out.println(isNotEmpty.test("Hello")); // Выведет true
System.out.println(isNotEmpty.test("")); // Выведет falseЧтобы явно указать, что интерфейс предназначен для использования как функциональный, используется аннотация
@FunctionalInterface. Эта аннотация не обязательна (компилятор может определить функциональный интерфейс и без неё), но она помогает в документировании кода и обеспечивает проверку времени компиляции, гарантируя, что интерфейс содержит только один абстрактный метод.@FunctionalInterface
public interface SimpleFunction {
int apply(int value);
}
// Использование
SimpleFunction triple = value -> value * 3;
System.out.println(triple.apply(5)); // Выведет 15Ставь 👍 и забирай 📚 Базу знаний
👍2