seniorjavist | Unsorted

Telegram-канал seniorjavist - Senior Java Developer

22676

№ 4931127152 Изучаем Java. По вопросам сотрудничества: @adv_and_pr Канал на бирже: https://telega.in/c/seniorjavist

Subscribe to a channel

Senior Java Developer

Инструментация байт-кода Java

В рамках текущей статьи будет рассказано о способах инструментации байт-кода java или, другим языком, внесения изменений в компилированные файлы java .class. Здесь будут приведены примеры работы с фреймворками Javaassist и ASM и базовое описание байт-кода.

Смотреть статью

Читать полностью…

Senior Java Developer

Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

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

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈

Читать полностью…

Senior Java Developer

Что такое «пул потоков»?

Создание потока является затратной по времени и ресурсам операцией. Количество потоков, которое может быть запущено в рамках одного процесса также ограниченно. Чтобы избежать этих проблем и в целом управлять множеством потоков более эффективно в Java был реализован механизм пула потоков (thread pool), который создаётся во время запуска приложения и в дальнейшем потоки для обработки запросов берутся и переиспользуются уже из него. Таким образом, появляется возможность не терять потоки, сбалансировать приложение по количеству потоков и частоте их создания.

Начиная с Java 1.5 Java API предоставляет фреймворк Executor, который позволяет создавать различные типы пула потоков:

• Executor - упрощенный интерфейс пула, содержит один метод для передачи задачи на выполнение;
• ExecutorService - расширенный интерфейс пула, с возможностью завершения всех потоков;
• AbstractExecutorService - базовый класс пула, реализующий интерфейс ExecutorService;
• Executors - фабрика объектов связанных с пулом потоков, в том числе позволяет создать основные типы пулов;
• ThreadPoolExecutor - пул потоков с гибкой настройкой, может служить базовым классом для нестандартных пулов;
• ForkJoinPool - пул для выполнения задач типа ForkJoinTask;
... и другие.

Методы Executors для создания пулов:
• newCachedThreadPool() - если есть свободный поток, то задача выполняется в нем, иначе добавляется новый поток в пул. Потоки не используемые больше минуты завершаются и удалются и кэша. Размер пула неограничен. Предназначен для выполнения множество небольших асинхронных задач;
• newCachedThreadPool(ThreadFactory threadFactory) - аналогично предыдущему, но с собственной фабрикой потоков;
• newFixedThreadPool(int nThreads) - создает пул на указанное число потоков. Если новые задачи добавлены, когда все потоки активны, то они будут сохранены в очереди для выполнения позже. Если один из потоков завершился из-за ошибки, на его место будет запущен другой поток. Потоки живут до тех пор, пока пул не будет закрыт явно методом shutdown().
• newFixedThreadPool(int nThreads, ThreadFactory threadFactory) - аналогично предыдущему, но с собственной фабрикой потоков;
• newSingleThreadScheduledExecutor() - однопотоковый пул с возможностью выполнять задачу через указанное время или выполнять периодически. Если поток был завершен из-за каких-либо ошибок, то для выполнения следующей задачи будет создан новый поток.
• newSingleThreadScheduledExecutor(ThreadFactory threadFactory) - аналогично предыдущему, но с собственной фабрикой потоков;
• newScheduledThreadPool(int corePoolSize) - пул для выполнения задач через указанное время или переодически;
• newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) - аналогично предыдущему, но с собственной фабрикой потоков;
• unconfigurableExecutorService(ExecutorService executor) - обертка на пул, запрещающая изменять его конфигурацию;

Читать полностью…

Senior Java Developer

👨🏻‍💻 AI в бэкенд-задачах — на Podlodka Backend Crew

Код теперь может написать агент, но за результат всё ещё отвечаете вы. Организаторы Podlodka Backend Crew собрали конференцию о том, как работать с бэкендом после того, как AI написал код.

Причём в программе нет докладов в жанре «у нас все получилось» — только реальная практика. Конференция пройдёт с 26 по 30 октября.

🧠️️️️️ Участники сезона:

• Разберут пулл‑реквесты от агента и попробуют предотвратить возможные инциденты на рулетке кейсов

• Выяснят, какие неожиданные ловушки скрываются в OpenAPI и на что обращать внимание при разработке контрактов

• Разберут антипаттерны в AI-юнит-тестах, узнают, как их избежать с помощью современных инструментов, и заберут себе новый агентский скилл

• Спроектируют бэкенд дейтинг-приложения на архитектурной кате и решат, где в нём действительно нужен AI.

Формат Podlodka Backend Crew
— комфортный онлайн: 5 дней, утренние и вечерние сессии в Zoom.

Отдельный плюс — цена: заметно ниже привычных конференций, при этом вы не просто слушаете о чужом опыте, а разбираете PR и отвечаете за релиз, проектируете систему в команде и расследуете чужие провалы.

Такого вовлечения не получить на обычной конференции.

🔗 Изучайте программу и присоединяйтесь: https://podlodka.io/becrew

Скидка по промокоду backendSenior

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое сигнатура метода?

Это уникальная строка, которая описывает типы и порядок аргументов, а также возвращаемый тип метода. Сигнатура используется компилятором Java для различения методов с одинаковым именем, но отличающихся по своим параметрам.

Читать полностью…

Senior Java Developer

🗄 Вебинар: JDBC: как Java-приложения взаимодействуют с базами данных
JDBC позволяет Java-приложениям работать с базами данных. Разберём подключение, SQL-запросы, транзакции и обработку ошибок.

💬 О чём поговорим
- Как подключиться к СУБД с помощью DriverManager и работать с Connection.
- Как выполнять SQL-запросы через Statement и PreparedStatement и получать результаты через ResultSet.
- Как управлять транзакциями: autocommit, commit и rollback.
- Как использовать SQLException, чтобы разобраться в причинах ошибки при выполнении запроса.

🎯 Результат урока:
- Вы разберётесь, как подключать Java-приложение к СУБД, выполнять SQL-запросы и работать с результатами.
- Узнаете, как управлять транзакциями и обрабатывать ошибки при обращении к базе данных.

👉 Для участия зарегистрируйтесь: https://otus.pw/y1U7/

Вебинар проходит в рамках старта курса «Java-разработчик», который помогает освоить современную Java-разработку: от основ и первых программ до серверных приложений, баз данных, Spring, контейнеров и очередей сообщений. Программа регулярно обновляется под требования рынка. 🚀

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Читать полностью…

Senior Java Developer

🔥 Почему ты получаешь отказ после «вроде норм собеса»?

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

Чтобы помочь с этим, ребята из ШОРТКАТ собрали 50 сложных вопросов с Java-собеседований и ответы сильного кандидата.

Они проанализировали более 100 мок-интервью и собрали в одном файле реальные вопросы и примеры ответов, на которые стоит ориентироваться при подготовке 🔥

🎁 Забирай файл бесплатно в боте 👉 @shortcut_sh_bot

А заодно сможешь зарегистрироваться на бесплатное тестовое собеседование с Java-разработчиком!

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

Забирай материалы и используй возможность подготовиться к следующему собесу 👇
@shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Senior Java Developer

Узнаем размер памяти компьютера

Для получения информации о памяти компьютера в Java можно использовать класс Runtime.

Читать полностью…

Senior Java Developer

Примитивные типы

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

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что выведет эта программа?

Ответ:
Программа напечатает “num1 == num2”. Если мы сравниваем две ссылки на объекты с помощью ==, значение всегда будет «false». Но в этом примере переменные num1 и num2 автоупаковываются (autoboxing) из-за Integer-кэширования. Вот почему num1 == num2 возвращает значение «true». Не забудьте, что Integer-кэширование актуально только для значений от -128 до 127.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException.

В примере возникает ошибка, потому что Collections.emptyList() возвращает пустой список без возможности добавления элементов.

Читать полностью…

Senior Java Developer

➡️ Objenesis

Objenesis — это Java-библиотека, которая позволяет создавать объекты классов без вызова их конструкторов. Это особенно полезно в тех случаях, когда нужно создать объект для сериализации, прокси или в ситуациях, когда конструктор имеет побочные эффекты, которые следует избегать.

🗣 Objenesis — это отличный инструмент для тех, кто работает с фреймворками, связанными с сериализацией или AOP, и нуждается в возможности создания объектов без вызова их конструкторов. Если вы сталкивались с проблемами при создании экземпляров классов с приватными конструкторами или сложной инициализацией, Objenesis может стать вашим незаменимым помощником.

🔗 Ссылочка на доку

Читать полностью…

Senior Java Developer

⚠️ Избегайте конкатенации строк в больших циклах

При добавлении двух строк в цикле (for, while, do-while), использование оператора + приводит к растрате памяти и увеличению времени выполнения.

🗣️ Это происходит из-за создания нового объекта String каждый раз при добавлении новой строки. Лучшей практикой является использование класса StringBuilder.

Читать полностью…

Senior Java Developer

➡️ Zt-Exec — простая и удобная работа с процессами в Java

Zt-Exec — это легковесная библиотека для выполнения и управления внешними процессами в Java-приложениях. Она предоставляет удобный API для запуска командных процессов, чтения их вывода и обработки ошибок, предлагая более гибкие возможности по сравнению со стандартным ProcessBuilder.

🗣 Zt-Exec — отличный выбор, если нужно просто и эффективно запускать внешние команды или управлять процессами прямо из Java-кода.

🔗 Ссылочка на доку

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Если оператор return содержится и в блоке catch и в finally, какой из них “главнее”?

Если оператор return встречается как в блоке catch, так и в блоке finally, то return в блоке finally имеет больший приоритет и будет выполнен в любом случае.

Порядок выполнения такой конструкции будет следующий:
— Выполняется код в теле try.
— Если возникает исключение, управление передается в блок catch.
— В блоке catch может выполниться return, возвращающий значение из метода.
— Далее обязательно выполнится блок finally, даже если в catch уже был return.
— Если в finally есть оператор return, он перезапишет любое значение, возвращаемое ранее.
— Метод вернет значение, указанное в return блока finally.

Читать полностью…

Senior Java Developer

Что представляет собой «обмен сообщениями»?

Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. В ООП посылка сообщения (вызов метода) — это единственный путь передать управление объекту. Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод. Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding).

Пусть требуется создать физическую модель, описывающую сталкивающиеся шары разных размеров. Традиционный подход к решению этой задачи примерно таков: определяется набор данных, описывающих каждый шар (например, его координаты, массу и ускорение); каждому шару присваивается уникальный идентификатор (например, организуется массив, значение индекса которого соответствует номеру шара), который позволит отличать каждый из шаров от всех других. Наконец, пишется подпрограмма с названием, скажем, bounce; эта процедура должна на основе номера шара и его начальных параметров соответствующим образом изменять данные, описывающие шар. В отличие от традиционного подхода объектно-ориентированная версия программы моделирует каждый из шаров посредством объекта. При этом объект, соответствующий конкретному шару, содержит не только его параметры, но и весь код, описывающий поведение шара при различных взаимодействиях. Так, каждый шар будет иметь собственный метод bounce(). Вместо того, чтобы вызывать подпрограмму bounce с аргументом, определяющим, скажем, шар №3, необходимо будет передать объекту «шар №3» сообщение, предписывающее ему выполнить столкновение.

Читать полностью…

Senior Java Developer

Преобразуем строку в объект

Используем метод Class.forName(). Этот метод принимает параметр className , который является классом, для которого требуется его экземпляр.

Читать полностью…

Senior Java Developer

Дайте определение терминам «простой», «составной» (composite), «потенциальный» (candidate) и «альтернативный» (alternate) ключ.

Простой ключ состоит из одного атрибута (поля). Составной — из двух и более.

Потенциальный ключ - простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись.

Из множества всех потенциальных ключей набора данных выбирают первичный ключ, все остальные ключи называют альтернативными.
#вопросы_с_собеседований

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое «фреймворк Fork/Join»?

Фреймворк Fork/Join, представленный в JDK 7, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.

• Этап Fork: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.
• Этап Join: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.

Для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort — массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.

Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует work-stealing алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.

Читать полностью…

Senior Java Developer

conductor-oss/conductor

Conductor - это платформа, изначально созданная в Netflix для оркестровки микросервисов и событий, написанный на Java.

Conductor OSS поддерживается командой разработчиков в Orkes вместе с членами сообщества с открытым исходным кодом.

git remote set-url origin https://github.com/conductor-oss/conductor

https://github.com/conductor-oss/conductor

Читать полностью…

Senior Java Developer

LibGDX

LibGDX — это кроссплатформенный фреймворк для разработки 2D- и 3D-игр на Java. Он позволяет создавать игры для настольных компьютеров, мобильных устройств, веб-браузеров и даже консолей. LibGDX популярен среди разработчиков игр благодаря своей простоте использования, производительности и большому сообществу.

#для_продвинутых

Читать полностью…

Senior Java Developer

Метод Math.ceil()

Метод дает целое число с нулевой дробной частью, ближайшее к числу аргумента справа, другими словами — округляет дробь в большую сторону. Возвращается переменная типа double.

Читать полностью…

Senior Java Developer

Комбинирование хеш-таблиц

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

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Какими свойствами обладает порождаемое equals() отношение эквивалентности?

☕️ Рефлексивность: для любой ссылки на значение x, x.equals(x) вернет true;
☕️ Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.
☕️ Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернёт true;
☕️ Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация, используемая при сравнении объектов, не поменялась.

Для любой ненулевой ссылки на значение х выражение х.equals(null) должно возвращать false.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что выведет эта программа?

Ответ:
Первый оператор вывода напечатает «false», второй — «true». Так происходит из-за ошибки округления чисел с плавающей точкой. Только степени двойки можно точно представить в двоичной записи. Числа, которые не являются степенями двойки, округляются так, чтобы поместиться в ограниченное количество битов. В этом примере Java использует использует тип double, поэтому для представления десятичных чисел доступно только 64 бита. Следовательно, 0.1*3 не будет равняться 0.3.

Читать полностью…

Senior Java Developer

➡️ MapStruct

MapStruct — это библиотека для автоматического преобразования данных между Java объектами. Она упрощает создание мапперов и конвертеров, минимизируя необходимость ручного написания кода для преобразования данных между различными слоями приложения.

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

🔗 Ссылочка на доку

Читать полностью…

Senior Java Developer

➡️ JCTools

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

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

🔗 Ссылочка на доку

Читать полностью…

Senior Java Developer

🤺 Почему ты получаешь отказ после «норм собеса»?

Дело не в знаниях — ты просто не знаешь, что реально проверяют на собеседованиях.

Решение — знать, чего от тебя ждёт интервьюер, и уметь правильно донести свою мысль.

Для этого ребята из ШОРТКАТ (менторской программы для разработчиков) собрали в один файл ОТВЕТЫ НА 50 СЛОЖНЫХ ВОПРОСОВ с Java-собеседований 🔥

Они проанализировали более 100 мок-интервью и собрали внутри реальные вопросы + ответы сильного кандидата.

⚠️ Забрать можно бесплатно в боте — @shortcut_sh_bot

В том же боте ты сможешь зарегаться на эфир с бесплатным тестовым интервью на Java-разработчика!

Эфир пройдёт 7 октября в 19:00 МСК.
Его проведёт Виктор Анохин — Senior-разработчик из Wildberries, ex-Билайн.

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

Всё это бесплатно, тебе нужно только нажать на ссылку и забрать все плюшки ↓
@shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Как работают методы wait() и notify()(notifyAll())?

Эти методы определены у класса Object и предназначены для взаимодействия потоков между собой при межпоточной синхронизации.

• wait(): освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет метод notify()
/notifyAll();
• notify(): продолжает работу потока, у которого ранее был вызван метод wait();
• notifyAll(): возобновляет работу всех потоков, у которых ранее был вызван метод wait().

Когда вызван метод wait(), поток освобождает блокировку на объекте и переходит из состояния Работающий (Running) в состояние Ожидания (Waiting). Метод notify() подаёт сигнал одному из потоков, ожидающих на объекте, чтобы перейти в состояние Работоспособный (Runnable). При этом невозможно определить, какой из ожидающих потоков должен стать работоспособным. Метод notifyAll() заставляет все ожидающие потоки для объекта вернуться в состояние Работоспособный (Runnable). Если ни один поток не находится в ожидании на методе wait(), то при вызове notify() или notifyAll() ничего не происходит.

Поток может вызвать методы wait() или notify() для определённого объекта, только если он в данный момент имеет блокировку на этот объект. wait(), notify() и notifyAll() должны вызываться только из синхронизированного кода.

Читать полностью…

Senior Java Developer

Блокирующий метод

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

При вызове блокирующего метода поток переходит в состояние ожидания и не выполняет других операций.

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

Например, метод readLine() блокирует поток до тех пор, пока пользователь не введет строку и не нажмет Enter.
После ввода данных метод возвращает управление потоку и программа выводит введенную строку.

Таким образом, блокирующий вызов позволяет приостановить выполнение кода до наступления нужного события.

#это_база

Читать полностью…
Subscribe to a channel