Java Guru 🤓
13.3K subscribers
922 photos
15 videos
777 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
👩‍💻 Как правильно использовать области действия переменных в Java и как этот навык поможет вам при подготовке к сертификации?

🔌 Ждем вас на открытом вебинаре 16 сентября в 20:00 мск.

Где мы разберем:

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

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

🎙 Спикер Дмитрий Коган — опытный разработчик, председатель совета предприятия в DXC, публицист, спортивный журналист и блогер.

Встречаемся в преддверии старта курса «Углубленное изучение языка Java».
Все участники вебинара получат специальную цену на обучение!

🎁 Подарок личная консультация с руководителем курса Дмитрием Коганом, всем купившим курс после открытого урока.

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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2🔥2
Как получить текущий метод

В общем виде задача сводится к получению текущего стек-трейса, и взятию его верхнего элемента. Гарантированного способа не существует, потому что JVM имеет право «терять» фреймы стека (то есть методы цепочки вызовов) при оптимизации.

1. new Exception().printStackTrace(printStream)
Печатает стек-трейс в текстовом виде в поток. Первой строкой выводится toString() объекта Exception, далее стек вызовов до места создания исключения. Соответственно, из потока нужно будет достать и распарсить вторую строку. В зависимости от JVM формат вывода может отличаться.

2. Thread.currentThread().getStackTrace()
3. new Exception().getStackTrace()
Более красивые способы. Возвращают уже массив готовых объектов-фреймов, нужно только взять первый элемент. Эти вызовы дорогие, они всегда загружают весь стек, даже если нужен первый фрейм. От класса-владельца метода в возвращаемом StackTraceElement доступна только строка имени, для доступа через Reflection придется загружать его вручную.

4. StackWalker.getInstance(options, depth).walk(s -> ...)
Самый продвинутый способ, доступный с Java 9 – специально предназначенный для этого класс. Параметрами метода getInstance() можно ограничивать необходимую глубину и детализацию стека. Результаты – экземпляры StackFrame – содержат готовый для рефлекшна Class<?> вызывающего объекта.
👍14🔥3🥰2
Уже завтра тестовое собеседование на Middle Java-разработчика

Завтра, 11 сентября в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
1. Алексей Ушаровский, старший разработчик в немецкой Deutsche Boerse с опытом работы в Oracle, Сбертех, ePam и NCR будет задавать реальные вопросы и задачи разработчику-добровольцу
2. Алексей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Алексею

Что узнаешь на прямом эфире от ШОРТКАТ:
- Чего ждут от кандидатов на Middle позиции в Java-разработке
- Какие вопросы задают на интервью и зачем
- Как подготовиться к собесу, чтобы получить оффер

Это бесплатно?
Бесплатно

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqvh795Z
👍4🔥1
Перечислите стандартные функциональные интерфейсы

Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:

Функции
Обычная обобщенная функция – интерфейс Function<T, R>. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).

Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction<T, U, R>, ToXBiFunction<T, U>.

Поставщики (Suppliers)
Интерфейсы Supplier<T>, XSupplier – не принимают ничего, возвращают (поставляют) значение.

Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T, U> и XYConsumer, потребляет два параметра.

Предикаты
Predicate<T>, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.

Операторы
Унарный (UnaryOperator<T>) и бинарный (BinaryOperator<T>) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.
👍18🔥5
📚 Пройди тест на знание Java и получи доступ к 6️⃣🔤 открытым урокам курса «Разработчик на Spring Framework».

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

➡️ НАЧАТЬ ТЕСТИРОВАНИЕ

А еще, приглашаем посетить наш бесплатный открытый урок «Как эффективно использовать OAuth 2 в Spring-приложениях?», который пройдет онлайн, 13 сентября в 20:00 мск.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
Как из Java приложения запустить другую программу?

Самый простой и базовый способ – с помощью метода Runtime.getRuntime().exec(). В качестве параметра ему передается строка системной команды. Опциональные можно передать рабочую директорию, и переменные окружения в виде массива строк "имя=значение". Если команде нужны аргументы, они передаются либо массивом, либо в той же строке команды через пробелы.

Рекомендуемый, и более управляемый способ – использование класса ProcessBuilder. Он же применяется внутри метода exec. Билдер дает, например, средства для использования в команде пайплайнов и редиректов ввода-вывода.

В результате запуска команды создается объект класса Process. Его можно сконвертировать в более современный (Java 9+) и функциональный ProcessHandle. Через эти объекты идет работа с вводом-выводом процесса, его характеристиками и статусом.

Команда запускается в отдельном подпроцессе операционной системы. Это значит, что лозунг «Write once, run anywhere» перестает здесь работать – ваша программа становится платформо-зависимой. Обращение к ОС, а тем более выделение нового процесса обычно занимает немало ресурсов компьютера. Запуск внешних программ не считается плохой практикой, но всё-таки при возможности стоит его избегать.
👍172🔥2
Java Developer Middle+/Senior/Lead

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

Обязанности:
Разрабатывать внешние и внутренние продукты
Прорабатывать и реализовать интеграционные решени
Требования:
Опыт разработки на Java от 3 лет
Опыт коммерческой разработки на Java 11+ или Kotlin
Опыт коммерческой разработки с любым из фреймворков: Spring Boot, Quarkus, Micronaut или Vert.x
Опыт коммерческой разработки с одним из контейнеризаторов: Kubernetes, Docker или OpenShift
Опыт коммерческой разработки с одним из брокеров: Kafka, Rabbit MQ или Active MQ
Опыт коммерческой разработки с Postgress, MySQL или Oracle будет плюсом
Опыт работы с системой контроля версий

Условия:
Аккредитованная IT-компания
Возможность удаленной работы
Полное соблюдение ТК РФ и своевременная выплата заработной платы;
Расширенное ДМС со стоматологией, бесплатные лекарства по назначению врачей;
Корпоративное обучение и сертификация в технических областях;
Бесплатное обучение английскому;
Онлайн-йога

Контакты:
+7 960 324 9665
https://t.iss.one/ntsh_02
3👍3🔥2👏1
Как сгенерировать хорошее случайное число?

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

Псевдослучайные числа – это последовательность случайных на вид чисел, на самом деле полученных в результате математического алгоритма. Последовательность таких чисел можно воспроизвести, зная начальные условия (seed, энтропия) и используемый алгоритм. Метод, который используется для генерации чисел в классе java.util.Random, дает криптографически ненадежные псевдослучайные числа – злоумышленник может достаточно легко их предугадывать.

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

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

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

Внутри SecureRandom использует SPI. Мы можем выбирать из различных алгоритмов генерации и их провайдеров, указав их названия в фабричном методе getInstance. Все перечисленные выше свойства определяются именно используемым алгоритмом.
🔥12👍81
Мечтаешь о карьере в бигтехе?

Приходи на интенсив в Открытые школы Т1 для Java-разработчиков с опытом от года. Это возможность получить оффер от Т1 — крупнейшей ИТ-компании страны по версии RAEX и CNews Analytics 2023 🔝, в портфеле которой 800+ масштабных проектов и 70+ продуктов и услуг.

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

Почему в Т1 классно?

🔹Уникальный рыночный опыт. Наши проекты ежегодно получают награды на ИТ-конкурсах: Global CIO, Национальной банковской премии и др.

🔹Быстрый рост в ИТ при экспертной поддержке. Карьерные треки для выпускников Открытых школ позволяют быстро вырасти в мидла.

🔹Работа в бигтехе, где есть ДМС, удалёнка и крутые офисы, спорт и обучение, митапы, программы развития и др.

⌛️ Быстрое обучение: 1 месяц.
💻 Гибкий формат: все этапы онлайн, занятия по вечерам.

Подавай заявку до 13 сентября!

Старт 16 сентября.

Реклама. ООО "Т1". ИНН 7720484492.
👍32🔥2👏1
Что выведет на экран следующий код?
👍43🔥2
👍93🔥2
👩‍💻 Освойте Java-разработку с нуля и станьте востребованным специалистом!

Ждём вас на онлайн-курсе «Специализация Java-разработчик». Только живые вебинары, вы освоите самые востребованные инструменты и лучшие практики.

Ознакомится с курсом можно на бесплатном открытом уроке «Знакомимся с Java на примере пинг-понга».

📌 Урок пройдет 24 сентября в 20:00 мск.

👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cAEyrl

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍32🔥2
Какой выбрать тип для даты/времени?

В пакете java.util расположены старые классы стандартной библиотеки Java: Date (дата+время), Calendar (конвертация и манипуляция), TimeZone (смещение часового пояса). Эти классы обладали рядом известных проблем. Экземпляры были изменяемыми, что делало их потоко-небезопасными. Работа с датами через календарь была неудобной, не было нормальной поддержки часовых поясов и интернационализации.

Постепенно стандартом де-факто стала сторонняя библиотека Joda-Time. Её разработчики решили все названные выше проблемы.

В Java 8 был добавлен пакет java.time, который взял решения из Joda-Time в стандарт, создатель библиотеки участвовал в разработке. Ключевые классы пакета:
• LocalDate, LocalTime и LocalDateTime – локальные для пользователя дата/время.
• ZonedDateTime – дата/время в определенной часовой зоне.
• Period и Duration – периоды дат и времени соответственно.

Отдельно существуют классы Date и Time пакета java.sql. Это представление даты и времени для обмена данными через JDBC. Не стоит пользоваться ими вне уровня доступа к данным, хотя бы потому, что это классы-наследники старого java.util.Date.
🔥11👍4🥰2
Бесплатный интенсив: Java-разработчик: старт в профессии с нуля.

📆 Когда: 17-18 сентября в 19:00 по мск.

За два дня интенсива в прямом эфире, под руководством опытного Java-разработчика, вы сможете:

✔️ Познакомиться с синтаксисом и основными конструкциями языка Java.
✔️ Написать свой первый проект и определить, подходит ли вам профессия разработчика.
✔️ Создать Telegram-бота с нуля.
✔️ Узнать ответы интересующие вас вопросы.
✔️ Получить доступ к закрытому профессиональному сообществу.

🎁 Подарки для участниковинтенсива: гайд «Как заговорить на сленге IT-специалистов», карта компетенций начинающего Java-разработчика и доступ в закрытое сообщество «Старт в Java» от Хекслета!
👍52🔥2
Как сгенерировать уникальный идентификатор?

UUID (universally unique identifier) – стандарт, описывающий способ создания правильных уникальных идентификаторов. Значения генерируются на основании таких источников информации, как системное время и MAC-адрес, за счет чего они остаются с достаточной вероятностью уникальными, даже будучи сгенерированными независимо. Можно с разных машин добавлять в базу данных записи с UUID-идентификаторами, и не бояться конфликта.

UUID бывает пяти разных версий, версия определяет способ создания. Формат остается одинаковым: это строковое шестнадцатеричное представление 128-битного целого числа (два long-а), разделенное дефисами на группы фиксированного размера:

25b32eaa-3017-4ad7-9224-383f6bfa5212


В Java уникальный идентификатор представляется иммутабельным классом UUID из пакета java.util. В нём нет сложной логики, только getter-ы для описанных в стандарте составных частей, конструктор и статические фабричные методы.

Единственный конструктор позволяет создать экземпляр по двум указанным половинам значения (старшие и младшие 64 бита в виде long параметров). nameUUIDFromBytes строит из заданного массива байтов UUID версии 3. randomUUID генерирует случайный уникальный идентификатор версии 4, с применением SecureRandom.
👍13🔥2
Хакатон IT INNO HACK

Кейс №1: Record Linkage для данных о клиентах. Разработай алгоритмы и методы для решения задачи о нахождении и объединении записей, которые относятся к одному и тому же клиенту из разных информационных систем.

Кейс №2: Система управления проектами. Создай высокопроизводительное приложение для управления проектами, которое будет включать в себя функционал для работы с задачами, пользователями и интеграции с внешними системами.

👨‍💻Кого мы ждём?
Студентов, junior, middle разработчиков; ML-специалистов, NLP- специалистов; Frontend-разработчиков, Backend-разработчиков, Fullstack-разработчиков, разработчиков CRM-систем, DevOps-инженеров.

📆 Даты хакатона: 27 - 29 сентября
📌Формат: Онлайн
📍Дедлайн регистрации: 23:59 23 сентября
🏆Призовой фонд: 600.000 рублей

Подробная информация и регистрация: https://tglink.io/81500dbe9250
👍42🔥2👏1
Чем IllegalArgumentException лучше чем NullPointerException?

Речь здесь идет о выборе подхода к обработке ошибки, когда пользователь передал в non-nullable параметр значение null.

Технически, оба этих исключения unchecked, оба из стандартной библиотеки, и особой разницы нет.

Однако семантически эти исключения отличаются. NullPointerException говорит пользователю о попытке обратиться к членам класса через null-ссылку. Это лишь техническое описание, без информации для пользователя о логике программы. IllegalArgumentException, напротив, явно говорит о недопустимом значении аргумента – это понятная для пользователя информация.

Семантическая разница иногда проявляется и технически. Например, в обработчиках исключений некоторых фреймворков именно IllegalArgumentException превращается в HTTP-ответ с кодом 400 Bad Request, в то время как NPE остается общим кодом «неизвестной ошибки» 500 Internal Server Error.

Кроме того, чтобы выбросить NullPointerException не требуется явного кода обработки null. Остается неизвестным, ожидаемо ли в этом случае исключение, или разработчик попросту забыл добавить корректную обработку.

Явная обработка null и выброс IllegalArgumentException для пользователя кода будет служить документацией, а сообщение об ошибке в аргументе его конструктора внесет еще больше ясности.
👍17🔥2
Как найти первую работу после курсов Java не имея опыта работы? Получи первый опыт работы в команде на реальном коммерческом проекте. Интенсив. Прокачайся с Junior до Middle. Больше никакого стресса!

Всего за 3 месяца вы овладеете навыками работы в команде, получите опыт работы с инструментами развертывания приложений, освоите множество смежных технологий применяемых современными компаниями при разработке ПО (Java, Spring, Microservices architecture, Flyway, Docker, Gradle, Git, Swagger, Event listener, Checkstyle, Webflux reactive, Kafka, PostgeSQl, GitLab CI/CD, Integration API tests, API Gateway, Spring Security, Google Meet, Soft skills ...)

100% наших выпускников находят работу сразу после окончания стажировки.
Команда из 5 разработчиков. Созвоны с тимлидом три раза в неделю по часу. Тимлид уровня Senior. Глубокий рефакторинг вашего кода.

До конца сентября скидка 15%.

Ознакомиться можно на сайте: Roadmap IT School
👍4🔥1🥴1
Сгенерируйте случайное число в интервале

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

Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод Random.nextInt(1) будет генерировать примерно одинаковое количество значений 0 и 1.

Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера Random.nextInt(2)%2. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.

Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора %. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.

Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👍12🔥3
Как создавать код, который легко модифицировать и поддерживать?

Узнайте на открытом вебинаре «Практическое руководство по применению SOLID-принципов» 16 сентября в 20:00 мск, где мы разберем:

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

Урок для backend и fullstack-разработчиков, архитекторов ПО и начинающих программистов.

Встречаемся в преддверии старта курса «Архитектура и шаблоны проектирования». Все участники вебинара получат специальную цену на обучение!

Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие.
5👍2🔥2