🤔 Может ли Entity-класс быть абстрактным?
Да, Entity может быть абстрактным, если он служит базой для наследников. Он не будет напрямую мапиться в таблицу, но может содержать общие поля и логику.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, Entity может быть абстрактным, если он служит базой для наследников. Он не будет напрямую мапиться в таблицу, но может содержать общие поля и логику.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥2🤔1💊1
🤔 Что такое поток "демон"?
Демон-поток — это поток, который:
- Работает на фоне (например, сборщик мусора).
- Завершается автоматически, когда все обычные (non-daemon) потоки завершены.
- Устанавливается через setDaemon(true) до старта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Демон-поток — это поток, который:
- Работает на фоне (например, сборщик мусора).
- Завершается автоматически, когда все обычные (non-daemon) потоки завершены.
- Устанавливается через setDaemon(true) до старта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥3
🤔 В чём различие между LeftJoin , RightJoin и InnerJoin?
LEFT JOIN, RIGHT JOIN и INNER JOIN являются операциями соединения таблиц, каждая из которых используется для объединения строк из двух или более таблиц на основе связанных столбцов между ними. Различие между этими типами соединений заключается в том, какие строки выбираются для включения в результаты запроса.
🚩INNER JOIN
Возвращает только те строки, которые имеют соответствующие значения в обеих таблицах. Если совпадение не найдено, строки не включаются в результаты. Это наиболее часто используемый тип соединения, так как он обеспечивает строгое соответствие между таблицами.
🚩LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы (
🚩RIGHT JOIN (или RIGHT OUTER JOIN)
Работает аналогично
Ставь 👍 и забирай 📚 Базу знаний
LEFT JOIN, RIGHT JOIN и INNER JOIN являются операциями соединения таблиц, каждая из которых используется для объединения строк из двух или более таблиц на основе связанных столбцов между ними. Различие между этими типами соединений заключается в том, какие строки выбираются для включения в результаты запроса.
🚩INNER JOIN
Возвращает только те строки, которые имеют соответствующие значения в обеих таблицах. Если совпадение не найдено, строки не включаются в результаты. Это наиболее часто используемый тип соединения, так как он обеспечивает строгое соответствие между таблицами.
🚩LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы (
ТаблицаA), а также соответствующие строки из правой таблицы (ТаблицаB). Если совпадение в правой таблице не найдено, результат будет содержать NULL на месте столбцов правой таблицы.🚩RIGHT JOIN (или RIGHT OUTER JOIN)
Работает аналогично
LEFT JOIN, но возвращает все строки из правой таблицы (ТаблицаB), а также соответствующие строки из левой таблицы (ТаблицаA). Если совпадение в левой таблице не найдено, результат будет содержать NULL на месте столбцов левой таблицы.INNER JOIN используется для получения строк с совпадениями в обеих таблицах.LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы; если соответствий нет, вместо столбцов правой таблицы будут NULL.RIGHT JOIN возвращает все строки из правой таблицы и соответствующие строки из левой таблицы; если соответствий нет, вместо столбцов левой таблицы будут NULL.Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое «HTML»?
HTML (HyperText Markup Language) — это язык разметки, используемый для создания структуры веб-страниц, включая текст, изображения, ссылки и другие элементы контента.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
HTML (HyperText Markup Language) — это язык разметки, используемый для создания структуры веб-страниц, включая текст, изображения, ссылки и другие элементы контента.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥2
🤔 На основании какой структуры данных реализован ArrayList?
ArrayList реализован на базе обычного массива. Этот массив:
- динамически увеличивает размер при переполнении;
- предоставляет быстрый доступ по индексу (O(1));
- но медленно работает при вставке и удалении не с конца (O(n)), так как требует сдвига элементов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
ArrayList реализован на базе обычного массива. Этот массив:
- динамически увеличивает размер при переполнении;
- предоставляет быстрый доступ по индексу (O(1));
- но медленно работает при вставке и удалении не с конца (O(n)), так как требует сдвига элементов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍10
🤔 Чем отличается where от having ?
WHERE и HAVING используются для фильтрации записей, но они применяются на разных этапах выполнения запроса и имеют разные цели.
🚩WHERE
Применяется до агрегации данных. Это значит, что фильтрация происходит непосредственно на строках исходной таблицы или результата объединения таблиц, до того как произойдет любая операция группировки (
Используется для фильтрации строк, которые будут включены в результаты группировки или в финальный набор данных, если группировка не используется.
Не может использоваться для фильтрации агрегированных значений.
🚩HAVING
Применяется после агрегации данных. Это означает, что фильтрация происходит уже на агрегированных результатах, полученных после применения
Используется для фильтрации групп в результате запроса с группировкой.
Может использоваться только с
Ставь 👍 и забирай 📚 Базу знаний
WHERE и HAVING используются для фильтрации записей, но они применяются на разных этапах выполнения запроса и имеют разные цели.
🚩WHERE
Применяется до агрегации данных. Это значит, что фильтрация происходит непосредственно на строках исходной таблицы или результата объединения таблиц, до того как произойдет любая операция группировки (
GROUP BY) или агрегирования (SUM, COUNT, AVG и т.д.).Используется для фильтрации строк, которые будут включены в результаты группировки или в финальный набор данных, если группировка не используется.
Не может использоваться для фильтрации агрегированных значений.
SELECT employee_id, SUM(salary)
FROM salaries
WHERE salary > 1000
GROUP BY employee_id;
🚩HAVING
Применяется после агрегации данных. Это означает, что фильтрация происходит уже на агрегированных результатах, полученных после применения
GROUP BY и агрегатных функций.Используется для фильтрации групп в результате запроса с группировкой.
Может использоваться только с
GROUP BY или для фильтрации результатов, полученных с помощью агрегатных функций.SELECT employee_id, SUM(salary)
FROM salaries
GROUP BY employee_id
HAVING SUM(salary) > 10000;
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Какой класс позволяет читать данные из входного байтового потока в формате примитивных типов данных?
- Класс DataInputStream позволяет читать int, float, boolean, long и другие типы прямо из потока.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Класс DataInputStream позволяет читать int, float, boolean, long и другие типы прямо из потока.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6
🤔 Как остановить поток?
Остановить поток в Java можно несколькими способами, но важно помнить, что принудительная остановка потока – плохая практика. Java предлагает безопасные методы управления потоком, чтобы избежать неожиданных ошибок и некорректного поведения программы.
🚩Плохие способы (НЕ рекомендуется)
Раньше использовался метод
🚩Флаг завершения работы (рекомендуемый способ)
Самый безопасный способ – это использование флага (
🚩Прерывание потока (`interrupt()`)
Этот способ удобен для потоков, которые ждут (
Ставь 👍 и забирай 📚 Базу знаний
Остановить поток в Java можно несколькими способами, но важно помнить, что принудительная остановка потока – плохая практика. Java предлагает безопасные методы управления потоком, чтобы избежать неожиданных ошибок и некорректного поведения программы.
🚩Плохие способы (НЕ рекомендуется)
Раньше использовался метод
Thread.stop(), но он был устаревшим и удалённым из-за того, что мог оставить программу в неконсистентном состоянии. Thread thread = new Thread(() -> {
while (true) {
System.out.println("Работаю...");
}
});
thread.start();
thread.stop(); // ОПАСНО! Может привести к некорректному завершению работы.🚩Флаг завершения работы (рекомендуемый способ)
Самый безопасный способ – это использование флага (
volatile boolean). class MyTask implements Runnable {
private volatile boolean running = true;
public void run() {
while (running) {
System.out.println("Работаю...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Важно восстанавливать флаг прерывания
}
}
System.out.println("Поток остановлен.");
}
public void stop() {
running = false;
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
Thread.sleep(2000);
task.stop(); // Корректно останавливаем поток
}
}🚩Прерывание потока (`interrupt()`)
Этот способ удобен для потоков, которые ждут (
sleep(), wait(), join()), потому что прерывание выбрасывает InterruptedException. class MyTask implements Runnable {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Работаю...");
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Поток прерван.");
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new MyTask());
thread.start();
Thread.sleep(2000);
thread.interrupt(); // Прерывание потока
}
}Ставь 👍 и забирай 📚 Базу знаний
👍8
🤔 Жизненный цикл сервлетов?
1. Загрузка и инициализация (init);
2. Обработка запроса (service);
3. Уничтожение (destroy); Сервлет создаётся один раз и обрабатывает множество запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Загрузка и инициализация (init);
2. Обработка запроса (service);
3. Уничтожение (destroy); Сервлет создаётся один раз и обрабатывает множество запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Что за исключение Interrupted Exception?
🚩Почему `InterruptedException` существует?
В многопоточной среде иногда требуется прервать выполнение потока, например, для завершения долгой задачи или для корректной остановки программы. Вместо грубого завершения потока (
🚩Когда выбрасывается `InterruptedException`?
Это исключение выбрасывается, если поток:
1. Ожидает (
2. Спит (
3. Блокируется на очереди (
И при этом его прерывают с помощью метода
Пример кода: обработка
Вывод программы
🚩Что делать после `InterruptedException`?
1. Просто обработать исключение (как в примере выше).
2. Передать исключение дальше — например, если метод не может корректно обработать прерывание, он передает его вызывающему коду:
🟠Восстановить флаг прерывания
если прерывание важно для логики программы:
Ставь 👍 и забирай 📚 Базу знаний
InterruptedException — это проверяемое исключение (checked exception) в Java, которое выбрасывается, когда поток (Thread) прерывается во время выполнения метода, который поддерживает прерывание (например, sleep(), wait(), join() и др.). 🚩Почему `InterruptedException` существует?
В многопоточной среде иногда требуется прервать выполнение потока, например, для завершения долгой задачи или для корректной остановки программы. Вместо грубого завершения потока (
Thread.stop(), который устарел и считается небезопасным) Java предлагает мягкий способ прерывания через флаг прерывания и обработку InterruptedException.🚩Когда выбрасывается `InterruptedException`?
Это исключение выбрасывается, если поток:
1. Ожидает (
wait(), join()) 2. Спит (
sleep()) 3. Блокируется на очереди (
BlockingQueue.take(), LockSupport.park()) И при этом его прерывают с помощью метода
interrupt().Пример кода: обработка
InterruptedException class MyThread extends Thread {
public void run() {
try {
System.out.println("Поток засыпает...");
Thread.sleep(5000); // Поток засыпает на 5 секунд
} catch (InterruptedException e) {
System.out.println("Поток был прерван во время сна!");
}
System.out.println("Поток продолжает работу...");
}
}
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
try {
Thread.sleep(2000); // Даем потоку 2 секунды поработать
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt(); // Прерываем поток
}
}Вывод программы
Поток засыпает...
Поток был прерван во время сна!
Поток продолжает работу...
🚩Что делать после `InterruptedException`?
1. Просто обработать исключение (как в примере выше).
2. Передать исключение дальше — например, если метод не может корректно обработать прерывание, он передает его вызывающему коду:
void myMethod() throws InterruptedException {
Thread.sleep(1000); // Может выбросить исключение
}🟠Восстановить флаг прерывания
если прерывание важно для логики программы:
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Восстанавливаем флаг прерывания
}Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Так ли хороша синхронизация при помощи synchronized?
Плюсы:
- просто и понятно;
- встроена в язык;
- достаточно для большинства задач.
Минусы:
- может вызывать блокировки и снижать производительность;
- нет гибкости (нельзя легко попытаться захватить, или сделать timeout);
- не масштабируется на сложные сценарии.
Для сложных кейсов лучше использовать Lock.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Плюсы:
- просто и понятно;
- встроена в язык;
- достаточно для большинства задач.
Минусы:
- может вызывать блокировки и снижать производительность;
- нет гибкости (нельзя легко попытаться захватить, или сделать timeout);
- не масштабируется на сложные сценарии.
Для сложных кейсов лучше использовать Lock.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2