Java | Вопросы собесов
11.3K subscribers
37 photos
3 videos
1.63K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Какие есть методы HTTP-запросов?

- GET — получение данных;
- POST — создание ресурса;
- PUT — полное обновление ресурса;
- PATCH — частичное обновление;
- DELETE — удаление;
- HEAD, OPTIONS, TRACE — вспомогательные методы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8💊1
🤔 Как бороться в БД с SQL Injection?

SQL Injection – это атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, чтобы получить несанкционированный доступ к данным.

Допустим, у нас есть код
String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";


Если злоумышленник введёт ' OR '1'='1 в поле пароля, запрос превратится в:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'


🚩Способы защиты от SQL Injection

🟠Использование `PreparedStatement` (РЕКОМЕНДУЕТСЯ)
Подготовленные запросы автоматически экранируют входные данные, предотвращая SQL-инъекции.
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();


🟠Использование ORM (например, Hibernate)
ORM-фреймворки (Hibernate, JPA) автоматически генерируют безопасные SQL-запросы.
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.username = :username AND u.password = :password", User.class);
query.setParameter("username", username);
query.setParameter("password", password);
User user = query.getSingleResult();


🟠Проверка и экранирование входных данных
Если по какой-то причине PreparedStatement использовать нельзя, экранируйте опасные символы (', " и ;).
String safeInput = input.replace("'", "\\'");


🟠Минимизация прав в БД
Создавайте отдельного пользователя БД с ограниченными правами:
Запрет на DROP, DELETE, UPDATE без WHERE
Только доступ к нужным таблицам
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'securepassword';
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'app_user'@'localhost';


🟠Использование Web Application Firewall (WAF)
WAF анализирует HTTP-запросы и блокирует подозрительные SQL-запросы. Пример: ModSecurity – популярный WAF для защиты веб-приложений.

Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Как подключить свою библиотеку в другом проекте?

Для подключения своей библиотеки:
- собрать её в JAR;
- опубликовать в локальный или удалённый репозиторий (например, Maven Central, Nexus, Artifactory);
- добавить зависимость в pom.xml или build.gradle другого проекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1
🤔 Что такое синхронизация и зачем она нужна?

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

🚩Зачем она нужна

🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.

🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.

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

🚩Как она реализуется

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

🟠Явные блокировки с использованием классов из пакета java.util.concurrent.locks
Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.

🟠Волатильные переменные (volatile)
Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.

Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое временная сложность?

Временная сложность — это оценка времени выполнения алгоритма в зависимости от размера входных данных. Измеряется через нотацию O(...) и помогает сравнивать эффективность алгоритмов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Что такое Appender в log4j?

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

🚩Зачем нужен Appender?

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

🚩Основные виды Appender в Log4j

🟠ConsoleAppender
Логи выводятся в консоль.
Полезно для разработки и отладки.

     <Appender type="Console" name="ConsoleAppender">
<Target>System.out</Target>
</Appender>


🟠FileAppender
Логи записываются в файл.
Используется для длительного хранения логов.

     <Appender type="File" name="FileAppender">
<FileName>logs/app.log</FileName>
<Append>true</Append>
</Appender>


🟠RollingFileAppender
Расширение FileAppender с возможностью ротации логов (ограничение размера файла, создание новых файлов при переполнении).

     <Appender type="RollingFile" name="RollingFileAppender">
<FileName>logs/app.log</FileName>
<FilePattern>logs/app-%d{yyyy-MM-dd}.log</FilePattern>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
</Appender>


🟠DailyRollingFileAppender
Логи записываются в файл, который ротационно создаётся каждый день.

     <Appender type="DailyRollingFile" name="DailyRollingAppender">
<FileName>logs/app.log</FileName>
<DatePattern>.yyyy-MM-dd</DatePattern>
</Appender>


🟠SocketAppender
Отправляет логи через сеть (TCP или UDP).
Используется для централизованного логирования.

🟠JDBCAppender
Записывает логи в базу данных.

     <Appender type="JDBC" name="JDBCAppender">
<ConnectionSource>
<DriverManagerConnectionSource>
<DriverClass>org.h2.Driver</DriverClass>
<Url>jdbc:h2:mem:logdb</Url>
<User>sa</User>
</DriverManagerConnectionSource>
</ConnectionSource>
<TableName>log_table</TableName>
</Appender>


🚩Конфигурация Appender в log4j2

Вот пример конфигурации с использованием нескольких Appender
XML-конфигурация
<Configuration>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</Console>
<File name="FileAppender" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>


Java-конфигурация
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);

public static void main(String[] args) {
logger.info("This is an info log");
logger.error("This is an error log");
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍3🔥2
🤔 В каких состояниях может находиться поток?

Поток может находиться в следующих состояниях:
- NEW — создан, но ещё не запущен;
- RUNNABLE — выполняется или готов к выполнению;
- BLOCKED — ожидает освобождения монитора;
- WAITING — ожидает уведомления другого потока;
- TIMED_WAITING — ожидает уведомления в течение ограниченного времени;
- TERMINATED — завершён.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое сигнатура?

Сигнатура метода – это его уникальная идентификация в классе. Она включает:
Имя метода
Список параметров (их типы и порядок)
class Example {
void print(String text) {} // Сигнатура: print(String)
void print(int number) {} // Сигнатура: print(int)
int print(String text, int number) { return 0; } // Сигнатура: print(String, int)
}


🚩Почему сигнатура важна?

🟠Перегрузка методов (Method Overloading)
В одном классе можно создавать методы с одинаковыми именами, но разными сигнатурами.
class MathUtils {
int sum(int a, int b) { return a + b; } // sum(int, int)
double sum(double a, double b) { return a + b; } // sum(double, double)
}


🟠Переопределение методов (Method Overriding)
При переопределении метода (в наследовании) сигнатура ДОЛЖНА быть такой же.
class Parent {
void show() {} // Сигнатура: show()
}

class Child extends Parent {
@Override
void show() {} // ✅ Сигнатура совпадает, корректное переопределение
}


🚩Ошибки, связанные с сигнатурой

Ошибка: Возвращаемый тип НЕ влияет на сигнатуру
class Test {
int method(int x) { return x; }
double method(int x) { return x; } // Ошибка! Сигнатура совпадает
}


Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что необходимо для того чтобы клонировать один объект в другой?

Для клонирования объекта нужно предусмотреть возможность копирования его состояния. Это может быть реализовано через поддержку специального механизма клонирования, который создаёт копию объекта. Клонирование может быть поверхностным (копируются только ссылки) или глубоким (копируются и вложенные объекты). Также важно учитывать, реализует ли класс необходимые соглашения для клонирования, чтобы обеспечить корректную работу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Какие шаги нужно выполнить для прочтения текстового файла?

Для прочтения текстового файла в Java нужно выполнить несколько шагов.

1⃣Выбор метода чтения файла
В Java есть несколько способов читать текстовые файлы:
1. Использование класса FileReader.
2. Использование BufferedReader для построчного чтения.
3. Использование java.nio.file.Files для чтения всех строк файла.
4. Применение Scanner для гибкого чтения данных.

2⃣Открытие файла
Нужно указать путь к файлу (абсолютный или относительный) и передать его в выбранный класс. Например:
FileReader reader = new FileReader("file.txt");


3⃣Чтение данных
Выберите подходящий метод для обработки содержимого файла:
- Построчное чтение.
- Чтение символов.
- Чтение всех строк сразу (например, через Files.readAllLines).

4⃣Закрытие ресурса
Для освобождения системных ресурсов после работы с файлом нужно закрыть поток. Это делается вручную или с помощью конструкции try-with-resources.

🚩Примеры реализации

Построчное чтение с BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // Вывод строки
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение файла с помощью Files
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class FileReadExample {
public static void main(String[] args) {
try {
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение через Scanner
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReadExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("file.txt"))) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine()); // Построчное чтение
}
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
}
}


Ставь 👍 и забирай 📚 Базу знаний