Easy Java
5.22K subscribers
311 photos
51 videos
463 links
Лучшие обучающие материалы и другие полезности для Java-разработчиков.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Download Telegram
Ответ:
Anonymous Quiz
11%
1
3%
2
79%
3
6%
4
👩‍💻 Что такое ключевое слово volatile в Java и зачем оно нужно?

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

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


• Обеспечивает видимость изменений между потоками
• Упрощает синхронизацию для простых случаев
• Избегает лишних блокировок

⚡️ Пример:

public class Main {
private static volatile boolean running = true;

public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (running) {
// Выполняем работу, пока running == true
}
System.out.println("Поток завершён");
});

worker.start();
Thread.sleep(1000);
running = false; // другой поток увидит это изменение
}
}


👀 volatile особенно полезен для сигналов завершения, управления флагами и других случаев, где нужна простая синхронизация без полной блокировки.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Please open Telegram to view this post
VIEW IN TELEGRAM
Не та судьба

➡️ Easy Java | #Мемы
Please open Telegram to view this post
VIEW IN TELEGRAM
😭26😁85
Вопрос с собеса

Что означает ключевое слово final для переменных и параметров в Java?

Пример🔽
public class Main {
public static void main(String[] args) {
final int x = 10;
// x = 20; // Ошибка компиляции

printName("Alice");
}

static void printName(final String name) {
// name = "Bob"; // Ошибка: нельзя переназначить final-параметр
System.out.println("Имя: " + name);
}
}


Ответ🔽
final означает, что переменная не может быть переназначена после инициализации. Это касается локальных переменных, параметров метода и полей класса.

📌 final не делает объект неизменяемым, а лишь защищает ссылку от повторного присваивания. Сам объект по-прежнему может меняться, если он мутируемый


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
8%
1
5%
2
78%
3
9%
4
4
👩‍💻 Что такое ThreadLocal в Java и зачем он нужен?

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

Это удобно, когда нужно избежать синхронизации, но при этом обеспечить потокобезопасность — например, при работе с форматированием дат, сессиями или кэшами в потоках.


• У каждого потока своё значение
• Избавляет от использования synchronized
• Удобен в многопоточном программировании и фреймворках

⚡️ Пример:

public class Main {
private static final ThreadLocal<Integer> threadId = ThreadLocal.withInitial(() -> (int) (Math.random() * 1000));

public static void main(String[] args) {
Runnable task = () -> System.out.println("ID потока: " + threadId.get());

new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}


👀 ThreadLocal особенно полезен в веб-приложениях, логгерах, и при реализации механизма хранения "контекста" внутри каждого потока — например, RequestContext, SecurityContext, TransactionContext.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Вопрос с собеса

Почему важно переопределять equals() вместе с hashCode() в Java?

Пример🔽
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class User {
String name;

User(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User user)) return false;
return Objects.equals(name, user.name);
}

// hashCode не переопределён!
}

public class Main {
public static void main(String[] args) {
Set<User> users = new HashSet<>();
users.add(new User("Alice"));
System.out.println(users.contains(new User("Alice"))); // ➔ false
}
}


Ответ🔽
Если переопределить equals() без hashCode(), коллекции вроде HashSet, HashMap будут работать некорректно, потому что объект может попасть в неправильный "бакет". Даже если equals() вернёт true, hashCode() может быть разным — и объект не найдётся.

📌 Контракт: если два объекта равны по equals(), они обязаны иметь одинаковый hashCode().


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
7%
1
7%
2
79%
3
7%
4
3
👩‍💻 Что такое SoftReference в Java и зачем она нужна?

SoftReference — это тип ссылки, который позволяет объекту быть удалённым сборщиком мусора, если в системе заканчивается память, но до тех пор он остаётся доступным. Это полезно для построения умных кэшей, которые не мешают работе JVM.

В отличие от обычной ссылки, SoftReference не мешает сбору мусора, и в отличие от WeakReference, она удаляется только при нехватке памяти.


• Идеальна для кэширования больших объектов
• Помогает избежать OutOfMemoryError
• Учитывает приоритет: сначала удаляются weak, потом soft

⚡️ Пример:

import java.lang.ref.SoftReference;

public class Main {
public static void main(String[] args) {
SoftReference<byte[]> cache = new SoftReference<>(new byte[10 * 1024 * 1024]); // 10MB

byte[] data = cache.get();
if (data != null) {
System.out.println("Кэш доступен");
} else {
System.out.println("Кэш удалён сборщиком мусора");
}
}
}


👀 SoftReference особенно полезна в ситуациях, где нужно хранить тяжёлые объекты (например, образы, данные из БД или сжатие), но не жертвовать стабильностью приложения при нехватке памяти.


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😭12
Вопрос с собеса

В каком порядке вызываются конструкторы при наследовании в Java?

Пример🔽
class Parent {
Parent() {
System.out.println("Конструктор родителя");
}
}

class Child extends Parent {
Child() {
System.out.println("Конструктор потомка");
}
}

public class Main {
public static void main(String[] args) {
new Child();
}
}


Ответ🔽
При создании объекта дочернего класса сначала вызывается конструктор родителя, а затем — конструкция потомка. Это гарантирует, что базовая часть объекта будет инициализирована до расширений.

📌 Даже если в конструкторе дочернего класса нет явного вызова super(), он вставляется компилятором автоматически


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83