№ 4931127152 Изучаем Java. По вопросам сотрудничества: @adv_and_pr Канал на бирже: https://telega.in/c/seniorjavist
PhantomHashMap
PhantomHashMap — это еще одна реализация интерфейса Map, которая использует призрачные ссылки для хранения ключей и значений.
Отличие PhantomHashMap
от обычной HashMap
заключается в том, что она не хранит реальные значения, а только призрачные ссылки на них.
Как только ссылка на значение становится призрачной, оно может быть удалено сборщиком мусора.PhantomHashMap
чаще всего используется для отслеживания жизненного цикла объектов. Например, чтобы понять, какие объекты все еще используются, а какие можно удалить.
SoftHashMap
SoftHashMap — это реализация интерфейса Map, которая использует слабые ссылки для хранения ключей и значений.
От обычной HashMap
она отличается тем, что при нехватке памяти она может автоматически удалять наименее используемые элементы.
SoftHashMap часто применяется для реализации кешей, где допустима потеря части данных.
Например, кеш изображений в приложении. Если память закончилась, то часть картинок будет удалена из SoftHashMap
, но основная часть приложения продолжит работать.
⚡️ Митапу быть!
VK зовёт на митап для разработчиков — обсуждают стриминг, видеотехнологии и хайлоад. Техлиды и топы VK Видео расскажут, как устроен видеосервис изнутри: от backend-инфраструктуры и битрейта видеопотока до жизненного цикла контента и CDN-сети.
Подойдёт бэкендерам, мобильным и ML-разработчикам — будут реальные кейсы, разбор подходов и ответы на вопросы.
💻 Если что – ссылка тут
Осталось всего 2 дня, чтобы прокачать асинхронный код на Scala Future 📢
15 апреля в 18:30 пройдёт открытый вебинар с Валентином Шилиным — старшим программистом и аналитиком данных Deutsche Telekom IT GmbH, экспертом по большим данным и преподавателем курсов по Scala и Apache Spark. Он расскажет:
— как избегать типичных ошибок (блокировки и потерю контекста)
— как комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions)
— как ускорить и упростить написание кода на Scala
❗️ Если вы хотите перейти с Java на Scala или уже используете Play Framework, Akka или Spark — на вебинаре вы узнаете, как грамотно писать асинхронный код и устранять «подводные камни».
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Не упустите шанс перейти на новый уровень — регистрируйтесь, пока осталось 2 дня
https://otus.pw/4oyH/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
#вопросы_с_собеседований
Как узнать значение конкретного символа строки, зная его порядковый номер в строке?
Чтобы узнать значение конкретного символа в строке по его порядковому номеру, можно воспользоваться методом charAt(int index) класса String.
Этот метод возвращает символ, расположенный в строке по указанному индексу. Индексы нумеруются от 0 до длины строки минус 1.
Если переданный индекс находится вне диапазона длины строки, будет выброшено исключение IndexOutOfBoundsException.
Реализации исключения при делении на ноль
В этом примере мы создаем собственное исключение DivideByZeroException
, которое наследуется от класса Exception
. Затем, в блоке try
мы проверяем, если делитель равен нулю, то мы бросаем это исключение с соответствующим сообщением. В блоке catch
мы перехватываем исключение и выводим его сообщение об ошибке.
Обратите внимание, что если вы пытаетесь поделить ноль на ноль, будет брошено исключение типа ArithmeticException
, которое уже предусмотрено в Java для обработки ситуаций деления на ноль.
CopyOnWriteArrayList
CopyOnWriteArrayList — это реализация интерфейса List, оптимизированная для работы в многопоточном окружении.
Основное отличие этой коллекции в том, что все модифицирующие операции (добавление, удаление элементов) не изменяют существующий массив, а создают его копию.
Это позволяет избежать необходимости синхронизации для потокобезопасного чтения.CopyOnWriteArrayList
полезен в ситуациях, когда чтение данных происходит гораздо чаще, чем изменение. Например, при реализации общего кэша в многопоточном приложении.
ConcurrentHashMap
ConcurrentHashMap — это реализация интерфейса Map, оптимизированная для многопоточной работы.
Она позволяет эффективно выполнять операции чтения и записи данных из нескольких потоков без необходимости явной блокировки всей структуры данных.
ConcurrentHashMap используется в приложениях, где требуется высокая производительность при работе с разделяемыми данными в многопоточном окружении.
Особенно полезна, когда количество операций чтения значительно превышает количество операций записи.
Контейнер Optional
Optional — это контейнер, который может содержать какое-то значение или не содержать ничего.
Он используется для обозначения отсутствия значения вместо null
. Это позволяет избежать ошибок NullPointerException
.Optional
появился в Java 8. Он представлен классом java.util.Optional
.
Чтобы создать экземпляр Optional
, используются статические методы:
— empty()
для пустого Optional
.
— of()
для Optional
с заданным значением.
Для получения значения из Optional
используются методы get()
, или orElse()
с указанием значения по умолчанию. Также есть методы фильтрации значений, например filter()
, map()
и flatMap()
.
#это_база
Собеседование по Java. Разбор 1606 вопросов и ответов
Смотреть статью
Highload буткемп: Системный дизайн, Производительность и Масштабирование
Приглашаем на курсы для прокачки навыков архитектора и проектировщика на весеннем highload-потоке от DevHands.
🌐 Приходите на уникальный образовательный трек без отрыва от работы (занятия вечером), в рамках которого вы:
🤩 изучите ключевые хайлоад-паттерны и получите навыки проектирования систем с миллионной аудиторией (балансировка, масштабирование, высокая доступность, шардинг, CAP/PACELS, транзакционные очереди и многое другое)
🤩 поупражняетесь в системном дизайне и проектировании, и получите живую обратную связь на реальных задачах: магазин/маркетплейс, объявления, соцсети, такси/доставка и тд.
🤩 погрузитесь в highload максимально, при желании в первый же день получите в управление свою инфраструктуру, попробуете “выжать” 100K RPS из своих сервисов, получите уникальный опыт работы с кластерными решениями - Redis, SPQR, CockroachDB
🤩 научитесь планировать нагрузку и связывать бизнес-показатели с нефункциональными требованиями к системе
🤩 попрактикуетесь в проведении и прохождения секций системного дизайна на интервью
Только «живые» онлайн-сессии: лекции, брейнштормы, презентации домашних проектов.
🗓 Старт потока 22 апреля, изучайте программу и записывайтесь:
🤩 Буткэмп “Производительность и масштабируемость” для тех, кто хочет поработать с собственной инфрой
🤩 Курс “Системный дизайн высоконагруженных проектов” для тех, кто хочет только практику проектирования “у доски”
🥸 Кто мы: R&D-центр Devhands, основатель школы и автор курса Алексей Рыбак, ex-СТО Badoo и Yum! Brands, с многолетним опытом высоконагруженных проектов и управления глобальными технологическими организациями, член программного комитета Highload.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2Vtzqv8dwE1
Интерфейс Delayed
Интерфейс Delayed используется для объектов, у которых есть время истечения задержки.
Он позволяет организовать очередь объектов с учетом их задержки.
Основные методы:getDelay(TimeUnit unit)
— возвращает оставшееся время задержки в указанных единицах измерения.compareTo(Delayed o)
— сравнивает текущий объект с переданным по оставшемуся времени задержки.
Этот интерфейс реализуется классами, которые должны храниться в очереди с задержкой, например в DelayQueue
.
#это_база
Класс DateTimeFormatter
Класс DateTimeFormatter используется для форматирования и парсинга объектов даты и времени.
Он позволяет указать нужный формат даты и времени при выводе этих данных в строку или при чтении из строки в объекты LocalDateTime
, LocalDate
и другие классы API даты и времени.
🗞 EasyOffer 2.0 собрал более 1 млн рублей за первые сутки краудфандинга
Платформа EasyOffer, предназначенная для подготовки к IT-собеседованиям, объявила о разработке новой версии сервиса. За первые 24 часа краудфандинга проекту удалось привлечь более 1 000 000 рублей.
В релизе EasyOffer 2.0 планируется:
— крупнейшая база реальных вопросов и задач с технических интервью
— тренажёры по интервальным повторениям и симуляторы собеседований
— аналитика по компаниям, грейдам, популярности и сложности вопросов
— тестовые задания и требования из вакансий
📆 Релиз запланирован на конец мая.
Сейчас в рамках сбора средств можно оформить годовой PRO-доступ за 3 200 ₽. После запуска такая сумма будет соответствовать цене месячной подписки.
#вопросы_с_собеседований
Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?
— Если в блоке try вызвать метод System.exit(). Это приведет к немедленному завершению приложения, и блок finally пропускается.
— Если произойдет аварийное завершение JVM, например OutOfMemoryError. В этом случае JVM останавливается без выполнения finally.
— Если в блоке try выбрасывается исключение Error или его подклассы (например, StackOverflowError). Такие исключения обычно означают серьезную проблему, поэтому JVM не гарантирует выполнение finally.
— Если при выполнении кода в блоке try произошел deadlock. В этом случае поток зависает, и блок finally не выполняется.
— Если программа была принудительно остановлена, например, по kill -9 в Linux.
Что не так с кодом в Капибаровске?
Узнайте на T-CTF — соревновании от Т-Банка для опытных ИТ-специалистов. Решайте задания по спортивному хакингу с шансом выиграть приз до 420 000 ₽.
Вот как все устроено:
— Выберите Лигу Разработки или Лигу Безопасности по своим навыкам. Если участвуете впервые, можно потренироваться на демозаданиях.
— Соревнуйтесь один или в команде до 3 человек. Вам помогут найти команду, если нет своей.
— Участвуйте онлайн или приходите в ИТ-хаб Т-Банка в одном из 6 городов России.
— Используйте время на решение заданий и общение с участниками — у вас будет 36 часов.
Задания будут интересны разработчикам, QA- и SRE-инженерам, аналитикам и другим ИТ-специалистам уровня middle и senior.
Успейте зарегистрироваться до 18 апреля.
Реклама. АО «ТБанк», лицензия ЦБ РФ № 2673, erid:2RanykCD8Ts
FilterOutputStream
FilterOutputStream — это класс, который служит оберткой для других классов вывода и позволяет добавлять дополнительную обработку или фильтрацию данных перед записью.
Он используется, когда нужно изменить или отфильтровать данные перед отправкой в базовый поток вывода. Например, шифровать данные перед записью в файл.
В примере создается поток записи в файл FileOutputStream
. Далее создается шифр AES и на его основе CipherOutputStream
, который будет шифровать данные перед записью в fileStream
.
В итоге строка "Secret message" будет зашифрована и записана в зашифрованном виде в файл data.txt.
#это_база
Метод isDaemon()
Метод isDaemon() используется для определения, является ли поток демоном или нет.
Демон (daemon) — это поток, который работает в фоновом режиме и не препятствует завершению программы. Основная программа может завершиться, даже если демон все еще выполняется.
#это_база
DoubleAccumulator
DoubleAccumulator используется для атомарного накопления двойных значений (double).
Это потокобезопасный класс, который позволяет безопасно накапливать числа с плавающей точкой из нескольких потоков.
Это полезно при параллельных вычислениях, чтобы избежать состояния гонки.
В примере создается DoubleAccumulator, который будет суммировать числа. Два потока t1 и t2 накапливают в него значения 0.1 и 0.2 соответственно.
В конце программы выводится итоговое значение accumulator - 30.0.
#вопросы_с_собеседований
Как получить синхронизированную коллекцию из не синхронизированной?
Для того, чтобы получить синхронизированную коллекцию из несинхронизованной, можно использовать несколько способов:
— Обернуть исходную коллекцию в Collections.synchronizedList/Set/Map. Это создаст обёртку, которая будет синхронизировать все операции с коллекцией.
— Использовать один из классов синхронизированных коллекций из java.util.concurrent. При создании экземпляра этих классов, коллекция уже будет синхронизирована.
— Создать собственную реализацию коллекции, в которой явно синхронизировать методы с помощью synchronized или Lock.
— Использовать коллекцию, которая синхронизируется внутри каким-либо образом, например Vector.
❓ Java-разработчики, уже пробовали работать с асинхронным кодом через Scala Future?
⏰ 15 апреля в 18:30 на открытом вебинаре Валентин Шилин расскажет, как эффективно использовать Future в Scala: избегать ошибок (блокировки, потеря контекста), комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions) и улучшать производительность кода.
Валентин — старший программист и аналитик данных Deutsche Telekom IT GmbH, эксперт в обработке больших данных и преподаватель курсов по Scala и Apache Spark.
Если вы используете Java и хотите перейти на Scala, или уже работаете с Play Framework, Akka или Spark, — вебинар точно для вас. Научитесь грамотно писать асинхронный код, избегая типичных проблем.
🎁 Все участники смогут задать вопросы эксперту и получат скидку на полный курс по Scala-разработке.
👉 Регистрируйтесь и повысьте эффективность своей работы
https://otus.pw/O1Xc/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⚡️ Linux теперь в Telegram!
Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами
Подписывайтесь: @linuxos_tg
Метод isEmpty()
Метод isEmpty() позволяет проверить, пустая ли коллекция или строка.
Он определен в интерфейсе java.util.Collection
, поэтому доступен для всех коллекций, таких как ArrayList
, HashSet
и других. Также есть отдельная реализация для класса String
.
Метод возвращает значение true
, если коллекция или строка не содержат элементов, и false
— если в коллекции или строке есть хотя бы один элемент.
Это позволяет упростить проверку на пустоту, вместо сравнения размера коллекции с нулем.
#это_база
#вопросы_с_собеседований
Можно ли переопределить статический или приватный метод в Java?
Приватный метод недоступен вне класса, поэтому он не будет переопределен подклассом. Следовательно, его нельзя переопределить. Точно так же статический метод не может быть переопределен, потому что если мы создадим статические методы с одним и тем же именем метода и сигнатурой как в базовом, так и в производном классе, производный класс скроет методы в базовом классе. Это известно как сокрытие метода.
#вопросы_с_собеседований
Оцените количество памяти на хранение одного примитива типа byte в ArrayList?
ArrayList основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому 16 байт
тратится на хранение упакованного объекта и 4 байта
(8 для x64
) - на хранение ссылки на этот объект в самой структуре данных. Таким образом, в x32 JVM 4 байта
используются на хранение одного элемента и 16 байт
- на хранение упакованного объекта типа Byte
. Для x64
- 8 байт
и 24 байта
соответственно.
Узнаем количество файлов в папке
В данном примере мы задаем путь к папке, получаем список файлов в этой папке с помощью метода listFiles()
, а затем выводим количество файлов в папке с помощью свойства length
массива файлов.
👩💻 Сообщения, которые не теряются: Брокеры против хаоса в Java
Приглашаем на открытый урок.
🗓 08 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
Узнайте, как обеспечить 100% доставку данных в распределенных Java-системах: боремся с потерями, хаосом и scaling-вызовами.
О чём поговорим:
✔️Брокеры vs хаос: Как Kafka, RabbitMQ и ActiveMQ спасают данные от потерь.
✔️ Асинхронный Java на практике: Пишем код с гарантированной доставкой сообщений.
✔️ Антипаттерны: Топ-5 ошибок, которые приводят к краху системы (и как их избежать).
Кому будет интересно:
Вебинар будет полезен разработчикам, архитекторам и специалистам по интеграции, работающим с распределенными системами и стремящимся обеспечить надежную доставку данных.
В результате урока:
Участники научатся выбирать брокеры под задачи, реализовывать паттерны вроде Publisher-Subscriber , а также получат шаблоны кода для интеграции в свои проекты.
🔗 Ссылка на регистрацию: https://otus.pw/dk0u/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Класс ReentrantReadWriteLock
Класс ReentrantReadWriteLock используется для организации разделяемого доступа к ресурсам с разделением на чтение и запись.
Он позволяет эффективно организовать одновременный доступ к данным для чтения множеством потоков и исключительный доступ для записи отдельными потоками.
Проще говоря, множество потоков могут одновременно заходить в метод read
, но в write
может находиться только один поток в данный момент времени.
Это позволяет эффективно организовать доступ на чтение и запись.
#вопросы_с_собеседований
Может ли не быть ни одного блока catch при отлавливании исключений?
Да, возможен вариант без блока catch при работе с исключениями.
Достаточно использовать только блок try и finally. В этом случае исключение, возникшее в блоке try, просто будет выброшено дальше, без обработки в данном месте.
Такой подход может быть оправдан, если нет необходимости обрабатывать исключение непосредственно там, где оно возникло. Например, достаточно просто закрыть использованные ресурсы в блоке finally.
То есть использование конструкции без catch вполне допустимо и имеет свои применения в зависимости от логики программы.
CallableCallable
— это интерфейс из пакета java.util.concurrent
, который представляет собой задачу, которую можно выполнить и получить результат, а также обработать исключение, если оно произошло во время выполнения задачи. Он аналогичен интерфейсу Runnable
, но в отличие от Runnable
, Callable
может возвращать результат выполнения и бросать проверяемые исключения.
#для_продвинутых