Java | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Java | Вопросы собесов
تُعد قناة Java | Вопросы собесов (@easy_java_ru) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 11 297 مشتركاً، محتلاً المرتبة 10 944 في فئة التكنولوجيات والتطبيقات والمرتبة 56 601 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 11 297 مشتركاً.
بحسب آخر البيانات بتاريخ 31 أكتوبر, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -40، وفي آخر 24 ساعة بمقدار -8، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 9.99%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 5.84% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 1 129 مشاهدة. وخلال اليوم الأول يجمع عادةً 660 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 6.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل ставь, void, string, строка, static.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 01 نوفمبر, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
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 (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний👋 Меня зовут Николай, я — техлид в крупном банке Провел более 120 собеседований разработчиков уровня middle+, онбордил 10 специалистов в разных командах И обратил внимание на нехватку экспертизы большинства разработчиков в одних и тех же ключевых технологиях: Spring, PostgreSQL, Kafka, многопоточность, микросервисы, - что приводит их к отказам на собеседованиях и сокращениям на работе На текущий момент, когда рынок на спаде, мне продолжают писать HR’ы по 3 раза в неделю с предложениями вакансий, что говорит о высокой потребности рынка в сильных специалистах Каждый месяц я прохожу собеседования и получаю офферы в крупнейшие компании: Яндекс, Альфу, Тинькофф, Сбер и др. Благодаря чему остаюсь в курсе потребностей рынка, знаю какие вопросы задают и как правильно на них отвечать, чтобы получить заветный оффер 📌 Более года занимаюсь менторингом: — действующих Java разработчиков, кто хочет повысить свою квалификацию — начинающих разработчиков и специалистов смежных специальностей (тестировщиков, аналитиков, специалистов сопровождения), кто имеет опыт самостоятельного обучения и хочет получить реальную практику ⚠️ Людей совсем без опыта не беру На менторинге: - показываю, каким образом ведется разработка реального проекта, провожу ревью вашего кода - расставляю приоритеты в обучении - готовлю к собеседованиям и помогаю составить резюме По окончании курса мы с вами напишем 3 микросервиса и 1 библиотеку (spring boot starter), которые могут вам встретится в реальной работе и станут частью вашего резюме С июня 2024 года обучение прошли 40 учеников, из которых: — 13 человек получили офферы на 100-470 тыс. рублей в месяц — 9 вышли на рынок и находятся в поиске работы — 18 человек остались на тех же местах, кто-то получил повышение, кто-то готовиться к выходу на рынок С некоторыми результатами, отзывами и офферами моих учеников можно ознакомиться по ссылке На потоке вас ждет 35 часов лекций и 30 часов живого разбора вопросов. Кроме того, вы получите доступ к вопросам, которые задавали мне и моим ученикам на реальных собеседованиях Четвертый поток начинается 15 июля, если хотите участвовать — заполните анкету и я с вами свяжусь Блог в телеграм
OldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V).
Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}
Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}
Адаптер, который превращает 220V в 5V
class ChargerAdapter implements USBCharger {
private OldCharger oldCharger;
public ChargerAdapter(OldCharger oldCharger) {
this.oldCharger = oldCharger;
}
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
oldCharger.charge220V();
}
}
Использование адаптера
public class Main {
public static void main(String[] args) {
OldCharger oldCharger = new OldCharger();
USBCharger adapter = new ChargerAdapter(oldCharger);
adapter.charge5V(); // Теперь старая зарядка работает с 5V!
}
}
Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (extends).
class ChargerAdapter extends OldCharger implements USBCharger {
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
charge220V();
}
}
Ставь 👍 и забирай 📚 Базу знанийObject, поэтому эти методы важны для любой программы.
class Person {
String name;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
🟠Важные методы `String` (работа со строками)
Строки в Java неизменяемы, поэтому методы создают новые объекты.
String text = " Hello, Java! ";
System.out.println(text.trim().toUpperCase()); // "HELLO, JAVA!"
Важные методы List, Set, Map (коллекции)
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
System.out.println(names.get(0)); // Alice
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Alice");
System.out.println(uniqueNames.size()); // 1 (дубликат не добавился)
🚩Методы `Map` (HashMap, TreeMap)
Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
System.out.println(ages.get("Alice")); // 25
Stream API позволяет работать с данными декларативно.
List<String> names = List.of("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);
Ставь 👍 и забирай 📚 Базу знаний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());
}
}
}
Ставь 👍 и забирай 📚 Базу знанийintern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.
🚩Как работает `intern()`?
Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");
System.out.println(s1 == s2); // false (разные объекты)
С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();
System.out.println(s1 == s2); // true (одна строка в String Pool)
🚩Что такое `String Pool`?
Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект
System.out.println(s1 == s2); // true
🚩Когда использовать `intern()`?
Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}
Ставь 👍 и забирай 📚 Базу знанийdouble, int, long) без возврата результата.
🚩`ObjDoubleConsumer<T>` – принимает объект + `double`
Используется, когда надо обработать объект + double, но ничего не возвращать.
import java.util.function.ObjDoubleConsumer;
class User {
String name;
double discount;
User(String name) {
this.name = name;
}
void setDiscount(double discount) {
this.discount = discount;
}
}
public class Main {
public static void main(String[] args) {
ObjDoubleConsumer<User> applyDiscount = (user, discount) -> user.setDiscount(discount);
User user = new User("Иван");
applyDiscount.accept(user, 10.5); // Применяем скидку
System.out.println(user.name + " получил скидку " + user.discount + "%");
// Иван получил скидку 10.5%
}
}
🚩`ObjIntConsumer<T>` – принимает объект + `int`
Используется, когда нужно обработать объект и int, но без возврата результата.
import java.util.function.ObjIntConsumer;
class Person {
String name;
int age;
Person(String name) {
this.name = name;
}
void setAge(int age) {
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
ObjIntConsumer<Person> setPersonAge = (person, age) -> person.setAge(age);
Person person = new Person("Анна");
setPersonAge.accept(person, 30); // Устанавливаем возраст
System.out.println(person.name + " теперь " + person.age + " лет");
// Анна теперь 30 лет
}
}
🚩`ObjLongConsumer<T>` – принимает объект + `long`
Используется, когда нужно передать объект + long (например, ID, время) без возврата.
import java.util.function.ObjLongConsumer;
class Account {
String username;
long id;
Account(String username) {
this.username = username;
}
void setId(long id) {
this.id = id;
}
}
public class Main {
public static void main(String[] args) {
ObjLongConsumer<Account> setAccountId = (account, id) -> account.setId(id);
Account account = new Account("user123");
setAccountId.accept(account, 100000L); // Присваиваем ID
System.out.println("Аккаунт " + account.username + " имеет ID " + account.id);
// Аккаунт user123 имеет ID 100000
}
}
Ставь 👍 и забирай 📚 Базу знаний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
...
Ставь 👍 и забирай 📚 Базу знаний