Easy Java
Kanalga Telegram’da o‘tish
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Ko'proq ko'rsatish5 038
Obunachilar
-224 soatlar
-187 kunlar
-7430 kunlar
Postlar arxiv
5 038
👩💻 Викторина: что выведет код?
// Предположим, что этот код находится в файле 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 038
👩💻 Что такое 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 038
Как разработчик решил параллельно найму пилить свои бизнес-проекты с нулевым опытом: дневник с передовой
Меня зовут Александр Торбек, И я попал в день сурка: код писать умею, зарплата стабильная. Но в заднице зудит ощущение катастрофического застоя.
Поэтому я сделал глупейшую вещь — начал разрабатывать продукты. Без связей, плана и стратегии. В блоге буду фиксировать:
— идеи (и почему 90% из них — говно собаки)
— что сделал, сколько заработал
— мысли айтишника, который впервые думает как продакт, а не как тупой исполнитель
Я хочу пройти весь путь от основателя продукта до продажника. И выяснить, смогу ли без бизнес-бэкграунда выйти на уровень дядек в элитных пиджаках.
Если тоже хотите создавать свои продукты — посмотрите, как я набиваю шишки первым: @atorbek_it
5 038
Библиотека для автоматического модульного тестирования
Тесты — обязательная часть любого проекта, но иногда этой части разработки уделяет не так много внимания. JUnit — библиотека, позволяющая автоматизировать данный процесс.
Подходит для Java 17 или Kotlin 2.1.
⛓ Ознакомиться с библиотекой
➡️ Easy Java | #Ресурсы
5 038
👩💻 Викторина: что выведет код?
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 038
⚡️ Писать код руками больше не нужно!
Привет. Меня зовут Кирилл. Я создаю топовые подборки с уроками по AI и вайбкодингу:
— 60+ промптов для дебага: поиск ошибок, оптимизация кода
— 40 бесплатных курсов по вайбкодингу
— 150 гайдов, как использовать ChatGPT, Claude Code, Antigravity, Cursor, Perplexity, Lovable
— 100 готовых модулей: авторизация, админки, логирование, тесты, i18n
— 37 MCP серверов: дизайн, разработка, Тесты/QA, деплой
Всего 10 минут в день на канале и ты начнешь писать код на 85% быстрее и сможешь за пару дней закрывать спринты.
Подписывайся, чтобы получать подборки каждую неделю!
5 038
❓ Вопрос с собеса
Зачем в 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 038
В IT хватает тех, кто пересказывает чужие статьи.
Но есть те, кто пишет изнутри системы.
NeuroNinja 🥷🏻 - авторский канал инженера СберТехнологий, который показывает, что происходит по ту сторону интерфейса.
В канале вы найдете:
🟢 Разборы реальных кейсов из практики
🟢 Гайды по нейросетям без воды
🟢 Полезные инструменты и лайфхаки
🟢 Честные мысли о трендах в IT
Живые обсуждения для тех, кто не просто читает про ИИ, а строит его будущее🚀.
👉 Подписаться: https://t.me/+mAs8eSHFkjBkYTUy
5 038
👩💻 Что такое 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 | #Теория
5 038
Сеньор за полгода? 📈
Эта девушка получила оффер в IT-компанию, хотя весь её опыт — пара курсов с ютуба 😱
Она воспользовалась ИИ-помощником и легко скрыла все свои пробелы в знаниях.
Теперь впереди: ⤵️
удалёнка, стартовое обучение и ставка 55$ в час.
Проходи собеседования вместе с Interview Ninja 🥷
Проверь успех на себе — есть 100 бесплатных запросов на день.
👉 @interview_ninja
5 038
📖 Сборник из 350 вопросов с ответами на собеседование Java Junior
В сборнике вопросы от самых базовых, до самых продвинутых среди «джуновских» вопросов. Сразу можно посмотреть ответ, что очень удобно.
⛓ Ссылка на сборник
➡️ Easy Java | #Ресурсы
5 038
Ухватил ОФФЕР с ЗП более чем 500к🤑
Несколько раз в месяц Топовые IT компании выкладывают вакансии с огромной зарплатой даже у джунов, а я расскажу как попасть на ТимЛида‼️
Я — Артем и в своём телеграм канале рассказываю:
🔴 Как максимально быстро вырасти до Тим Лида в IT компаний с нуля — [Инструкция]
🔴 Как собрать лучшую команду на удалёнке — [Пояснение]
🔴Подсказки и фишечки от ТимЛида с 13 летним опытом — [Список]
Подписаться можно тут: https://t.me/+edzOK2TDrBNjZTVi
5 038
👩💻 Викторина: что выведет код?
def counter_decorator(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
count += 1
result = func(*args, **kwargs)
print(f"Call {count}: {result}")
return result
return wrapper
@counter_decorator
def multiply(a, b):
return a * b
multiply(2, 3)
multiply(4, 5)
multiply(6, 7)
➡️ Easy Java | #Викторина5 038
👩💻 Что такое Optional.orElseThrow() и зачем он нужен?
Optional.orElseThrow() — это метод класса Optional<T>, который возвращает значение, если оно присутствует, или выбрасывает исключение, если значение отсутствует. Добавлен в Java 10 как альтернатива get() с явным указанием исключения.
⚡️ Пример:
import java.util.*;
import java.util.function.Supplier;
public class OrElseThrowExample {
public static void main(String[] args) {
// Пример с пользователями
Optional<User> user = findUserById(123);
try {
// Получение значения с дефолтным исключением
User foundUser = user.orElseThrow();
System.out.println("Найден пользователь: " + foundUser.name());
} catch (NoSuchElementException e) {
System.out.println("Пользователь не найден (дефолтное исключение)");
}
// С кастомным исключением
Optional<User> emptyUser = findUserById(999);
try {
User user2 = emptyUser.orElseThrow(
() -> new UserNotFoundException("Пользователь с ID 999 не существует")
);
} catch (UserNotFoundException e) {
System.out.println("Поймано кастомное исключение: " + e.getMessage());
}
// Практический пример: валидация конфигурации
Config config = loadConfig()
.orElseThrow(() -> new IllegalStateException("Конфигурация не загружена"));
System.out.println("Конфигурация загружена: " + config);
// Цепочка вызовов с обработкой ошибок
String result = findUserById(123)
.map(User::email)
.orElseThrow(() -> new RuntimeException("Email не найден"));
System.out.println("Email пользователя: " + result);
}
static Optional<User> findUserById(int id) {
// Имитация поиска в базе данных
if (id == 123) {
return Optional.of(new User(123, "Иван Иванов", "ivan@example.com"));
}
return Optional.empty();
}
static Optional<Config> loadConfig() {
// Имитация загрузки конфигурации
return Optional.of(new Config("production"));
}
record User(int id, String name, String email) {}
record Config(String environment) {}
static class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
}
Особенно полезен при валидации прааметров, обработки отсутствующих значений в цепочках вызовов, замене проверов if, преобразовании optional в исключения в контроллерах/сервисах.➡️ Easy Java | #Теория
