Каждый объект имеет идентичность, состояние и поведение. Методы сравнения и представления определяют, как объекты ведут себя в коллекциях, логировании и бизнес-логике. Ошибки в equals или hashCode могут привести к трудноуловимым багам.
Разобравшись в различии между ссылкой и содержимым, а также в механизме строкового представления, разработчик начинает лучше понимать модель памяти и принципы объектно-ориентированного подхода. Это база, на которой строится корректный и предсказуемый код.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🤝9❤7👍3
Обработка больших файлов!
Когда файл весит сотни мегабайт, читать его целиком в память опасно. Правильный подход обрабатывать кусками.
Открываем файл через буфер:
Читаем кусками:
Крутим цикл, пока есть данные:
Закрываем ресурс:
🔥 Так можно считать размер, хеш, статистику, искать сигнатуры не загружая файл целиком.
👉 Java Ready | #совет
Когда файл весит сотни мегабайт, читать его целиком в память опасно. Правильный подход обрабатывать кусками.
Открываем файл через буфер:
BufferedInputStream in =
new BufferedInputStream(new FileInputStream("big.bin"));
Читаем кусками:
byte[] buffer = new byte[64 * 1024];
int read = in.read(buffer);
Крутим цикл, пока есть данные:
while ((read = in.read(buffer)) != -1) {
total += read;
}Закрываем ресурс:
in.close();
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤5🔥4
Виртуальные потоки позволяют запускать огромное количество задач параллельно с минимальными накладными расходами по сравнению с обычными потоками ОС.
На картинке — принцип работы: виртуальные потоки создаются в программе, JVM планирует их выполнение поверх нескольких platform-потоков (carrier threads), а уже они выполняются операционной системой.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍7🔥6🤝2
Генерация API-документации из аннотаций!
Когда API растёт, документация быстро устаревает. Решение простое, хранить описание рядом с методами в аннотациях и генерировать доку автоматически.
Создаём аннотацию для эндпоинтов:
Помечаем методы аннотацией:
Сканируем методы через reflection и собираем Markdown:
Сохраняем документацию в файл:
В итоге API,md генерится из кода и всегда соответствует реальным эндпоинтам.
👉 Java Ready | #практика
Когда API растёт, документация быстро устаревает. Решение простое, хранить описание рядом с методами в аннотациях и генерировать доку автоматически.
Создаём аннотацию для эндпоинтов:
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD)
@interface ApiRoute {
String method();
String path();
String desc() default "";
}
Помечаем методы аннотацией:
@ApiRoute(method = "GET", path = "/health", desc = "Проверка статуса сервиса")
void health() {}
@ApiRoute(method = "POST", path = "/login", desc = "Логин по паролю")
void login() {}
Сканируем методы через reflection и собираем Markdown:
var sb = new StringBuilder("# API\n\n");
for (var m : MyApi.class.getDeclaredMethods()) {
var a = m.getAnnotation(ApiRoute.class);
if (a == null) continue;
sb.append("- **").append(a.method()).append(" ").append(a.path()).append("**\n")
.append(" ").append(a.desc()).append("\n\n");
}Сохраняем документацию в файл:
java.nio.file.Files.writeString(
java.nio.file.Path.of("API.md"),
sb.toString()
);
В итоге API,md генерится из кода и всегда соответствует реальным эндпоинтам.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥4
Например, пишешь код в .java файле, компилятор превращает его в байткод .class, а затем JVM загружает классы, проверяет их и выполняет — интерпретируя или компилируя в нативный код через JIT.
На картинке упрощенная схема — путь Java-программы от исходников до запуска.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍9🔥8
Создание, сравнение, форматирование и изменение дат выполняются ежедневно: отчёты, фильтрация данных, дедлайны, подписки и логирование. Современный API java.time делает эти операции читаемыми и избавляет от ошибок, связанных со старыми классами.
Понимание принципов неизменяемости и методов изменения дат позволяет писать предсказуемый код без неожиданных побочных эффектов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥6🤝6❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собраны сотни примеров и материалов по ключевым направлениям: структуры данных, алгоритмы, ООП, многопоточность, сетевое программирование, безопасность, Android-разработка и даже основы машинного обучения. Репозиторий охватывает путь от базового синтаксиса до прикладных проектов и задач уровня собеседований.
Оставляю ссылочку: GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤7👍6
Планировщик задач!
Когда нужно запускать код по расписанию, не надо городить циклы и
Создаём планировщик:
Запуск задачи с задержкой:
Запуск задачи каждые
Остановка планировщика:
👉 Java Ready | #совет
Когда нужно запускать код по расписанию, не надо городить циклы и
sleep. В Java для этого есть планировщик.Создаём планировщик:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
Запуск задачи с задержкой:
scheduler.schedule(() -> System.out.println("Задача выполнена"),
5, TimeUnit.SECONDS);Запуск задачи каждые
N секунд:scheduler.scheduleAtFixedRate(() -> System.out.println("Тик"),
0, 3, TimeUnit.SECONDS);Остановка планировщика:
scheduler.shutdown();
🔥 Идеально для фоновых задач: автоочистка, пинги, бэкапы, обновления.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥8❤5
Например, HTTP/1.1 использует постоянные соединения, HTTP/2 умеет мультиплексировать запросы в одном TCP-канале, а HTTP/3 работает поверх QUIC и UDP.
На картинке — наглядная эволюция HTTP от первых версий до современных стандартов.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🤝7❤6
Определение языка текста!
Иногда нужно понять язык сообщения. В Java можно использовать библиотеку определения языка без сложной логики.
Добавляем зависимость в Gradle:
Создаём детектор языка:
Передаём текст на определение языка:
Пробуем несколько примеров:
Подходит для чатов, анализа текста и мультиязычных приложений.
👉 Java Ready | #практика
Иногда нужно понять язык сообщения. В Java можно использовать библиотеку определения языка без сложной логики.
Добавляем зависимость в Gradle:
implementation "org.apache.tika:tika-core:2.9.2"
Создаём детектор языка:
var detector = new org.apache.tika.language.detect.LanguageDetector();
detector.loadModels();
Передаём текст на определение языка:
var result = detector.detect("Bonjour tout le monde");
System.out.println("Язык: " + result.getLanguage());Пробуем несколько примеров:
System.out.println(detector.detect("Hello world").getLanguage());
System.out.println(detector.detect("Привет мир").getLanguage());
System.out.println(detector.detect("Hola amigo").getLanguage());
В итоге получаем автоматическое определение языка строки.Подходит для чатов, анализа текста и мультиязычных приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍8🔥4
Нужно быстро упаковать папку в один файл? Пишем архиватор, рекурсивно обходим директорию, создаём ZipEntry для каждого файла и сохраняем структуру.
В этой задаче:
• Открываем ZipOutputStream;
• Обходим папку;
• Добавляем файлы в ZIP.
Потоковая запись снижает потребление памяти и позволяет упаковывать даже очень крупные наборы файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤5👍4🤝1
Кеширование данных в памяти
Если одни и те же данные запрашиваются часто, каждый раз обращаться к БД, API или делать тяжёлые вычисления это потеря времени.
Создаём простое хранилище кеша:
Метод получения данных с кешированием:
Имитация тяжёлой операции:
Первый вызов медленный, второй быстрый:
Такой подход используют для: результатов запросов к БД, API-ответов, вычислений, конфигов.
👉 Java Ready | #совет
Если одни и те же данные запрашиваются часто, каждый раз обращаться к БД, API или делать тяжёлые вычисления это потеря времени.
Создаём простое хранилище кеша:
Map<String, String> cache = new HashMap<>();
Метод получения данных с кешированием:
String getData(String key) {
if (cache.containsKey(key)) {
System.out.println("Найдено в кеше");
return cache.get(key);
}
System.out.println("Данных нет — выполняю долгую операцию...");
String value = slowOperation(key);
cache.put(key, value);
return value;
}Имитация тяжёлой операции:
String slowOperation(String key) {
try { Thread.sleep(2000); } catch (InterruptedException ignored) {}
return "Data for " + key;
}Первый вызов медленный, второй быстрый:
System.out.println(getData("user:42"));
System.out.println(getData("user:42"));Такой подход используют для: результатов запросов к БД, API-ответов, вычислений, конфигов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Репозиторий представляет собой структурированную шпаргалку по фундаментальным темам языка: ООП, полиморфизм, коллекции, исключения, сериализация, ключевые слова, типы данных и распространённые особенности поведения Java. Материал ориентирован на быстрое повторение теории.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥8🤝7❤2