Библиотека джависта | 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
加入频道
🐍☕️ Тайные питонисты среди нас?

Не секрет, что среди 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 задачам.
💾 CDC vs Outbox: как решить проблему двойной записи в распределенной системе

В распределённых системах согласованность данных часто становится настоящим вызовом. Особенно это касается сценариев, где требуется выполнить несколько операций в разных системах одновременно.

Как избежать проблем двойной записи? Современные подходы, такие как захват изменений данных (CDC) и паттерн Outbox, предлагают интересные решения. Эти методики позволяют поддерживать целостность данных, избегать сбоев и минимизировать риски.

Хотите узнать, как внедрить такие подходы и выбрать оптимальный для своей системы? Загляните в захватывающее руководство, чтобы разобраться в тонкостях.

🔗 Читать статью
🔗 Зеркало
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ
ℹ️ Как устроен под капотом LinkedHashSet?

LinkedHashSet — это коллекция, обеспечивающая хранение уникальных элементов с сохранением порядка их вставки. LinkedHashSet, как и HashSet, работает с элементами за амортизированное O(1) время, но, в отличие от HashSet, сохраняет порядок добавления элементов благодаря дополнительной структуре связного списка.

🔹 Структура LinkedHashSet

LinkedHashSet базируется на HashMap, но имеет уникальную особенность — упорядочивание элементов за счёт использования связного списка поверх стандартной хеш-таблицы.

▪️ Хранение данных: LinkedHashSet использует LinkedHashMap для хранения элементов. Каждый добавляемый элемент выступает в роли ключа, а значение всегда фиксировано (обычно это объект-заглушка).
▪️ Связный список: Для поддержания порядка добавления, элементы связаны друг с другом в виде двусвязного списка. Это позволяет итерациям проходить элементы в порядке их вставки.
▪️ Уникальность элементов: Как и в HashSet, каждый элемент уникален. При попытке добавить дублирующий элемент он игнорируется, сохраняя уникальность всех значений.

🔹 Производительность

▪️ Добавление: Добавление элементов происходит за амортизированное O(1) время. LinkedHashSet вычисляет хэш элемента и индекс, где он будет храниться в массиве бакетов LinkedHashMap.
▪️ Удаление: Удаление происходит также за амортизированное O(1) время. LinkedHashSet находит элемент по хэшу, удаляет его из связного списка и освобождает место в корзине.
▪️ Поиск: Поиск происходит за амортизированное O(1) время благодаря хэш-таблице.

🔹 Использование памяти

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

🔹 Преимущества и недостатки

▪️ Преимущества:
- Сохранение порядка добавления элементов.
- Быстрая работа с элементами за амортизированное O(1) время, как и в HashSet.

▪️ Недостатки:
- Потребление ресурсов возрастает при большом количестве элементов, так как структура требует больше памяти для поддержания порядка.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как думаете, как часто следует менять работу?

⚡️ — раз в год
🔥 — раз в 2-3 года
❤️ — раз в 5-6 лет
🌚 — работу можно менять?
Please open Telegram to view this post
VIEW IN TELEGRAM
🎨 Новый канал для вдохновения — UX in GIF

Мы запустили свежий канал, где делимся идеями для дизайна интерфейсов. Всё самое стильное, оригинальное и вдохновляющее теперь в одном месте.

📌 Чем полезен канал?

→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.

👉 Подписывайтесь и вдохновляйтесь: UX in GIF
Please open Telegram to view this post
VIEW IN TELEGRAM
👔 Слишком молодой, слишком опытный: 9 причин, почему вам могут отказать после собеседования

Собеседование прошло гладко: вы подготовились, уверенно ответили на все вопросы, проявили заинтересованность и даже получили положительный фидбек. Но вместо долгожданного оффера — отказ. Почему так произошло? На самом деле, отказ может быть вызван множеством причин: от излишнего опыта до неудачной коммуникации с рекрутером.

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

📎 Разобраться в причинах
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 IntelliJ IDEA 2024.3

JetBrains выпустили новую версию IntelliJ IDEA 2024.3, и она порадовала рядом полезных фич. Вот самые интересные моменты релиза:

🔵 Логическая структура кода
Теперь окно со структурой проекта показывает не только физическое расположение файлов, но и логическую структуру. Например, если вы работаете с контроллером в Spring, то прямо в этом окне можно увидеть список эндпоинтов и их привязку.

🔵 Интеграция AI-ассистента
Новый AI-помощник теперь обладает улучшенной контекстной осведомленностью и может помогать при работе с VCS и отладкой кода. Это ускоряет процесс написания и анализа кода благодаря интеллектуальным подсказкам и оптимизациям.

🔵 Улучшенный дебаггер и HotSwap
Отладка стала еще мощнее: улучшенная функция HotSwap позволяет быстрее обновлять код во время отладки.

🔵 Поддержка Kotlin и GraalVM
Улучшена поддержка новых возможностей Kotlin, а также дебаггинг нативных изображений GraalVM, что упрощает работу с мультиплатформенными приложениями.

Это лишь краткий обзор интересных новинок. Ознакомиться со всеми подробностями релиза можно в официальном блоге JetBrains​.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Что такое BeanPostProcessor в Spring?

BeanPostProcessor — это интерфейс из Spring Framework, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring контейнере. Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:

▪️ postProcessBeforeInitialization(Object bean, String beanName) - вызывается до того, как бин будет инициализирован (до вызова метода @PostConstruct или InitializingBean#afterPropertiesSet).
▪️ postProcessAfterInitialization(Object bean, String beanName) - вызывается после инициализации бина (после завершения всех инициализационных методов).

Зачем нужен BeanPostProcessor?

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

- Добавление проксирования бинов (например, для AOP или транзакций).
- Валидация или изменение свойств бинов.
- Логирование жизненного цикла.
- Добавление кастомных аннотаций.
- Обработка маркерных интерфейсов.

Как это работает?

1️⃣ Spring сканирует контекст на наличие бинов, реализующих интерфейс BeanPostProcessor.
2️⃣ Если такие бины найдены, они применяются ко всем бинам в приложении.
3️⃣ Методы postProcessBeforeInitialization и postProcessAfterInitialization вызываются для каждого бина, который создаёт Spring.

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before Initialization: " + beanName);
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After Initialization: " + beanName);
return bean;
}
}

Результат: Вывод сообщений о каждом бине до и после инициализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
#дайджест #Javadevjob

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

▪️ Java developer
Гибрид (Москва, Санкт-Петербург, Екатеринбург), beeline
Подробнее

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

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

▪️ Java разработчик
Удалёнка, Comitas
Подробнее

▪️ Middle Java разработчик
Гибрид (Москва, Краснодар, Санкт-Петербург, Иннополис) / Удалёнка (РФ), Магнит
Подробнее

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

▪️ Senior Java developer
Офис (Москва, Липецк), НЛМК ИТ
Подробнее

▪️ Senior Java разработчик
Удалёнка, МегаФон
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет