Java Guru 🤓

channel icon
Канал с вопросами и задачами с собеседований!

Условия размещения

Цена за 48 часов в ленте 3500,00
Цена за 1 час закрепления N/A
Взаимопиар Нет
Дополнительные условия рекламы Отсутствуют
-1
12 329
подписчиков
+44
~2.2k
охват 1 публикации
0
~2
постов / день
+0,4%
18,2%
ERR % ?

Статистика

Последние публикации

Java Guru 🤓
1 мая 2024 г. 13:00
👩‍💻 Тест по Java от OTUSТест по Java от OTUS



Проверь насколько хорошо ты знаешь Java и готов освоить Spring!

Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.

👉 ПРОЙТИ ТЕСТ: https://otus.pw/swHj/

🎫 Курс можно приобрести в рассрочку

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Java Guru 🤓
1 мая 2024 г. 8:44
Какими коллекциями пользоваться в многопоточной среде?

Первый вариант – превратить в синхронизированную обычную коллекцию, вызвав соответствующий ее типу метод Collections.synchronized*(). Самый общий и самый примитивный способ, создает обертку с синхронизацией всех операций с помощью synchronized.

Если работа с коллекцией состоит в основном из чтения, лучшая в плане производительности альтернатива – CopyOnWriteArrayList, и содержащий его в реализации CopyOnWriteArraySet. Потокобезопасность достигается копированием внутреннего массива при любой модификации, оригинальный массив остается immutable. Program order достигается модификатором volatile на внутреннем массиве.

Третий вариант – использование Concurrent-коллекций:
🔘 Неблокирующие хэш-таблицы ConcurrentSkipListMap, ConcurrentHashMap и ConcurrentSkipListSet (хэш-таблица в основе реализации)
🔘 Неблокирующие очереди ConcurrentLinkedQueue и ConcurrentLinkedDeque
🔘 Большой набор различных блокирующих очередей
Java Guru 🤓
30 апреля 2024 г. 12:01
Как наладить взаимодействие Kafka и Clickhouse?

Apache Kafka и ClickHouse — два популярных инструмента обработки и анализа данных, которые так нужны дата-инженерам и разработчикам.

👉 На открытом практическом урокеоткрытом практическом уроке от OTUS опытный эксперт расскажет, как превратить две этих технологии в эффективный тандем!

— Рассмотрим Apache Kafka. Познакомимся с ClickHouse.
— Узнаем, как организовать загрузку данных из Kafka в ClickHouse.
— Ответим на все возникающие вопросы.

Встречаемся 8 мая в 20:00 мск в преддверии старта курса «Apache Kafka».
⚡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cwuAT6https://vk.cc/cwuAT6

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruwww.otus.ru
Java Guru 🤓
30 апреля 2024 г. 9:49
Что делает volatile?

volatile
volatile – ключевое слово для работы с многопоточностью. Не то же самое, что volatile в C++, не обязано делать что-либо с кэшем процессора. Оказывает на поле объекта ровно два эффекта.

Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для long и double, и не на всех платформах. Для остальных типов полей это верно и так.

Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.

Для полного понимания темы рекомендуется к просмотру доклад
Алексея Шипилёва и документация. Лучше всего эффект volatile иллюстрирует задача из этого доклада, которую часто и дают в качестве этого вопроса. Вопрос – что выведет данный код:

int a; int b;

// thread 1:
a = 1;
b = 2;

// thread 2:
System.out.print(b);
System.out.print(a);

Трюк в том, что помимо очевидных 21 (поток 2 отработал после 1), 00 (поток 2 отработал до 1, переменные еще не инициализированы) и 01 (поток 2 сработал между записями), может быть и неожиданные 20. Дело в том, что для операторов одного потока действует program order, он гарантирует хотя бы видимость правильной последовательности операций. Между потоками необходим «мост» из happens-before. Его даст применение модификатора volatile к переменной b, неожиданный результат 20 будет исключен.

Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
Java Guru 🤓
28 апреля 2024 г. 14:00
В мае стартует новая программа «Java разработчик. Уровень Специалист».

Обучение проходит в мини-группе с преподавателем и живой практикой. Часть материалов — для самообучения.

Программа включает в себя:
📌 Применение ООП и функциональной парадигмы,
📌 Spring Framework, 
📌 работу с БД, 
📌 архитектуру REST, 
📌 вспомогательные инструменты Java-разработчика,
📌 продвинутые аспекты применения Java, 
📌 стандартную библиотеку Java II.

👉 Узнать подробнее 👈

Бонусы:
✔️ всем, кто запишется на программу до 17 мая, предоставляем бесплатный доступ к первым 5 урокам на 3 дня
✔️ подготовка к сдаче Java-сертификации и скидка 50% на ее прохождение
✔️ бесплатный курс «Разработка на Java и Spring с помощью Chat GPT: от составления ТЗ до модульного тестирования»

Реклама. АНО ДПО "УЦ ИБС". ИНН 7713388004. erid: LjN8K6Ntz
Java Guru 🤓
28 апреля 2024 г. 8:58
Что такое synchronized?

Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется this, статического – .class текущего класса.

Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока synchronized на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.

Блок synchronized также необходим для использования методов wait, notify, notifyAll.
Java Guru 🤓
26 апреля 2024 г. 13:01
Сертификат по кибербезопасности на новом курсе для старших разработчиков Java

🚀 12 мая мы запускаем юбилейный поток курса Senior Java Developer с новой программой.

Что изменилось? Мы усилили курс новым модулем по кибербезопасности.

❓Зачем Java-разработчику разбираться в кибербезопасности? Логичный вопрос. И вот что мы ответим: наши партнеры провели опрос: на что бизнес обращает внимание при выборе платформы корпоративного банкинга. 100% ответов — защищенный доступ к финансам в личном кабинете с использованием двухфакторной аутентификации. Умеешь защищать данные при разработке — продукт еще больше ценят на рынке. Все просто!

✅ Итак, что тебя ждет на курсе:
- Развертывание приложений с помощью DevSecOps
- Моделирование схемы контроля доступа для систем и приложений
- Углубленное изучение Java Concurrency и Spring
- Архитектура — паттерны проектирования, Docker, Kubernetes
- Двойная сертификация по Java и кибербезопасности

💥И это лишь часть программы нового курса. Специально для тебя открыли 5 мест с индивидуальным менторским сопровождением. После прохождения шести образовательных модулей мы поможем тебе с трудоустройством у наших партнеров: Сбера, СДЭК и ЦБ.

➡️ Почитать подробности и оставить заявку можно здесь: https://clck.ru/3AJExxhttps://clck.ru/3AJExxhttps://clck.ru/3AJExx

Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvhKyV2
Java Guru 🤓
26 апреля 2024 г. 8:46
Как прочитать InputStream в строку?

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

В общем виде все решения выглядят так. Заводится буфер – массив символов. Поток направляется в этот буфер. По заполнению данные из массива присоединяются в хвост строки-результата.

Простой способ – использовать трюк со сканером. Вообще класс Scanner читает из потока подстроки, разделенные указанным символом. Когда нужно прочитать всю строку сразу, в качестве разделителя устанавливается "\\A" – спецсимвол «начало строки». Это решение просто в реализации, но имеет проблемы. Размер внутреннего буфера фиксирован (1024 символа), а логика поиска разделителя плохо влияет на производительность.

Хорошее решение для продакшна – читать в собственный массив-буфер непосредственно методом
InputStream.readInputStream.read, либо обернув поток в InputStreamReader. Данные из буфера затем переправляются в строку через StringBuilder или ByteArrayOutputStream. За готовой реализацией можно обратиться в библиотеки Apache Commons IO и Google Guava. Полный код реализации и сравнение производительности описаны на stackoverflow.

На интервью этот вопрос часто возникает как часть практической задачи, для консольного ввода-вывода. Поэтому, если вы идете на собеседование со своим компьютером, и неуверенно владеете классами работы с потоками, стоит заранее подготовить шпаргалку с кодом.
Java Guru 🤓
25 апреля 2024 г. 13:45
👩‍💻👩‍💻Как писать более чистый код на Java с помощью перегрузки методов?

Перегрузка — очень мощная техника для случаев, когда нужно одинаковое имя метода с разными параметрами. Вместо того, чтобы дублировать имя метода и добавлять беспорядок в ваш код, вы можете просто перегрузить его. Это позволяет сохранять код чистым, а также снижает риск того, что дублирующие методы сломают часть системы.

Как это провернуть? Расскажет опытный эксперт на открытом практическом уроке от OTUS! Встречаемся 26 апреля в 20:00 мск в преддверии старта курса «Углубленное изучение языка Java».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!

➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cwpp82

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Java Guru 🤓
25 апреля 2024 г. 7:58
Как разбить строку на слова?

StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.

Вместо него рекомендуется использовать метод String.split(). Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.

Другой подходящий метод – Pattern.split(). Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split(). Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.
Java Guru 🤓
24 апреля 2024 г. 17:10
erid: 2RanyoKCft4

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

Ключевые направления программы: Backend, Frontend, Management, QA, Data Science, Mobile, Design, Web 3, System Аnalysis, а также дискуссионный народный поток Kvartirniki и вдохновляющие Keynote выступления от айти-звёзд.

Изюминка CodeFest — неформальное общение, которого много, которое невероятно дружелюбное, и зачином для которого служат те самые выступления в ключевых секциях. Начали с доклада в зале — закончили спонтанным митапом в холле.

Присоединяйтесь к невероятной атмосфере конференции:

■ 25-26 мая, Новосибирск, Экспоцентр.
■ 1800 участников на одной площадке.
■ Участие офлайн и онлайн.
■ Более 120 докладов.
■ Насыщенная программа от партнёров конференции.

Приезжайте командой, участвуйте лично.

Регистрация 👉 https://l.codefest.ru/javatasks

Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
Java Guru 🤓
24 апреля 2024 г. 15:35
Как применить регулярное выражение в Java?

Регулярные выражения – мощный механизм работы со строками. Здесь мы не будем говорить о регулярных выражениях в целом, поговорим об их использовании в Java. Это становится возможно благодаря пакету java.util.regex стандартной библиотеки.

Работа с регулярными выражениями в Java начинается с класса Pattern. Это представление самого выражения, без привязки к целевому тексту. Создать его можно компиляцией строки, с помощью фабричного метода Pattern.compile(). Паттерн иммутабельный и потокобезопасный.

Matcher – регулярное выражение, примененное к конкретному тексту. Пораждается вызовом метода Pattern.matches(). Одним паттерном можно порождать несколько разных матчеров. В отличие от паттерна, матчер мутирует. Он не безопасен для многопоточной среды. Основные операции регулярных выражений – перебор совпадений, доступ к группам, замена – реализованы именно в этом классе.

Работа с экземпляром Matcher похожа на работу с итератором. Результат метода matches() просто скажет, соответствует ли строка шаблону. Но после его вызова матчер поменяет состояние. Теперь, из него можно получить группы, позицию совпадения в тексте, а также произвести замену.

В объекте шаблона Pattern реализованы несколько методов-сокращений, чтобы не использовать Matcher явно. Например, просто проверить строку на соответствие выражению можно одним методом Pattern.matches().
Java Guru 🤓
24 апреля 2024 г. 11:40
♨️ Хочешь выйти на новый профессиональный уровень джавист?
- Осваивай Spring!


Тест на знание языка Java Тест на знание языка Java

— Ответь на 21 вопрос
и проверь, насколько хорошо ты знаешь язык Java и готов освоить Spring. Сможешь сдать — пройдёшь на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!

👉 ПРОЙТИ ТЕСТ ОНЛАЙН-КУРСА "Разработчик на Spring Framework": https://otus.pw/d5J7/

🎫 Курс можно приобрести в рассрочку

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Java Guru 🤓
24 апреля 2024 г. 11:00
Из чего состоит String?

Ответ как обычно зависит от версии Java. Два поля, которые присутствовали во всех версиях – массив символов char[] value и int hash. В поле hash кэшируется хэш-сумма при первом подсчете для соблюдения контракта метода hashCode.

До Java 7 были еще поля offset и count – чтобы переиспользовать без пересоздания массивы из билдеров и других строк. В современной джаве от этого отказались в угоду меньшего потребления памяти.

Изначально все строки хранились в кодировке UTF-16, каждый символ занимал по два байта и умещался в char. Однако выяснилось, что статистически большинство строк содержит только ASCII-символы, которые вмещаются в один байт и составляют кодировку LATIN-1. То есть старший байт в большинстве char остается нулевым, и строки наполовину состоят из пустоты. А примерно четверть памяти приложений состоит из одних только строк.

В Java 6 была введена экспериментальная фича Compressed Strings – способность строки хранить строки в LATIN-1 в массиве byte вместо char. С этой фичей был ряд проблем, и позднее ее убрали.

Снова сжатие строк появилось в Java 9 – теперь оно называется Compact Strings и включено по умолчанию. В классе String появилось поле coder, которое переключает кодировки, и статический флаг COMPACT_STRINGS, выключающий фичу вообще. Тип массива value окончательно изменился с char[] на byte[].
Java Guru 🤓
24 апреля 2024 г. 9:30
❓Хотите прокачать скиллы в автоматизации тестирования на Java?

👉 Ждем вас на бесплатном практическом уроке «Модульное и интеграционное тестирование при помощи Spring Boot» от OTUS.

На вебинаре разберем:
- модульное тестировании при помощи Spring Boot;
- интеграционное тестирование при помощи Spring Boot;
- написание тестов на отдельные фрагменты SUT. 

👉 Для участия зарегистрируйтесь https://otus.pw/k43m/?erid=LjN8K528h

⏰ Встречаемся 24 апреля в 20:00 мск в рамках курса «Java QA Engineer. Professional».

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Java Guru 🤓
24 апреля 2024 г. 8:43
Как обойти строчку?

Для хранения строк в Java в общем случае используется кодировка UTF-16. Для полного понимания вопроса необходимо понимать ее особенности: что такое суррогатные пары и плоскости юникода. Конкретнее, что один символ в обычном понимании слова называется code point, и представляется одним или двумя значениями типа char. Значит, корректный ответ нужно начать с уточнения: подразумевается ли обход значений char или code point.

Из этого следует, что и длина строки, верхняя граница итерации – тоже понятие неоднозначное. Метод length() на самом деле возвращает не количество Unicode-символов, а количество значений char. Реальную логическую длину (количество кодовых точек) покажет метод codePointCount(). Нужно помнить, что чтобы обнаружить суррогатные пары, внутри ему придется проитерировать по символам.

Итерироваться по char можно либо получая по одному символу с помощью метода charAt(), либо со всем массивом сразу, методом toCharArray(). В случае с массивом создается копия внутреннего значения – это естественно медленнее, зато этот массив-копию можно мутировать. Работать с суррогатными парами придется вручную, для этого в классе Character есть специальные методы.

Другой вариант – сразу оперировать методами codePointAt() и codePointBefore(). Параметром указываются индексы массива char, но результатом будут кодовые точки типа int.

В Java 8 появился новый удобный способ обхода – методы chars() и codePoints(). Они возвращают IntStream из символов и кодовых точек соответственно. Носителем результирующих стримов выступает оригинальное внутреннее значение строки, копирование массива не требуется.
Java Guru 🤓
23 апреля 2024 г. 17:25
⁉️ Как связаны Scala и Apache Kafka?

Если вы инженер данных или разработчик, который хочет эффективно работать с большими данными и микросервисной архитектурой, вам нужно это знать!

💻 Приходите на бесплатный практический урок «Введение в язык программирования Scala»«Введение в язык программирования Scala» от OTUS, где опытный эксперт разберет:

- общие принципы и функциональность Scala;
- средства разработки, использующиеся в Apache Kafka;
- языковые средства Scala 2 и 3;
- основы функционального программирования;
- взаимодействие с Kafka через Alpakka.

👉 Встречаемся 25 апреля в 20:00 мск в рамках курса «Apache Kafka».

🔥 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cwmB45https://vk.cc/cwmB45

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruwww.otus.ru
Java Guru 🤓
23 апреля 2024 г. 16:15
Какие бывают строковые классы?

Кроме очевидного класса String, в стандарте Java существует еще StringBuffer и StringBuilder. Класс String иммутабелен, а эти два вспомогательных класса реализуют для него паттерн Builder и служат способом редактирования строки без относительно дорогого пересоздания объекта.

Все методы StringBuffer синхронны. В Java 1.5 ему на замену пришел несинхронизированный вариант StringBuilder. Эта ситуация аналогична HashMap и Hashtable. В остальном эти два класса почти ничем не отличаются, имеют одинаковый набор методов и конструкторов.

Для буфера и билдера не работает синтаксический сахар строк:
🔘 Их нельзя создать литералом, вместо этого используется обычный конструктор;
🔘 Нельзя конкатенировать оператором +, вместо этого используются обычные методы insert и append.

Сам оператор конкатенации константных выражений, компилируется в интернированную строку, но для не-констант неявно использует StringBuilder.
Java Guru 🤓
23 апреля 2024 г. 13:01
Новосибирск, 25 апреля приглашаем на митап IT Talk by Sber для Java- и DevOps-разработчиков! 🤩

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

На митапе обсудим интересные темы:

👉 Советы для оптимизации сборки Java-проектов, практики CI и автоматизации сборки приложений.

👉 Что такое код с точки зрения законодательства, кому он принадлежит и какие есть права у автора кода?

👉 Инциденты в проме: что делать и не делать, чтобы устранить инцидент, и что на самом деле происходит, когда вы видите «Сервис недоступен, повторите операцию через 5 минут или позже»?

Встречаемся 25 апреля с 17:30 до 22:00 в лофте FoodFactory: Новосибирск, ул. Коммунистическая, 14.

Регистрируйтесь по ссылке!
Java Guru 🤓
23 апреля 2024 г. 10:50
new String("Hello_42") == "Hello_" + 42?

Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.

Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.

Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.