Java | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Show more📈 Analytical overview of Telegram channel Java | Вопросы собесов
Channel Java | Вопросы собесов (@easy_java_ru) in the Russian language segment is an active participant. Currently, the community unites 11 379 subscribers, ranking 10 557 in the Technologies & Applications category and 56 197 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 11 379 subscribers.
According to the latest data from 31 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -12 over the last 30 days and by -1 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.72%. Within the first 24 hours after publication, content typically collects 5.78% reactions from the total number of subscribers.
- Post reach: On average, each post receives 993 views. Within the first day, a publication typically gains 658 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
- Thematic interests: Content is focused on key topics such as ставь, void, string, строка, static.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @easyoffer_adv”
Thanks to the high frequency of updates (latest data received on 01 September, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
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
}
Ставь 👍 и забирай 📚 Базу знаний@Component делает класс Spring-бином автоматически.
Spring сам создаст и зарегистрирует объект в контейнере.
import org.springframework.stereotype.Component;
@Component
public class Car {
public void drive() {
System.out.println("Машина едет...");
}
}
Как получить объект?
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.drive();
}
}
🚩Что такое `@Bean`?
@Bean создаёт Bean вручную в @Configuration-классе.
Можно использовать, если нужно передать параметры или создать Bean из библиотеки.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car(); // Создаём объект вручную
}
}
Как получить Bean?
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
Ставь 👍 и забирай 📚 Базу знанийsetPriority(), который принимает значение от 1 до 10:
Thread.MIN_PRIORITY (1) – минимальный приоритет
Thread.NORM_PRIORITY (5) – стандартный приоритет (по умолчанию)
Thread.MAX_PRIORITY (10) – максимальный приоритет
class MyThread extends Thread {
public MyThread(String name, int priority) {
super(name);
setPriority(priority);
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " выполняется с приоритетом " + getPriority());
}
}
}
public class Main {
public static void main(String[] args) {
MyThread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
MyThread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
low.start();
high.start();
}
}
🟠Почему `setPriority()` не даёт 100% контроль?
Приоритет – это всего лишь рекомендация для ОС.
Распределение процессорного времени зависит от планировщика ОС.
В Windows, Linux, macOS приоритеты работают по-разному, и Java не контролирует их на низком уровне.
🟠Как действительно заставить поток выполниться первым?
Реальные способы управления порядком выполнения:
а) Использование join()
Позволяет дождаться выполнения одного потока перед запуском другого.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
Thread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
high.start();
high.join(); // Ждём, пока high завершится
low.start(); // Теперь запускается low
}
}
б) Использование Executors.newSingleThreadExecutor()
Позволяет гарантированно выполнять потоки по очереди.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> System.out.println("Задача 1"));
executor.submit(() -> System.out.println("Задача 2"));
executor.shutdown();
}
}
Ставь 👍 и забирай 📚 Базу знанийString message = "Hello";
String newMessage = message.replace("H", "J");
System.out.println(message); // Hello
System.out.println(newMessage); // Jello
🟠Отсутствие неожиданных изменений (безопасность данных)
Если объект неизменяемый, его нельзя случайно изменить.
class BankAccount {
private final String accountNumber;
public BankAccount(String accountNumber) {
this.accountNumber = accountNumber;
}
public String getAccountNumber() {
return accountNumber;
}
}
🟠Упрощает отладку и поддержку кода
Изменяемые объекты могут менять состояние в неожиданный момент.
List<String> list = new ArrayList<>();
list.add("Java");
modifyList(list); // Метод может изменить список!
System.out.println(list); // Ожидаем ["Java"], но может быть что угодно!
🟠Можно использовать в качестве ключей в `HashMap` и `HashSet`
Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в HashMap.
Map<String, String> map = new HashMap<>();
map.put("key", "value");
System.out.println(map.get("key")); // Всегда "value", так как String неизменяемый
🟠Совместимость с кэшем (например, в Hibernate, Spring)
Неизменяемые объекты можно безопасно кешировать, так как они не меняются.
🚩Как создать неизменяемый класс?
Все поля private final.
Нет сеттеров.
Если есть массивы или списки – копируем их перед возвратом.
final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Ставь 👍 и забирай 📚 Базу знаний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
}
}
Ставь 👍 и забирай 📚 Базу знаний