Easy Java
رفتن به کانال در Telegram
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
نمایش بیشتر5 221
مشترکین
-424 ساعت
-217 روز
-9030 روز
آرشیو پست ها
5 221
👩💻 Викторина: что выведет код?
public class Main {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
private static InheritableThreadLocal<String> inheritable = new InheritableThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("main");
inheritable.set("main");
Thread child = new Thread(() -> {
System.out.print(threadLocal.get() + " ");
System.out.print(inheritable.get() + " ");
inheritable.set("child");
Thread grandChild = new Thread(() -> {
System.out.print(inheritable.get());
});
grandChild.start();
try { grandChild.join(); } catch (Exception e) {}
});
child.start();
}
}
➡️ Easy Java | #Викторина5 221
👩💻 Марафон на GitHub: Java за 30 дней
Пошаговое руководство по изучению языка программирования JavaScript за 30 дней, подойдет преимущественно для новичков. Несмотря на свое название, курс может занять более 100 дней, однако, все зависит только от вас.
В курсе темы поделены по дням начиная с самой базы и заканчивая визуализацией и анимацией.
⛓ Ссылка на курс
➡️ Easy Java | #Ресурс
5 221
❓ Вопрос с собеса
Чем ReentrantLock отличается от synchronized в Java?
Пример🔽
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private static final ReentrantLock lock = new ReentrantLock();
private static int counter = 0;
public static void main(String[] args) {
Runnable task = () -> {
lock.lock();
try {
counter++;
} finally {
lock.unlock();
}
};
new Thread(task).start();
new Thread(task).start();
}
}
Ответ🔽
ReentrantLock — это класс из java.util.concurrent.locks, который предоставляет больше возможностей, чем synchronized: — Можно пытаться захватить блокировку с таймаутом (tryLock) — Можно использовать блокировку с несколькими условиями (Condition) — Можно вручную управлять моментом захвата и освобождения 📌 В отличие от synchronized, ReentrantLock требует явного вызова lock() и unlock(), что даёт гибкость, но требует дисциплины.➡️ Easy Java | #Собес
5 221
Бесплатная конференция по PostgreSQL
Регистрируйся на бесплатную конференцию по PostgreSQL — 19.03.2026.📅
Эксперты расскажут о разработке, администрировании и новинках мира Postgres.
✅ Бесплатное участие
✅ Опытные спикеры
✅ 25+ тематических докладов
✅ Рабочие кейсы
Каждый участник получает именной Сертификат участника мероприятия.
Одни из немногих спикеров конференции:
— Андрей Бородин
PostgreSQL Major contributor, руководитель подразделения разработки РСУБД с открытым исходным кодом Yandex Cloud
— Родион Хабибов
DevOps-инженер «СберСервис»
— Андрей Овчаренко
Руководитель отдела Java-разработки Московской биржи
... и многие другие.
Регистрируйся, будет интересно!
И бесплатно!
Зарегистрироваться
#реклама 16+
pgbootcamp.ru
О рекламодателе
5 221
👩💻 Что такое Collections.unmodifiableList() и зачем он нужен?
Collections.unmodifiableList() — это статический метод, который создает неизменяемую (read-only) обертку над существующим списком. Любая попытка изменить такой список приводит к выбросу UnsupportedOperationException.
⚡️ Пример:
import java.util.*;
public class UnmodifiableListExample {
public static void main(String[] args) {
// Создаем изменяемый список
List<String> mutableList = new ArrayList<>();
mutableList.add("Java");
mutableList.add("Python");
mutableList.add("C++");
// Создаем неизменяемую обертку
List<String> immutableList = Collections.unmodifiableList(mutableList);
System.out.println("Исходный список: " + mutableList);
System.out.println("Неизменяемая обертка: " + immutableList);
// Попытка изменить неизменяемый список
try {
immutableList.add("JavaScript"); // Бросит исключение
} catch (UnsupportedOperationException e) {
System.out.println("Ошибка: нельзя добавить элемент в неизменяемый список");
}
try {
immutableList.remove(0); // Бросит исключение
} catch (UnsupportedOperationException e) {
System.out.println("Ошибка: нельзя удалить элемент из неизменяемого списка");
}
// Важно: изменения в оригинальном списке отражаются в обертке!
mutableList.add("JavaScript");
System.out.println("После изменения оригинала:");
System.out.println("Оригинал: " + mutableList);
System.out.println("Обертка: " + immutableList); // JavaScript появился и здесь
// Правильный способ - полная копия
List<String> safeImmutable = Collections.unmodifiableList(
new ArrayList<>(mutableList) // Создаем копию
);
// Использование в API
DataService service = new DataService();
List<String> data = service.getReadOnlyData();
try {
data.add("Новый элемент"); // Ошибка - список только для чтения
} catch (UnsupportedOperationException e) {
System.out.println("API вернуло защищенные данные");
}
}
static class DataService {
private List<String> internalData = Arrays.asList("A", "B", "C");
public List<String> getReadOnlyData() {
// Возвращаем неизменяемую обертку для защиты данных
return Collections.unmodifiableList(internalData);
}
}
}
Особенно полезен при возврате данных из API, передаче коллекций в методы, создании константных коллекций и защите внутреннего состояния объекта от внешних изменений.➡️ Easy Java | #Теория
5 221
👩💻 Шаблоны проектирования, реализованные в Java
Репозиторий с десятками шаблонов, которые помогут вам как ускорить процесс разработки, так и лучше разобраться в некоторых аспектах, используя шаблоны как пример готового проекта.
⛓ Переход к репозиторию
➡️ Easy Java | #Ресурс
5 221
👩💻 Викторина: что выведет код?
// Предположим, что этот код находится в файле src/com/example/Main.java
package com.example;
import java.net.URL;
import java.net.URLClassLoader;
class Secret {
static String message = "Top Secret";
}
public class Main {
public static void main(String[] args) throws Exception {
// Создаем загрузчик, который видит тот же класс, но в другом пакете
URLClassLoader loader = new URLClassLoader(
new URL[]{new URL("file:./classes/")},
ClassLoader.getPlatformClassLoader() // Не делегирует системному загрузчику
);
Class<?> secretClass = loader.loadClass("com.example.Secret");
String value = (String) secretClass.getField("message").get(null);
System.out.println("Value: " + value);
// Проверяем равенство классов
System.out.println("Same class: " + (Secret.class == secretClass));
// Проверяем instanceof
Secret s = new Secret();
System.out.println("Instance: " + secretClass.isInstance(s));
}
}
➡️ Easy Java | #Викторина5 221
👩💻 Что такое Thread.sleep() и зачем он нужен?
Thread.sleep() — это статический метод класса java.lang.Thread, который приостанавливает выполнение текущего потока на указанное количество миллисекунд или наносекунд.
```java
public class ThreadSleepExample {
public static void main(String[] args) {
System.out.println("Демонстрация Thread.sleep()");
// Простая задержка
System.out.println("Начало работы");
try {
Thread.sleep(2000); // Пауза 2 секунды
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Поток был прерван");
}
System.out.println("Прошло 2 секунды");
// Создание анимации загрузки
System.out.print("Загрузка");
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(500); // Полсекунды между точками
System.out.print(".");
} catch (InterruptedException e) {
break;
}
}
System.out.println(" Готово!");
// Имитация таймера
for (int seconds = 3; seconds > 0; seconds--) {
System.out.println("Осталось: " + seconds + " сек");
try {
Thread.sleep(1000); // Пауза 1 секунда
} catch (InterruptedException e) {
System.out.println("Таймер прерван");
break;
}
}
System.out.println("Время вышло!");
// Пример с перехватом прерывания
Thread countingThread = new Thread(() -> {
for (int i = 1; i <= 10; i++) {
System.out.println("Считаем: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Поток прервали на счете " + i);
return; // Выходим из метода run()
}
}
});
countingThread.start();
// Даем потоку посчитать до 3, потом прерываем
try {
Thread.sleep(3500);
countingThread.interrupt(); // Прерываем поток
} catch (InterruptedException e) {
// Игнорируем
}
}
}
```
Особенности:
· Выбрасывает InterruptedException — checked exception
· Точность задержки зависит от операционной системы
· Приостанавливает только текущий поток
· После пробуждения поток переходит в состояние Runnable
Для чего особенно полезен:
· Создание задержек в UI анимациях
· Имитация длительных операций при тестировании
· Управление частотой выполнения в циклах
· Простая синхронизация потоков во времени
· Реализация тайм-аутов и ожидания
· Демонстрация многопоточности в учебных примерах
Важные замечания:
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Поток был прерван");
}
System.out.println("Прошло 2 секунды");
// Создание анимации загрузки
System.out.print("Загрузка");
for (int i = 0; i < 5; i++) {
try {
➡️ Easy Java | #Теория5 221
Как разработчик решил параллельно найму пилить свои бизнес-проекты с нулевым опытом: дневник с передовой
Меня зовут Александр Торбек, И я попал в день сурка: код писать умею, зарплата стабильная. Но в заднице зудит ощущение катастрофического застоя.
Поэтому я сделал глупейшую вещь — начал разрабатывать продукты. Без связей, плана и стратегии. В блоге буду фиксировать:
— идеи (и почему 90% из них — говно собаки)
— что сделал, сколько заработал
— мысли айтишника, который впервые думает как продакт, а не как тупой исполнитель
Я хочу пройти весь путь от основателя продукта до продажника. И выяснить, смогу ли без бизнес-бэкграунда выйти на уровень дядек в элитных пиджаках.
Если тоже хотите создавать свои продукты — посмотрите, как я набиваю шишки первым: @atorbek_it
5 221
Библиотека для автоматического модульного тестирования
Тесты — обязательная часть любого проекта, но иногда этой части разработки уделяет не так много внимания. JUnit — библиотека, позволяющая автоматизировать данный процесс.
Подходит для Java 17 или Kotlin 2.1.
⛓ Ознакомиться с библиотекой
➡️ Easy Java | #Ресурсы
5 221
👩💻 Викторина: что выведет код?
import java.util.HashSet;
import java.util.Set;
record Point(int x, int y) {
// Переопределяем equals, но не hashCode
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Point p)) return false;
return this.x == p.x && this.y == p.y;
}
}
public class Main {
public static void main(String[] args) {
Set<Point> set = new HashSet<>();
Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
Point p3 = new Point(3, 4);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set.size());
System.out.println(p1.equals(p2));
System.out.println(set.contains(new Point(1, 2)));
}
}
➡️ Easy Java | #Викторина5 221
⚡️ Писать код руками больше не нужно!
Привет. Меня зовут Кирилл. Я создаю топовые подборки с уроками по AI и вайбкодингу:
— 60+ промптов для дебага: поиск ошибок, оптимизация кода
— 40 бесплатных курсов по вайбкодингу
— 150 гайдов, как использовать ChatGPT, Claude Code, Antigravity, Cursor, Perplexity, Lovable
— 100 готовых модулей: авторизация, админки, логирование, тесты, i18n
— 37 MCP серверов: дизайн, разработка, Тесты/QA, деплой
Всего 10 минут в день на канале и ты начнешь писать код на 85% быстрее и сможешь за пару дней закрывать спринты.
Подписывайся, чтобы получать подборки каждую неделю!
5 221
❓ Вопрос с собеса
Зачем в Java используется ключевое слово
volatile?
Пример🔽
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 говорит JVM, что переменная может изменяться в других потоках, и запрещает кэшировать её значение. Без volatile поток может "застрять", не заметив изменения переменной. 📌 volatile не делает операции атомарными, но гарантирует видимость изменений между потоками. Используется для флагов, сигналов остановки и простейшей синхронизации➡️ Easy Java | #Собес
5 221
В IT хватает тех, кто пересказывает чужие статьи.
Но есть те, кто пишет изнутри системы.
NeuroNinja 🥷🏻 - авторский канал инженера СберТехнологий, который показывает, что происходит по ту сторону интерфейса.
В канале вы найдете:
🟢 Разборы реальных кейсов из практики
🟢 Гайды по нейросетям без воды
🟢 Полезные инструменты и лайфхаки
🟢 Честные мысли о трендах в IT
Живые обсуждения для тех, кто не просто читает про ИИ, а строит его будущее🚀.
👉 Подписаться: https://t.me/+mAs8eSHFkjBkYTUy
5 221
👩💻 Что такое BufferedReader.lines() и зачем он нужен?
BufferedReader.lines() — это метод, который возвращает Stream<String> строк, прочитанных из BufferedReader. Каждый элемент потока — это одна строка из файла или другого источника.
⚡️ Пример:
import java.io.*;
import java.nio.file.*;
import java.util.stream.*;
public class BufferedReaderLinesExample {
public static void main(String[] args) {
String filePath = "example.txt";
// Создаем тестовый файл
createTestFile(filePath);
// Чтение файла с использованием lines()
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
// Простое чтение всех строк
System.out.println("Все строки файла:");
reader.lines()
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
// Сложная обработка с Stream API
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
System.out.println("\nАнализ файла:");
long lineCount = reader.lines().count();
System.out.println("Всего строк: " + lineCount);
} catch (IOException e) {
e.printStackTrace();
}
// Фильтрация и преобразование
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
System.out.println("\nСтроки содержащие 'Java':");
reader.lines()
.filter(line -> line.contains("Java"))
.map(String::toUpperCase)
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
// Параллельная обработка большого файла
try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
long wordCount = reader.lines()
.parallel() // Включаем параллельную обработку
.flatMap(line -> Arrays.stream(line.split("\\s+")))
.filter(word -> !word.isEmpty())
.count();
System.out.println("\nВсего слов в файле: " + wordCount);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void createTestFile(String path) {
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path))) {
writer.write("Java - популярный язык программирования\n");
writer.write("Stream API появился в Java 8\n");
writer.write("BufferedReader предоставляет удобные методы\n");
writer.write("lines() возвращает Stream строк\n");
writer.write("Это полезно для обработки больших файлов\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Особенно полезен для обработки больших лог-файлов, парсинге CSV, анализе текстовых данных, чтении конфигурационных файлов.➡️ Easy Java | #Теория
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
