Max

Java Guru

Прямой пост
max.ru/javatasks
Описание канала в MAX

Канал с вопросами и задачами с собеседований! По сотрудничеству и рекламе: ссылка скрыта или в ЛС сообщества ВК ссылка скрыта Канал в перечне РКН: ссылка скрыта Мы на бирже: ссылка скрыта

Аудитория
Смешанная аудитория
Подписчики
747
+3день
+2неделя
+25месяц
Охват поста
119
119за 24 часа
137в среднем
Вовлечённость
15,9%
15,9%за 24 часа
18,3%в среднем
Упоминания в других каналах

Канал упомянули 17 раз в 2 каналах

Чем больше упоминаний и каналов — тем заметнее канал в своей нише.

Информация о подписчиках
Вк, телеграм, макс

Похожие каналы

26 784
Смешанная аудитория
ERR 14%

🔓 Популярные игры, приложения для android устройств, новости технологий и многое другое. 🤝 Сотрудничество: smm@mannager.ru ⚠️ Наш чат: 🔓 Популярные игры, приложения для android устройств, новости технологий и многое другое. 🔓 Популярные игры, приложения для android устройств, новости технологий Игры, приложения, модификации, моды, новости, android, сма

2 200
4 596
Мужская аудитория
ERR 24%

Здесь рассказывают о технологиях просто и с огоньком 🔥 Канал про гаджеты, ИИ, электронику и интересные технологии — просто, честно и интересно. По вопросам сотрудничества: 6max.ru/vladimir1 Статистика канала: https://maxframe.ru/channel-profile/72081107124477/

1 990
1 877
Смешанная аудитория
ERR 19%

ChatGPT (ЧатГпт) | NanoBanana 2 (НаноБанана) | DeepSeek | Claude (Клод) | Veo 3.1 | GPT Image 2 | Kling (Клинг) | Grok | GPT 2 AI Бот | ИИ Бот | ИИ Max | нейросети | написать текст | ответы на вопросы | перевод | генерация фото | генерация видео | улучшить фото | фотосессия Бот с нейросетями — @id711601738400_bot 🧑‍💻 Связь: https://clck.ru/3T8PD8 Сервис аналитики MAX - https://maxframe.ru

600
1 841
Смешанная аудитория
ERR 15%

Вся самая новая и полезная литература для Java разработчиков! По вопросам авторских прав, сотрудничества и рекламы: https://t.me/NadikaKir или в ЛС сообщества ВК https://vk.com/javatutorial Мы на бирже: https://telega.in/channels/bookofgeek/card_max/?r=lcDuijdm Канал в перечне РКН: https://vk.cc/cJrTqo

900
13 293
Смешанная аудитория
ERR 12%

Канал с вопросами и задачами с собеседований! По сотрудничеству и рекламе: @NadikaKir Канал в перечне РКН: https://vk.cc/cJrSQZ Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm

1 800
1 306
Смешанная аудитория
ERR 22%

Книги, статьи, мемы и многое другое для Java программиста! По сотрудничеству и рекламе: https://t.me/NadikaKir или в ЛС сообщества ВК https://vk.com/javatutorial Канал в перечне РКН: https://vk.cc/cJrT4A Мы на бирже: https://telega.in/c/javalib/ Сообщество VK https://vk.com/javatutorial

700
Формат размещения
500

топ 1 час · сутки в ленте · цена напрямую от автора

💎Эффективность за эти деньги
4,2
CPV · за показ
4 202
CPM · за 1000
Пересчитывается от формата и охвата 119/24ч
Гарантия выхода поста и возврат средств
Надёжность сделки
Среднее время ответа админа
Среднее время ответа админа
Обычно отвечает быстро
Размещений через Помогач
Размещений через Помогач
Первое размещение — за вами
Посты в канале
Java Guru
MAX · канал
236 просм.10 июля, 18:26
285 просм.8 июля, 21:12
👩‍💻 Spring AI: как превратить изображение документа в JSON в Java-приложении Приглашаем на открытый урок. 🗓 14 июля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework». На занятии мы разберем: ✔️Что такое Spring AI и зачем он нужен Java-разработчику, который хочет добавлять AI-функции в свои приложения. ✔️Как AI-модель работает с изображениями и почему документ можно превратить в данные, пригодные для обработки в коде. ✔️Как настроить подключение к модели в Spring Boot и собрать базовый пайплайн обработки документа. ✔️Как с помощью промпта и OutputParser получить предсказуемый результат в формате JSON/POJO, а не «свободный» текст от нейросети. ✔️Какие ошибки и ограничения важно учитывать, если вы хотите использовать такой подход в реальном backend-сервисе. 🔗 Ссылка на регистрацию: https://vk.cc/cZoQay Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
165 просм.8 июля, 11:01
403 просм.2 июля, 16:36
Spring Boot tip: как быстро защитить REST endpoint С Spring Boot + Spring Security можно буквально за пару строк закрыть нужные маршруты. Допустим, у нас есть контроллер: @RestController public class MyController { @GetMapping("/admin") public String admin() { return "Admin panel"; } } Теперь хотим, чтобы /admin был доступен только аутентифицированным пользователям. Добавляем конфигурацию безопасности: @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin").authenticated() .anyRequest().permitAll() .and() .httpBasic(); } } Разберём, что происходит: • authorizeRequests() - начинаем описывать правила доступа • antMatchers("/admin").authenticated() - для /admin требуется аутентификация • anyRequest().permitAll() - остальные маршруты публичные • httpBasic() - включаем HTTP Basic Auth В итоге: • /admin защищён • всё остальное - открыто • минимум кода, максимум контроля Spring Security выглядит сложно, пока не начинаешь разбирать по шагам. А дальше можно добавлять роли, JWT, OAuth2 и более гибкие политики доступа.
264 просм.29 июня, 16:51
👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки Приглашаем на открытый урок. 🗓 29 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework». На занятии мы разберем: ✔️Что реально делает @Transactional в Spring ✔️Почему важны proxy и вызов метода через Spring Bean ✔️Как работают propagation-режимы на примере REQUIRED и REQUIRES_NEW ✔️Когда происходит rollback и почему checked exceptions не всегда откатывают транзакцию ✔️Типовые ошибки при работе с транзакциями в сервисном слое Урок будет полезен Java/Kotlin-разработчикам, которые уже пишут приложения на Spring или начинают использовать Spring в реальных backend-проектах и хотят лучше понимать поведение транзакций. 🔗 Ссылка на регистрацию: https://vk.cc/cZa5aJ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
220 просм.29 июня, 10:11
Магия IntelliJ IDEA Если используешь Ctrl + P (подсказка параметров метода), то вот ещё один полезный хот кей: Shift + Ctrl + I → быстрый просмотр определения. 🟢 Зачем это нужно — Позволяет посмотреть реализацию метода/класса/интерфейса без перехода в другой файл. — Работает с любыми символами: методами, переменными, константами, даже SQL-мэпперами в MyBatis. — Незаменимо, если не хочешь терять контекст текущего кода. 🟢 Как использовать — Наведи курсор на метод, поле или класс, нажми Ctrl + Shift + I — появится всплывающее окно с реализацией. — Работает и в дебаге, и при просмотре внешних библиотек (если есть исходники).
273 просм.28 июня, 09:56
Java: используйте WeakHashMap для кэширования, когда ключи без ссылок должны удаляться сборщиком мусора. ❌В HashMap, пока существует сама мапа, ключи и связанные с ними значения не будут удаляться сборщиком мусора. ✅В WeakHashMap ключи хранятся через слабые ссылки, и если на ключ больше нет сильных ссылок в программе, сборщик мусора может его удалить, и он автоматически исчезнет из мапы. ✅Пример: Map map = new WeakHashMap<>(); User u1 = new User("Mick"); map.put(u1, "Cached data"); ... u1 = null; // С этого момента ключ u1 доступен для сборки мусора.
293 просм.26 июня, 18:45
Как использовать ИИ в разработке не ради экспериментов, а для решения реальных задач? 29 июня в 20:00 на открытом вебинаре рассмотрим современные ИИ-инструменты для разработчиков и практические сценарии их применения. В программе: • разбор решений для ускорения написания и отладки кода; • демонстрация инструментов генерации кода, тестов и документации; • кейсы использования LLM в повседневной разработке; • примеры внедрения ИИ в рабочие процессы и CI/CD-пайплайны. Вебинар поможет разобраться в возможностях современных ИИ-инструментов, понять, как использовать нейросети для рефакторинга и анализа кода, а также подобрать подходящие решения под свой стек технологий. Регистрация бесплатный на урок: https://vk.cc/cZ69ob Урок пройдёт в рамках старта курса «ИИ для разработчиков». Старт курса 29.06.2026. Плюс скидка 15% за прохождение вступительного тестирования (на страничке курса). Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
268 просм.26 июня, 14:38
По умолчанию Spring Boot не включает stacktrace в ответах REST-сервисов. Только для целей быстрого дебага (не используйте это в production) можно включить это через конфигурационное свойство include-stacktrace: always.
302 просм.25 июня, 14:25
Spring Boot: Лучше использовать SpringBootTest.WebEnvironment.RANDOM_PORT вместо жёстко заданных портов в тестах, чтобы избежать конфликтов.
425 просм.23 июня, 18:30
🤯 Автотесты проходят успешно, а ошибки всё равно попадают в рабочую среду? Часто проблема не в количестве проверок, а в том, что тесты не контролируют структуру данных и не позволяют вовремя заметить изменения в API. 2 июля в 20:00 МСК на открытом уроке разберём инструменты, которые помогают делать проверки более надёжными и предсказуемыми. На живых примерах покажем, как создавать API-тесты на Java, работать с JSON через Jackson, проверять ответы с помощью JSON Schema Validator и организовывать код так, чтобы его было удобно развивать и поддерживать. Открытый урок проходит в преддверии старта курса «Автоматизатор тестирования на Java. Продвинутый уровень». 👉Зарегистрируйтесь, чтобы освоить востребованные инструменты автоматизации и получить практическую базу для своих проектов: https://vk.cc/cYZs5t Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
321 просм.23 июня, 14:00
Как получить гарантированный дедлок? Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом. Livelock – похожая проблема, с тем лишь отличием, что потоки не останавливаются, а вместо этого зацикливаются, выполняя одни и те же бесполезные действия, ходят по кругу. Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A. Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие. Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован CyclicBarrier.
274 просм.23 июня, 11:25
Слушайте подкаст про защиту персональных данных. Специалисты рассказывают про аудит, документацию и требования регуляторов: 152-ФЗ, 1119-ПП, 21 приказ ФСТЭК России, ГОСТ 51583-2014. Еще больше полезного в канале КСБ-СОФТ. Подписывайтесь, чтобы вовремя узнавать об изменениях в приказах о киберзащите: https://tglink.io/61526707732b3e?erid=2W5zFFwGrMX #реклама О рекламодателе
138 просм.23 июня, 10:00
582 просм.23 июня, 00:31
667 просм.20 июня, 11:34
Вайб‑кодинг: хайп для пет-проектов или мощь для прома? Узнаем на митапе! ✌️ Айтишники Новосибирска, собираемся 25 июня в лофте FoodFactory, чтобы обсудить ИИ в финтехе и создании продуктов. В программе митапа: ✔️ реальные кейсы продуктов разного масштаба; ✔️ риски и выгоды агентной разработки; ✔️ дискуссии с экспертами. Занесите в календарь: 25 июня, 19:00, лофт FoodFactory, быть обязательно!  Регистрация тут
317 просм.19 июня, 11:01
768 просм.17 июня, 18:49
Локальный запуск LLM перестал быть экспериментом Все больше команд разворачивают AI-модели внутри своей инфраструктуры, чтобы защитить данные, снизить зависимость от внешних сервисов и сократить расходы на API. 📅 23 июня в 20:00 МСК приглашаем на бесплатный открытый урок «Обзор инфраструктуры Ollama». На занятии разберем: • как устроена платформа Ollama для локального запуска LLM; • установку и настройку на Linux, macOS и Windows; • работу с моделями: загрузку, запуск, управление версиями; • квантизацию и оптимизацию моделей для ограниченных ресурсов. После урока вы: ✅ поймете архитектуру Ollama и принципы ее работы; ✅ сможете развернуть локальную LLM без облачных зависимостей; ✅ узнаете, как эффективно использовать вычислительные ресурсы и выбирать подходящие модели. Урок будет полезен разработчикам, DevOps-инженерам и всем, кто изучает практическое применение ИИ. Регистрация: https://vk.cc/cYOjbr Открытый урок пройдет в преддверии старта курса «ИИ для разработчиков» Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
403 просм.16 июня, 13:01
888 просм.12 июня, 21:38
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда? Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России 📆 в канале размещаются как онлайн, так и оффлайн мероприятия; 👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие; 🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах: 🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
456 просм.12 июня, 13:01
936 просм.10 июня, 18:37
👩‍💻 Контейнеризация Java-приложений с Docker Приглашаем на открытый урок. 🗓 22 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Экспертный уровень». В современной промышленной разработке бизнес-приложения всё чаще запускаются в облачных средах, и умение работать с Docker-контейнерами становится неотъемлемой частью работы Java-разработчика. На занятии мы разберем: ✔️ Что такое Docker-контейнер и зачем он нужен разработчику? ✔️ Как развернуть и запустить Java-приложение в Docker-контейнере? ✔️ Основы профилирования и отладки приложений внутри Docker-контейнера. Урок будет полезен тем, кто хочет: - Освоить навыки работы с Docker-контейнерами. - Узнать, как контейнеризация помогает в разработке и развертывании приложений. - Получить практические знания по запуску, тестированию и профилированию Java-приложений в Docker. 🔗 Ссылка на регистрацию: https://vk.cc/cYBXjV Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
509 просм.10 июня, 12:01
983 просм.9 июня, 10:23
1 054 просм.8 июня, 19:42
1 169 просм.6 июня, 09:36
1 254 просм.3 июня, 10:04
Утечка, которую не видит heap dump Интересная ловушка: вызываешь string.intern() на динамических строках, приложение падает с OOM, делаешь heap dump — а там всё чисто. Где утечка? 🟢 Суть проблемы String Pool до Java 7 жил в PermGen, с Java 7 переехал в heap. Казалось бы, проблема решена. Но нет. Внутри String Pool использует нативную хеш-таблицу StringTable, которая живёт в native memory (вне heap). Когда ты делаешь intern(), в heap создаётся сама строка, но ссылка на неё хранится в нативной StringTable. 🟢 Что происходит Строки попадают в heap (GC их уберёт), но StringTable в native memory растёт бесконечно. Размер StringTable фиксирован и задаётся -XX:StringTableSize. При переполнении — коллизии, деградация, OOM. 🟢 Как увидеть? bashjcmd VM.stringtable Или Native Memory Tracking: bash-XX:NativeMemoryTracking=detail jcmd VM.native_memory Ищи раздел Symbol — там StringTable. ⚠️ String Pool — это не только heap. StringTable живёт в native memory, и это классическая офф-хип утечка. Java Guru
706 просм.2 июня, 12:48
1 280 просм.1 июня, 18:02
1 462 просм.29 мая, 18:06
1 551 просм.27 мая, 18:30
👩‍💻 Java в Kubernetes за 40 минут: как задеплоить приложение в Minikube Приглашаем на открытый урок. 🗓 08 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Экспертный уровень». Minikube — личный Kubernetes для тестов. Научитесь деплоить Java-приложения — база для DevOps, CI/CD и продакшна. О чем поговорим: ✔️ Подготовка Java-приложения к деплою (JAR → Docker image). ✔️ Установка Minikube и настройка локального кластера. ✔️ Написание манифестов: Deployment, Service, ConfigMap. ✔️ Запуск приложения и проверка работоспособности. Вебинар будет полезен: Java-разработчикам, начинающим осваивать Kubernetes и DevOps-подходы, а также инженерам, выстраивающим локальные CI/CD практики. В результате вебинара: Сможете самостоятельно задеплоить Java-приложение в Minikube, написать манифесты и лучше понять, как работает Kubernetes «под капотом». 🔗 Ссылка на регистрацию: https://vk.cc/cYbx5z Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
781 просм.27 мая, 13:01
Как устроены атомики? Начнем с того, что такое атомики и зачем нужны. Atomic* – семейство классов из java.util.concurrent. Они предоставляют набор атомарных операций для соответствующих типов. Например с помощью методов getAndIncrement/incrementAndGet класса AtomicInteger можно делать неатомарный в обычных условиях инкремент (i++). Условно можно разделить подходы реализации большинства atomic-методов на две группы: compare-and-set и set-and-get. Методы категории compare-and-set принимают старое значение и новое. Если переданное старое значение совпало с текущим, устанавливается новое. Обычно делегируют вызов в методы класса Unsafe, которые заменяются нативными реализациями виртуальной машины. Виртуальная машина в большинстве случаев использует атомарную операцию процессора compare-and-swap (CAS). Поэтому атомики обычно более эффективны чем стандартная дорогостоящая блокировка. В случае set-and-get старое значение неизвестно. Поэтому нужен небольшой трюк: программа сначала считывает текущее значение, а затем записывает новое, тоже с помощью CAS, потому что запись могла успеть поменяться даже за этот шаг. Эта попытка чтения+записи повторяется в цикле, пока старое значение не совпадет и переменная не будет успешно записана. Этот трюк называется double-checked или optimistic locking, и может быть использован и в пользовательском коде с любым способом синхронизации. Оптимистичность заключается в том, что мы надеемся что состояния гонки нет, прибегая к синхронизации только если гонка всё же случилась. Реализация оптимистичной блокировки может быть дана как отдельная задача. Java Guru
833 просм.25 мая, 18:50
Мифы про ИИ-агентов: что реально работает в 2026 году. Открытый урок курса «ИИ-агенты: продвинутое внедрение и использование» Вокруг ИИ-агентов много шума: одни ждут, что они заменят людей, другие считают, что это инструмент только для программистов, третьи уверены, что без сложного кода ничего полезного не получится. На практике всё интереснее: агенты уже помогают автоматизировать рутину, работать с браузером, собирать простые сценарии и решать прикладные задачи, но требуют правильного понимания своих границ. На открытом уроке 27 мая в 20:00 разберём популярные мифы про ИИ-агентов и покажем, что действительно работает в 2026 году. Посмотрим, как устроен браузерный агент, зачем он нужен и какие процессы может автоматизировать. Отдельно разберём, как создать агента без кода и почему для первых полезных решений не всегда нужен сложный программный слой. На живых демонстрациях покажем три сценария: браузерный агент, агент без кода и минимальный жизнеспособный агент, который уже решает реальную задачу. Урок не для тех, кто ждёт «замены человека одной кнопкой», хочет верить в магию ИИ без понимания ограничений или считает, что агенты сами по себе решают бизнес-задачи без постановки цели, контекста и контроля результата. 👉 Записаться: https://vk.cc/cY9CA6 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
851 просм.25 мая, 14:45
Как получить гарантированный дедлок? Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом. Livelock – похожая проблема, с тем лишь отличием, что потоки не останавливаются, а вместо этого зацикливаются, выполняя одни и те же бесполезные действия, ходят по кругу. Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A. Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие. Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован CyclicBarrier. Java Guru
851 просм.25 мая, 10:38
Что если блок finally выбросит исключение? Блок finally выполняется вне зависимости от того, было ли выброшено в его блоке try исключение, или нет. Когда исключение не случилось в try, но случилось в finally, нет ничего интересного. Это исключение как обычно пойдет вверх по стеку вызовов, пока не попадется в соответствующий ему catch. Вопрос подразумевает второй случай, когда исполнение попадает в finally в момент выброса исключения из try. Исключение из finally заменит собой исключение из try и пойдет вверх по стеку вместо него. Оригинальная проблема будет попросту забыта. Такая маскировка исключения усложняет отладку, лучше избегать её. Например IntelliJ IDEA выводит соответствующее предупреждение на оператор throw внутри finally. Java Guru
940 просм.21 мая, 20:22
Как объявить переменное количество аргументов метода? Для этого используется аргумент-массив. В нем может находиться любое количество элементов. Еще с Java 5 для этого случая добавился синтаксический сахар: Variable-length argument (vararg). Три точки ... ставятся между типом и именем переменной, и становится можно передать любое количество аргументов, не упаковывая их в массив. На уровне байткода применение массива и варарга не отличаются: vararg-параметр Foo... превращается в параметр-массив Foo[], на этапе вызова подставляется неявное инстанцирование и заполнение массива. Чтобы избежать неоднозначностей, на vararg наложено ограничение: им может быть только один последний аргумент. Vararg, как массив, может быть пустым. Иногда это приводит к неочевидному поведению. Допустим, имеем две перегрузки метода с аргументами int... и float.... Вызов такого метода без параметров попадает в вариант с int, как с более специфичным типом. Наличие же перегрузки с несовместимыми типами, например int... и boolean..., приводит при вызове к ошибке компиляции «Ambiguous method call». Когда типом варарга используется generic-параметр, возникает warning «Possible heap pollution from parameterized vararg type». Вам нужно убедиться, что вы понимаете в чем этот риск, что ваш код не приводит к heap pollution, и уведомить об этом компилятор аннотацией @SafeVarargs. Java Guru
922 просм.21 мая, 15:08
Чем анонимный внутренний класс отличается от лямбды? Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар. С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных. Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов. Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную. С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм invokedynamic и класс генерируется на лету с помощью LambdaMetafactory. Так что лямбда-выражения обычно работают быстрее. Java Guru
1 007 просм.20 мая, 09:58
Как узнать, является ли A подтипом B? В Java доступны три способа проверки совместимости типов. Функционально они ничем не отличаются, применяются для разных наборов аргументов. В порядке убывания быстродействия: instanceof – бинарный оператор, самый быстрый и самый используемый. Если есть экземпляр A и можно указать B явно, выбирать надо его. Если A (точнее тип хранящей экземпляр A переменной) и B не из одной цепочки наследования – экземпляр точно не может быть подтипом B и компиляция упадет с ошибкой inconvertible types. Class::isInstance – метод принимает параметром объект типа A. Его стоит выбрать, когда экземпляр A в наличии, но B – неизвестный на этапе компиляции тип. То есть, для переменных A a и Class bClass, можем проверить bClass.isInstance(a). Class::isAssignableFrom – принимает Class. Единственное, что остается, если экземпляра A нет. bClass.isAssignableFrom(aClass). Есть еще четвертый способ – имея экземпляр типа A привести его к B. Если типы были несовместимы, приведение выбросит ClassCastException. Это во всех смыслах плохой способ, построению логики программы на исключениях нет оправдания. Подробная аргументация описана в Effective Java Item 57. Java Guru
1 065 просм.17 мая, 10:40
Перечислите целочисленные битовые операторы Во-первых, стоит освежить знания о бинарном представлении целых знаковых чисел. В Java используется подход two's complement – для значения 0 все биты нули, при переполнении максимального значения на 1 получается минимальное. Бинарные битовые операторы &, | и ^ действуют очевидным образом: выполняют побитовые «И», «ИЛИ» и «исключающее ИЛИ» (XOR) соответственно. Здесь особенно интересен XOR: Применение к значению «исключающего или» с одним и тем же параметром два раза дает то же значение. За счет этого его можно использовать как простейшее шифрование, аргумент выступит ключом; С помощью XOR реализуется XOR-обмен – алгоритм обмена значениями переменных без дополнительной памяти и без риска переполнения. Это также один из популярных вопросов для собеседования. Унарный оператор битового отрицания (дополнения) ~. Эквивалентен «исключающему или» с самим собой – все биты инвертируются. ~x эквивалентно -x-1. ~0 == -1. Битовые сдвиги: левый << правый знаковый >> и правый беззнаковый >>>. Левый операнд – что сдвигать, правый – на сколько битов. Второй параметр, дистанция сдвига, должен быть не больше доступных разрядов – 31 для int и 63 для long. Если передано значение больше – используются младшие 5 и 7 битов соответственно. То есть для int переменной x << 33 эквивалентно x << 2. a << b эквивалентно умножению a на 2 в степени b. a >> b совпадает с делением на 2 в степени b, с округлением вниз. Для положительных a то же что a/pow(2,b). Для не делящихся нацело на pow(2,b) отрицательных это a/pow(2,b)-1. Беззнаковый сдвиг вправо трактует число не как two's complement, а как беззнаковое. То есть Integer.MIN_VALUE будет сдвинут так, как будто это сдвигается число на 1 большее чем Integer.MAX_VALUE. Беззнакового сдвига влево не существует, потому что он совпадал бы со знаковым сдвигом, и был бы избыточным. Java Guru
1 117 просм.13 мая, 08:26
Что такое короткое замыкание логического оператора? Логические операторы || и && лево-ассоциативны, то есть их параметры вычисляются слева направо. Если первое значение оказалось true в || или false в && – конечный результат уже предрешен, он будет тем же. В этом случае происходит так называемое «короткое замыкание» (short-circuiting) – оставшийся второй аргумент не вычисляется за ненадобностью. Эту особенность иногда удобно эксплуатировать, например для проверки на null в одну строку: return param != null && param.getBoolMember(); Но иногда такая ситуация влечет за собой неожиданные плавающие баги, если второй аргумент – не переменная, а функция с побочным эффектом. Для этой ситуации введены версии операторов без короткого замыкания: | и &. Это логические вариации «битового и» и «битового или». Вдобавок доступен оператор «исключающее или» ^. Он почти никогда не используется для булевых параметров, потому что абсолютно эквивалентен более интуитивно понятному !=. Другие битовые операторы для логических аргументов недоступны. Java Guru
1 110 просм.12 мая, 09:02
Паттерн Фасад (Facade) Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента. Использование: 🟡 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу. 🟡 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами. 🟡 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации. Преимущества: 1️⃣ Упрощает взаимодействие с комплексной системой, предоставляя удобный интерфейс. 2️⃣ Снижает зависимость клиента от конкретных классов подсистем, облегчая поддержку и тестирование. 3️⃣ Уменьшает количество точек взаимодействия с системой, что помогает избежать ошибок и повысить удобство работы. Недостатки: 1️⃣ Может скрывать избыточную функциональность, ограничивая возможности системы. 2️⃣ Увеличивает количество кода за счёт добавления нового фасадного класса. 3️⃣ Если фасад слишком абстрактен, может стать сложным для понимания и поддержки. 📌 Паттерн Фасад полезен, когда нужно объединить несколько подсистем под один общий интерфейс, делая систему более удобной и простой для использования. Например, при работе с библиотеками, требующими сложной настройки, или в крупных проектах, где взаимодействие с множеством компонентов может стать запутанным. Фасад помогает улучшить архитектуру и повысить удобство работы с системой. Java Guru
1 132 просм.11 мая, 09:05
В каком порядке указываются модификаторы? Правила применения модификаторов поля описаны в JLS 8.3.1: 🔘Нельзя указывать один модификатор дважды; 🔘Нельзя использовать несколько модификаторов доступа одновременно. Порядок указания вообще свободный, но обычно используется следующий: @Аннотации, доступ, static final transient volatile Требования для модификаторов метода находятся в JLS 8.4.3: 🔘Те же требования, что и к полю; 🔘Совместно с abstract кроме аннотаций можно использовать только protected или public; 🔘native метод не может использовать strictfp. И так же не требуется, но рекомендуется использовать такой порядок: @Аннотации, доступ, abstract static final synchronized native strictfp Java Guru
1 152 просм.10 мая, 09:10
Зачем нужно ключевое слово default? Изначально (с Java 1.5) это слово использовалось для объявления дефолтного значения элементов аннотации. В Java 8 вместе с лямбдами и стримами появилась острая необходимость дополнить стандартные интерфейсы новыми методами. Никто естественно не собирался ломать обратную совместимость, и было предложено добавить методы по умолчанию. Теперь добавление ключевого слова default к методу интерфейса позволяет добавить ему тело. Все новые методы старых интерфейсов снабжаются дефолтной реализацией. В реализации такого метода его дефолтный вариант вызывается тем же синтаксисом, что и внешний класс из вложенного: InterfaceName.super.methodName(). Методы по умолчанию подошли еще на шаг к введению в Java беспроблемной версии множественного наследования – примесям (mixin). Интерфейс не может иметь состояния, поэтому полноценные примеси всё ещё недоступны. Java Guru
1 200 просм.9 мая, 08:25
Чем отличаются checked и unchecked исключения? Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации. Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе throws; перехватывать или добавлять в throws в вызывающем его методе. Unchecked можно добавить, но не обязательно, перехватывать не обязательно даже если указана в throws. 🔘Throwable – базовый класс для всего что может быть использовано с оператором throw и в конструкции try-catch 🔘RuntimeException – «нормальные» unchecked-исключения 🔘Error – unchecked исключения, которые означают «серьезные проблемы» приложения. Не должны обрабатываться (хотя технически можно). Теоретически JVM может находиться в невалидном состоянии и не давать больше никаких гарантий 🔘Exception (кроме RuntimeException) – checked исключения Java Guru
1 221 просм.8 мая, 08:35
Задачи с собеседований: Проверка, является ли бинарное дерево деревом поиска (middle) — Как определить, является ли заданное бинарное дерево деревом поиска (BST)? 📌 Ключевые моменты: - Бинарное дерево поиска (BST) — это бинарное дерево, в котором для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше. - Для проверки можно использовать рекурсивный подход с отслеживанием допустимых диапазонов значений для каждого узла. - Как изменить реализацию для работы с любыми типами данных в узлах дерева? Реализация с числами в узлах на картинке 👆 Java Guru
1 248 просм.7 мая, 09:02
Что такое функциональный интерфейс? Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк. Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса Object также игнорируется. Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked). Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами. Дополнительно функциональный интерфейс принято помечать аннотацией @FunctionalInterface. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции. Типичные примеры функциональных интерфейсов: Callable, Supplier, Comparable. Java Guru
1 296 просм.6 мая, 09:20
👇Паттерн Строитель (Builder) Builder — это порождающий паттерн, который позволяет пошагово создавать сложные объекты. Вместо того чтобы создавать объект одним большим конструктором с множеством параметров, Builder организует процесс создания по частям, обеспечивая гибкость и читаемость кода. Использование: 🟡 Когда нужно создать объект с большим количеством параметров, и не все из них обязательны. 🟡 Когда процесс создания объекта требует выполнения нескольких шагов или дополнительных проверок. 🟡 В случаях, когда один и тот же код должен создавать разные представления объекта (например, текстовое и графическое). Преимущества: 1️⃣ Упрощает создание сложных объектов, делая процесс понятным и читаемым. 2️⃣ Позволяет создавать объекты с разными вариациями без необходимости дублирования кода. 3️⃣ Разделяет логику создания объекта от его структуры, что упрощает поддержку и модификацию кода. Недостатки: 1️⃣ Увеличивает сложность кода за счёт создания дополнительных классов и методов. 2️⃣ Может быть избыточным для простых объектов с небольшим количеством параметров. 3️⃣ Требует дополнительного внимания при проектировании, чтобы избежать путаницы между обязательными и необязательными шагами. 📌 Паттерн Builder полезен, если объект имеет много параметров и их нужно задавать гибко. Например, при создании сложных конфигураций для HTTP-запросов (заголовки, тело, параметры), построении графических интерфейсов или генерации HTML-документов. Builder помогает сделать код более понятным и избежать создания конструкций с длинными и неудобными конструкторами. Java Guru
1 338 просм.5 мая, 08:45
Как реализовать двусторонний обмен данными между потоками? Вопрос, который зачастую дается в виде практической задачи. Конечно, результата можно добиться разными способами: парой атомарных переменных, критическими секциями, потокобезопасными коллекциями. Но полезно знать, что специально для этого случая в стандартной библиотеке java.util.concurrent есть простой класс Exchanger. Класс содержит единственный метод V exchange(V x). Один поток передает в него данные, и встает в ожидание. Ожидание завершается, когда второй поток также приходит в метод exchange со своей порцией информации. В качестве результата вызова потоки получают данные друг друга. На основе класса Exchanger удобно создавать пайплайны обработки данных. Первый поток выполняет свою часть обработки, и складывает результаты в буфер. В качестве буфера может работать любой многоразовый объект-контейнер. Когда он заполняется, следующий поток обменивает его на второй, пустой буфер. Таким образом два буфера используются поочередно, не выделяется лишний раз память и не нагружается GC. Далее из попарно обменивающихся буферами потоков может строиться длинная многопоточная цепочка обработки. Java Guru
1 365 просм.4 мая, 09:02
Приведите примеры использования fork/join framework Как следует из названий связанных классов, ForkJoinPool используется для рекурсивных задач. Это такие задачи, которые можно делить на порции, подзадачи. Отделение подзадачи – это операция fork, финальная агрегация результатов подзадач – join. Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом ForkJoinPool не потребуется. Метод parallelSetAll из класса Arrays применяет fork/join для генерации элементов массива; parallelPrefix для модификации; parallelSort для сортировки. Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример: Arrays.stream(new int[]{1, 2, 3, 4}).parallel().sum(); Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные RecursiveTask, RecursiveAction, или Spliterator. Java Guru
1 386 просм.3 мая, 09:12

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