Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее

▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее

Вакансии Java разработчиков уровня Middle

▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее

▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее

Вакансии Java разработчиков уровня Senior

▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее

▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет
🖥 Освежите свои знания о CompletableFuture

Задачи, которые требуют асинхронного выполнения, могут стать настоящей головной болью, если использовать устаревшие методы. Однако, есть мощный инструмент — CompletableFuture, который упрощает работу с параллельными вычислениями, обеспечивая гибкость, читаемость и исключение возможных ошибок в многозадачности. Статья содержит интересный пример использования этого инструмента. В ней описана реализация веб-сканера, который будет по ссылкам искать новости, посвященные хакингу.

🔗 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Ключевое слово volatile

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

▪️ Синхронизация чтения и записи: Переменная, помеченная как volatile, всегда будет читать свое значение из основной памяти, а не из локальных кешей потоков.
▪️ Обеспечение видимости: Когда один поток изменяет значение переменной, все другие потоки немедленно видят эти изменения.
▪️ Отсутствие блокировок: В отличие от использования synchronized, volatile не блокирует выполнение потоков, что делает его более легковесным способом синхронизации.

Когда использовать volatile?
- Когда переменная должна быть доступна для записи и чтения несколькими потоками, но нет необходимости в сложной синхронизации (например, для флагов, флагов завершения, индикаторов состояний).
- В случаях, когда нужно просто гарантировать видимость изменений, но не требуется атомарность или операции с несколькими шагами (для этих случаев лучше использовать synchronized или java.util.concurrent).

Пример:
public class VolatileExample {
private static volatile boolean flag = false;

public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
try {
Thread.sleep(1000); // эмулируем задержку
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
flag = true;
System.out.println("Flag set to true");
});

Thread reader = new Thread(() -> {
while (!flag) {
}
System.out.println("Flag is now true");
});

writer.start();
reader.start();

writer.join();
reader.join();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Привет, друзья! 👋

2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?

💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
ℹ️ Что такое "Проблема бриллианта" (Diamond Problem)?

Проблема бриллианта (или Diamond Problem) — это ситуация, которая возникает в языках программирования с поддержкой множественного наследования. Она заключается в том, что если один класс наследует два или более класса, которые имеют общий предок, то возникает неопределенность, с какого родительского класса должны быть унаследованы члены (методы или поля).

В Java множественное наследование классов не поддерживается, но проблема все равно может возникнуть при использовании интерфейсов.

interface A {
void method();
}

interface B extends A {
@Override
default void method() {
System.out.println("Method from B");
}
}

interface C extends A {
@Override
default void method() {
System.out.println("Method from C");
}
}

class D implements B, C { }

public class Main {
public static void main(String[] args) {
D d = new D();
d.method(); // Какая версия метода будет вызвана?
}
}


📌 В чем суть проблемы?

Когда класс D реализует оба интерфейса B и C, которые оба предоставляют дефолтные реализации метода method(), возникает неопределенность — какую версию метода должен использовать класс D? При компиляции будет выброшен error: class D inherits unrelated defaults for method() from types B and C.

Это решается с помощью явного переопределения метода в классе D, что позволяет избежать конфликтов.

class D implements B, C {
@Override
public void method() {
B.super.method();
// или можно использовать C.super.method(), если хотите вызвать метод из C
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔼 Roadmap от джуна до сеньора

🔹 Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🔹 Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🔹 Разработка API: Изучите REST, GraphQL, gRPC.
🔹 Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🔹 Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🔹 Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🔹 CI/CD: Изучите GitHub Actions, Jenkins.
🔹 Алгоритмы: Разберитесь в Big O, деревьях, графах.
🔹 Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🔹 Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🔹 AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.

💬 Какие пункты вы бы ещё добавили?
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Как работает CopyOnWriteArrayList под капотом?

CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.

💡 Основные механизмы:

🔹 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🔹 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🔹 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.

⚠️ Особенности:

▪️ Высокие накладные расходы на запись из-за создания копий.
▪️ Подходит для случаев, где чтение доминирует над изменением.
▪️ Не рекомендуется для сценариев с частыми обновлениями из-за увеличения потребления памяти.

CopyOnWriteArrayList идеально подходит для кешей, обработчиков событий и других структур данных, где важна стабильность чтения при редких изменениях.

Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
🎄🎅 Настало время решать весёлые, праздничные головоломки по программированию

Advent of Code 2024 — адвент-календарь с небольшими головоломками по программированию. Всё, что вам нужно для участия, — это немного знаний в области программирования. Решать можно на любом ЯП.

👉 Врывайтесь, ведь позади уже шесть дней
🕯 Паттерн Посетитель (Visitor)

Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам без изменения их классов. Он выделяет операции в отдельный объект, называемый "посетитель", что позволяет избежать дублирования кода и поддерживать open/closed архитектуру.

Использование:

🔹 Когда нужно добавлять новые операции к иерархии классов без изменения их структуры.
🔹 Когда объектам требуется обработка, зависящая от их типов, но нежелательно добавлять логику внутрь самих классов.

Преимущества:

1️⃣ Упрощает добавление новых операций.
2️⃣ Логика работы концентрируется в одном месте, а не размазывается по классам.
3️⃣ Сохраняется открытость к изменениям операций и закрытость классов к модификациям.

Недостатки:


1️⃣ Увеличивает количество классов.
2️⃣ Добавление нового типа в иерархию требует обновления всех существующих посетителей.
3️⃣ Работает лучше всего с фиксированной иерархией.

📌 Visitor идеально подходит для сценариев, где требуется частое добавление новых операций при сохранении стабильности классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍☕️ Тайные питонисты среди нас?

Не секрет, что среди Java-разработчиков скрываются те, кто втайне любит Python. Кто украдкой пишет скрипты на Python для автоматизации или просто мечтает о жизни без фигурных скобок.

📌 Пройдите тест и проверьте, не живет ли внутри вас тайный питонист.

P.S. Не волнуйтесь, никто не будет осуждать, если вам вдруг понравится 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Junior Java разработчик (Стажер)
Офис (Санкт-Петербург), Центр финансовых технологий
Подробнее

▪️ Junior Java Developer (Пенза)
Офис (Пенза), Тортуга
Подробнее

Вакансии Java разработчиков уровня Middle

▪️ Java-разработчик
Офис (Москва, Санкт-Петербург, Екатеринбург) / Удалёнка, Т-Банк
Подробнее

▪️ Middle+ Java разработчик
Гибрид (Москва), СберКорус
Подробнее

Вакансии Java разработчиков уровня Senior

▪️ Java-разработчик Middle\Senior
Удалёнка, RedLab
Подробнее

▪️ Senior Java разработчик
Удалёнка / Офис (Москва), Синхро
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет
🐛🔍 Как найти баг в 2088 коммитах с помощью git bisect

Метод git bisect — мощный инструмент для поиска изменения, вызвавшего баг в коде: с его помощью разработчику удалось быстро локализовать проблему, просмотрев всего 11 коммитов вместо изначальных 2088.

Задача: найти конкретный коммит, который вызвал регрессионную ошибку в проекте.

Исходные данные:
✔️ Ошибка была зарегистрирована 21 октября. Она находится в текущей версии на ветке main.
✔️ Ошибка отсутствует в более ранней версии, которая была выделена в отдельную ветку release-5.7.0.
✔️ Ветку release-5.7.0 создали 2 месяца назад, а с тех пор в ветке main было сделано много изменений — баг может находиться в любом из нескольких тысяч коммитов, которые невозможно быстро просмотреть.

🔗 Читать статью
🔗 Зеркало
🔗 Динамическое и статическое связывание

Связывание (binding) определяет, какой метод будет вызван во время выполнения программы. Понимание различий между динамическим и статическим связыванием важно для эффективного использования полиморфизма и оптимизации производительности приложения.

🔵 Статическое связывание (Static Binding)

Статическое связывание происходит на этапе компиляции. Компилятор определяет, какой метод или переменная будут использоваться, основываясь на типе ссылки.

▪️ Когда используется?


- Статические методы (static)
- Частные методы (private)
- Методы в финальных классах (final)
- Перегруженные методы (method overloading)

▪️ Пример:
class A {
static void display() { System.out.println("Static A"); }
}

class B extends A {
static void display() { System.out.println("Static B"); }
}

public class Main {
public static void main(String[] args) {
A obj = new B();
obj.display(); // Выведет: Static A
}
}


display() — статический метод. Вызов определяется типом ссылки A, поэтому вызывается A.display().

🔵 Динамическое связывание (Dynamic Binding)

Динамическое связывание происходит во время выполнения (runtime). JVM определяет, какой метод вызвать, основываясь на фактическом типе объекта.

▪️ Когда используется?

- Переопределенные методы (method overriding)
- Нестатические методы (instance methods)

▪️ Пример:
class A {
void display() { System.out.println("Dynamic A"); }
}

class B extends A {
@Override
void display() { System.out.println("Dynamic B"); }
}

public class Main {
public static void main(String[] args) {
A obj = new B();
obj.display(); // Выведет: Dynamic B
}
}


display() — нестатический метод. Вызов определяется фактическим типом объекта B, поэтому вызывается B.display().

🔵 Практические применения

▪️ Статическое связывание:


- Утилитные классы: Методы Math.max(), Collections.sort() и другие статические методы часто используют статическое связывание для быстрого доступа.
- Безопасность: Приватные методы не могут быть переопределены, что предотвращает изменение внутренней логики класса.

▪️ Динамическое связывание:

- Полиморфизм: Позволяет создавать гибкие и расширяемые системы. Например, использование интерфейсов и абстрактных классов для определения контрактов.
- Фреймворки и библиотеки: Многие фреймворки (например, Spring) используют динамическое связывание для внедрения зависимостей и аспектно-ориентированного программирования (AOP).
Please open Telegram to view this post
VIEW IN TELEGRAM
Как относитесь к функциональному стилю в Java?

❤️ Отлично, Java стала мощнее и лаконичнее.
🤔 Использую только там, где это действительно оправдано.
🌚 Функциональщина не для меня, только классическое ООП.

💬 Делитесь опытом и мнением в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 ТОП-10 перспективных российских стартапов в 2025 году

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

Что ждёт нас в 2025 году?
Какие российские стартапы уже сейчас выходят на новый уровень и обещают удивить инновациями?

В этом материале мы собрали 10 самых перспективных проектов, за которыми сто́ит следить, чтобы быть на острие технологических и бизнес-трендов. Узнайте, кто может стать новым лидером рынка и как эти компании уже сегодня меняют правила игры.

📎 Читать
Подготовься к собеседованию на позицию Data Scientist!

Профессия Data Scientist становится все более востребованной, и компании ищут специалистов, способных превращать данные в ценные инсайты. Но как успешно пройти техническое собеседование?

Мы собрали 10 типичных задач, которые могут встретиться на собеседовании, и эффективные подходы к их решению:

1. Внешнее и тензорное произведение

2. One-hot кодировка

3. Мониторинг осадков

4. Симуляция бросков кубиков в «Монополии»

5. Бурение скважин для добычи золота

6. Вычисление свертки

7. Бэктестинг торговой стратегии

8. Прогноз оттока клиентов с помощью логистической регрессии

9. Обнаружение спама с использованием дерева решений

10. Предсказание цен на квартиры с помощью линейной регрессии

Чтобы начать решать задачи, достаточно ответить на четыре простых вопроса по этой ссылке и получить доступ к вводным занятиям курса Математика для Data Science и 10 задачам.