Java | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Больше📈 Аналитический обзор Telegram-канала Java | Вопросы собесов
Канал Java | Вопросы собесов (@easy_java_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 379 подписчиков, занимая 10 620 место в категории Технологии и приложения и 56 532 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 379 подписчиков.
Согласно последним данным от 01 сентября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -19, а за последние 24 часа — -7, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 8.68%. В первые 24 часа после публикации контент обычно набирает 5.78% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 988 просмотров. В течение первых суток публикация набирает 658 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, void, string, строка, static.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @easyoffer_adv”
Благодаря высокой частоте обновлений (последние данные получены 02 сентября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
equals() и hashCode(), важно соблюдать контракт, иначе объект может вести себя некорректно в коллекциях (HashMap, HashSet и др.).
🚩Контракт `equals()`
Метод equals() определяет, когда два объекта равны.
Рефлексивность – x.equals(x) всегда true.
Симметричность – x.equals(y) == y.equals(x).
Транзитивность – если x.equals(y) и y.equals(z), то x.equals(z).
Согласованность – многократные вызовы x.equals(y) дают один и тот же результат.
Сравнение с null всегда false – x.equals(null) == false.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // Проверка на одинаковые ссылки
if (obj == null || getClass() != obj.getClass()) return false; // Проверка типа
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // Сравнение полей
}
}
🚩Контракт `hashCode()`
Метод hashCode() возвращает числовой хеш-код объекта. Он должен соответствовать equals()!
Если x.equals(y) == true, то x.hashCode() == y.hashCode().
Если x.hashCode() != y.hashCode(), то x.equals(y) == false (но обратное не всегда верно).
Хеш-код должен оставаться неизменным, если объект не изменяется.
@Override
public int hashCode() {
return Objects.hash(name, age);
}
🚩Почему контракт `equals()` и `hashCode()` важен?
В коллекциях, таких как HashSet, HashMap, HashTable, объекты хранятся по хеш-коду.
Что будет, если equals() переопределён, но hashCode() – нет?
Set<Person> people = new HashSet<>();
people.add(new Person("Иван", 25));
people.add(new Person("Иван", 25)); // Ожидаем, что не добавится
System.out.println(people.size()); // ❌ Будет 2, а не 1, если `hashCode()` отсутствует!
Правильный вариант (equals() + hashCode())
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Ставь 👍 и забирай 📚 Базу знаний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 для защиты веб-приложений.
Ставь 👍 и забирай 📚 Базу знанийclass UserRepositoryStub implements UserRepository {
@Override
public User findById(Long id) {
return new User(id, "Иван"); // Просто возвращает статичные данные
}
}
🚩Mock (Макет)
Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.).
UserRepository userRepository = mock(UserRepository.class);
when(userRepository.findById(1L)).thenReturn(new User(1L, "Иван"));
User user = userRepository.findById(1L);
verify(userRepository, times(1)).findById(1L); // Проверяем, что метод был вызван 1 раз
Ставь 👍 и забирай 📚 Базу знанийRandomAccess, потому что он работает с потоком данных, а не с индексированными структурами.
🚩Почему Stream API не поддерживает `RandomAccess`?
🟠Stream – это поток данных
который не обязательно хранится в памяти в виде структуры, поддерживающей случайный доступ.
🟠Нет индексов
в отличие от List, Stream не позволяет получить элемент по индексу (get(index) отсутствует).
🟠Обход последовательный
элементы проходятся один за другим, что делает случайный доступ невозможным.
List (с RandomAccess)
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
System.out.println(list.get(2)); // Быстрое получение элемента по индексу
Stream (без RandomAccess)
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.skip(2).findFirst().ifPresent(System.out::println); // Ищем 3-й элемент
Ставь 👍 и забирай 📚 Базу знаний