#вопросы_с_собеседований
Какие коллекции синхронизированы?
Vector — синхронизированный аналог ArrayList.
Hashtable — синхронизированный аналог HashMap.
Stack — синхронизированный стек на основе Vector.
Collections.synchronizedList() — возвращает синхронизированный список на основе переданного в нее списка.
Collections.synchronizedSet() — то же самое для множества.
Collections.synchronizedMap() — для отображения.
Синхронизация в этих коллекциях реализована с помощью внутренних блокировок, которые упорядочивает доступ к коллекции из разных потоков.
Обычно предпочтительнее использовать несинхронизированные коллекции и синхронизировать доступ к ним самостоятельно при необходимости, чтобы не терять производительность.
Это можно сделать с помощью методов synchronizedCollection(), synchronizedList(), synchronizedSet(), synchronizedMap().
Умение работать с REST API на Scala и фреймворком http4s является важным навыком для разработчиков Java и Scala, так как это позволяет им эффективно создавать высокопроизводительные и масштабируемые веб-приложения, обеспечивая быстрый и надежный обмен данными между клиентами и серверами.
Начните знакомство с этими инструментами с открытого урока «Пишем REST API на Scala и http4s» от OTUS.
Преподаватель 👨💻 Валентин Шилин — старший программист/аналитик данных Deutsche Telekom IT GmbH. Занятие пройдёт 🗓 21 сентября в 20:00 мск в рамках онлайн-курса «Scala-разработчик».
На открытом уроке:
- создадим с нуля проект с добавлением роутов и middleware.
- увидим, что функциональный подход позволяет сосредоточиться на содержании
👉 Регистрируйтесь прямо сейчас
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: LjN8KWqzg
В поисках надежного и полезного IT-сообщества?
Добро пожаловать к нам - /channel/+mqJjTeBxr24yZGRi !
У нас ты найдешь честную и качественную информацию о программировании, разработке веб-приложений и многом другом.
Здесь наши эксперты и топовые разработчики будут делиться
своим опытом и знаниями, помогая тебе расти профессионально.
🔝Присоединяйся к нашему активному сообществу, общайся с единомышленниками и открывай для себя новые возможности в IT-индустрии!
Реклама. ООО "ХЕКСЛЕТ РУС". ИНН 7325174845. erid: LjN8KVKBm
Абстракция в Java
Абстракция — это способность выделять существенные характеристики объекта и упускать несущественные.
Абстракция позволяет сосредоточиться на важных свойствах и поведении объекта, скрыв детали реализации.
В Java абстракция реализуется с помощью абстрактных классов и интерфейсов.
Абстрактный класс содержит абстрактные методы без реализации. Подклассы обязаны реализовать эти методы.
Интерфейс задает "контракт", описывая поведение классов без деталей реализации. Классы реализуют интерфейс.
Реализация абстракции требует тщательного анализа предметной области и выделения общих свойств объектов.
#это_база
Trie
Trie (дерево префиксов) — это структура данных в виде дерева, используемая для хранения ассоциативных данных, например словарей.
Она позволяет эффективно хранить и находить слова по их префиксам.
Trie состоит из узлов, каждый из которых может ссылаться на несколько дочерних узлов. Каждая ветвь от корня до листа представляет одно слово, а символы слова образуют путь от корня до узла-листа.
Узлы, которые являются концом слова, помечаются специальным флагом.
Поиск слова заключается в прохождении от корня по ветвям символов этого слова. Добавление нового слова — добавление отсутствующих узлов для его символов.
Trie оптимальна для хранения словарей и поиска по префиксам благодаря эффективности этих операций.
В Java для реализации Trie удобно использовать HashMap
в узлах для связей с дочерними узлами.
#это_база
#вопросы_с_собеседований
Может ли один блок catch отлавливать несколько исключений (с одной и разных веток наследований)?
Да, в Java один блок catch может обрабатывать сразу несколько типов исключений.
Это работает следующим образом:
— При определении блока catch в круглых скобках перечисляются классы исключений через вертикальную черту "|" . Это могут быть классы исключений как с одной ветки наследования, так и с разных.
— Когда во время выполнения программы возникает исключение, Java проверяет, подходит ли оно под один из указанных в catch типов. Если подходит — выполняется код внутри данного блока catch.
Это позволяет избежать дублирования кода обработки в случаях, когда разные исключения должны обрабатываться одинаково.
MicronautMicronaut
— это относительно новый фреймворк для разработки микросервисов на Java.
Основные преимущества — высокая производительность, низкое потребление памяти, интеграция с популярными технологиями микросервисов.
Фреймворк активно развивается и используется в продакшене несколькими крупными компаниями.
Области применения:
— Разработка высокопроизводительных микросервисов. Micronaut
оптимизирован для создания легковесных микросервисов с минимальным использованием ресурсов.
— Построение serverless-приложений. Благодаря низким накладным расходам при старте фреймворк хорошо подходит для бессерверных архитектур на основе функций.
— Быстрая разработка микросервисов. Фреймворк содержит много готовой инфраструктуры для разработки, позволяя быстрее создавать сервисы.
— Интеграция с GraalVM
. Micronaut
оптимизирован для работы со средой исполнения GraalVM
, что дает дополнительное ускорение.
StringBuilderStringBuilder
— это класс для работы с изменяемыми строками, аналогичный StringBuffer
. API класса StringBuilder
такой же, как у StringBuffer
, он также хранит строку в виде модифицируемого массива символов.
Но, в отличие от StringBuffer
, StringBuilder
не является потокобезопасным. Он работает быстрее за счет отсутствия синхронизации.
Поэтому его рекомендуется использовать в однопоточных приложениях для работы со строками, когда нет необходимости в синхронизации.
При создании можно задать начальную емкость buffer'а в виде размера массива символов.
Если строка превышает текущую емкость, она автоматически расширяется с сохранением содержимого.
#это_база
StringBufferStringBuffer
— это класс, предназначенный для работы со строками. Он позволяет создавать модифицируемые (изменяемые) строки.
В отличие от класса String
, объекты StringBuffer
можно изменять после их создания, используя различные методы, такие как append()
, insert()
, delete()
.
Также StringBuffer
эффективнее String
при частых изменениях строки, так как не создает новый объект при каждом изменении.
Класс является потокобезопасным, т. е. может использоваться в многопоточных приложениях.
Методы StringBuffer
не синхронизированы, поэтому для многопоточного доступа нужно вручную синхронизировать доступ с помощью synchronized
блока.
#это_база
#вопросы_с_собеседований
Что такое finalize? Зачем он нужен?
finalize() — это метод, который вызывается перед уничтожением объекта сборщиком мусора в Java.
Этот метод позволяет объекту выполнить какие-то завершающие операции перед уничтожением, например, закрыть файлы или сетевые соединения.
Финализатор может быть полезен, когда нужно гарантировать, что объект освободит какие-то ресурсы даже в случае, если программист забыл явно вызвать метод закрытия ресурсов.
Однако, на практике лучше не полагаться на него, так как неизвестно, когда именно сборщик мусора вызовет его.
Поэтому рекомендуется явно освобождать ресурсы с помощью try-finally блоков.
FileChannelFileChannel
используется для работы с файлами на низкоуровневом вводе-выводе.
Основные возможности класса FileChannel
:
— Чтение данных из файла и запись данных в файл.
— Работа с файлом по смещениям. Можно получить текущее смещение в файле, переместить указатель чтения/записи в нужное смещение.
— Маппинг файлов в память. Файл можно отобразить в память и работать с его содержимым как с массивом байтов.
— Блокировка частей файла. Позволяет защитить критические участки файла от одновременной записи.
— Асинхронная работа с файлами.FileChannel
эффективнее потокового ввода-вывода, т. к. избавляет от накладных расходов на создание объектов и буферизацию.
Используется в приложениях, где нужна высокая производительность работы с файлами.
PipedOutputStreamPipedOutputStream
используется для организации потоковой передачи данных между потоками.
Он работает совместно с PipedInputStream
. Один поток записывает данные в PipedOutputStream
, а другой считывает их из соответствующего PipedInputStream
.
Это позволяет организовать обмен данными между потоками по принципу "производитель-потребитель".
Для связи PipedOutputStream
и PipedInputStream
нужно использовать метод connect()
.
Метод write()
используется для записи данных, как и в обычных потоках вывода.PipedOutputStream
полезен, когда нужен простой способ организовать обмен данными между потоками в одной программе.
Он часто используется для подключения вывода одного потока к вводу другого.
#это_база
#вопросы_с_собеседований
Какова иерархия исключений?
В Java иерархия исключений выстраивается следующим образом:
— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.
При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
#вопросы_с_собеседований
Что вы знаете о классах оболочках?
Классы-оболочки используются для обертывания примитивных типов данных, таких как int, double, boolean и другие.
Основное преимущество использования классов-оболочек в том, что они позволяют работать с примитивными типами как с объектами. У каждого класса-оболочки есть поля и методы для хранения значений и выполнения различных операций.
Например, класс Integer является оболочкой для примитивного типа int. У него есть поле value для хранения целочисленного значения, а также различные методы для преобразования int в строку и обратно, сравнения целых чисел, выполнения математических операций и т. д.
Использование классов-оболочек упрощает работу с примитивными типами в обобщенных коллекциях и алгоритмах, так как они могут храниться в виде объектов.
Кроме того, классы-оболочки могут иметь дополнительную функциональность по сравнению с соответствующими примитивными типами.
Как получить оффер в IT в кратчайшие сроки? Откликнуться до 10 сентября на Week Offer в Росбанке для Java-разработчиков и системных аналитиков.
Почему стоит выбрать Росбанк?
— Удаленная работа;
— ДМС со стоматологией и ветуслугами;
— Возможность развиваться в роли эксперта и бесплатно обучаться по выбранному треку;
— Быть частью профессионального сообщества, в котором эксперты обмениваются опытом и помогают вам развиваться.
Приходите работать к лидеру рынка труда: золото и платина в рейтинге работодателей по версии журнала Forbes. Регистрируйтесь и наслаждайтесь балансом между работой и личной жизнью: https://clck.ru/35eZpv
Откликнуться напрямую: @daryabil
Реклама. ПАО «Росбанк», ИНН 7730060164, Erid: 2VtzqviVoqi
#вопросы_с_собеседований
Чем Hashtable отличается от Hashmap?
Синхронизация:
Hashtable является синхронизированным, т. е. потокобезопасным. HashMap не синхронизирован и не является потокобезопасным.
null ключи и значения:
В HashMap можно использовать null в качестве ключа или значения. В Hashtable null в качестве ключа или значения вызовет ошибку.
Порядок элементов:
HashMap не гарантирует порядок элементов. Hashtable хранит элементы в том порядке, в котором они были вставлены.
Производительность:
Из-за синхронизации Hashtable работает медленнее, чем HashMap.
Размер таблицы:
В HashMap он динамически увеличивается, а в Hashtable изначально задается фиксированным.
Итерирование:
Hashtable использует Enumerator, а HashMap — Iterator.
ListIterator
ListIterator — это интерфейс итератора, предназначенный специально для работы со списками.
В отличие от обычного Iterator
, ListIterator
позволяет не только итерировать список в прямом направлении, но и в обратном.
Он поддерживает операции для перемещения вперед и назад по списку.ListIterator
реализует методы:
— next()
: переход к следующему элементу.
— previous()
: переход к предыдущему элементу.
— hasNext()
: проверка, есть ли следующий элемент.
— hasPrevious()
: проверка, есть ли предыдущий элемент.
— add()
: добавление элемента в список.ListIterator
часто используется, когда нужно пройти по списку в обоих направлениях. Например, чтобы сначала обработать элементы в прямом порядке, а затем в обратном. Или чтобы вставить элементы в произвольное место списка.
Интерфейс Iterable
Iterable используется для представления коллекций, которые можно итерировать или пройти в цикле.
Он определяет метод iterator()
, который возвращает объект Iterator
.
Этот Iterator
позволяет поочередно получать элементы коллекций, также его можно использовать в цикле while
или for-each
для последовательного перебора всех элементов коллекции.
Это позволяет абстрагироваться от конкретного типа коллекции. Мы можем работать с Iterable
и Iterator
, не завися от того список это, множество или очередь. Такой подход упрощает использование разных коллекций.
♨️ Java Developer — канал любого уважающего себя джависта
Тонкости и секреты языка Java, разбор вопросов и решение задач с собеседований в Google, Amazon и Microsoft.
Подписывайся и прокачивай свои навыки: @senior_javist
🔥 Мы в Yandex for Developers запускаем четыре новых канала для разработчиков
Теперь Yandex for — это целая семья телеграм-каналов по разным направлениям: фронтенд, бэкенд, мобильная разработка и ML.
В каждом из них мы будем рассказывать всё о жизни определённого комьюнити инженеров внутри Яндекса — начиная с анонсов всех стековых мероприятий и заканчивая техническими подборками от разработчиков, интервью с инженерами и полезной информацией по найму. А в этом большом телеграм-канале мы продолжим рассказывать про главные события Яндекса для разработчиков, уже не боясь немножечко поднадоесть вам.
Давайте обсуждать технологии, знакомиться и развивать сообщество инженеров:
➡️ Yandex for Mobile
➡️ Yandex for Frontend
➡️ Yandex for Backend
➡️ Yandex for ML
В общем, переходите на наши каналы — всё самое интересное только начинается!
Подписывайтесь 👉 @Yandex4Developers
Реклама. ООО "Яндекс". erid: 2VtzqvyJJuX
#вопросы_с_собеседований
Может ли метод принимать аргументы переменной длины?
В Java метод может принимать переменное количество аргументов двумя основными способами:
— Используя массив в качестве параметра. При определении метода указывается, что один из параметров — это массив некоторого типа. При вызове метода в этот параметр можно передать массив нужной длины.
— Используя специальный синтаксис с многоточием. При определении метода один из параметров объявляется с многоточием после типа. Это говорит компилятору, что это параметр переменной длины. При вызове в него можно передать сколько угодно аргументов указанного типа.
Таким образом метод становится более гибким и его можно вызывать с разным количеством аргументов в зависимости от ситуации. Это избавляет от необходимости перегружать метод для разного числа параметров.
ByteBufferByteBuffer
используется для работы с байтовыми данными.
Он позволяет читать и записывать байты в буфер в памяти.
Основные способы использования:
— Чтение/запись байтовых данных из файлов, сетевых соединений и других источников. ByteBuffer
обеспечивает эффективный доступ к данным без копирования.
— Преобразование между байтами и другими типами данных как примитивными (int
, float
), так и объектными. Можно получить доступ к байтам объекта или записать объект в байтовое представление.
— Компактное хранение данных в оперативной памяти. ByteBuffer
располагается в памяти даже в случае больших объемов данных.
— Обработка байтовых данных как потока байт. Можно последовательно читать или записывать данные в буфер.
— Доступ к данным "по смещению" без копирования. Можно получить "вид" на часть буфера.
Для специалистов в области искусственного интеллекта и машинного обучения 2023 год стал прорывным, и SmartDev 2023 — это отличный шанс разобраться во всех изменениях. Конференция пройдет 21 сентября в кинотеатре «Октябрь» и соберет экспертов из Сбера, VK, Яндекса, Kaspersky и многих других.
Что будет обсуждаться на конференции:
Прорыв в области AI: Как 2023 год стал переломным для прикладного применения искусственного интеллекта.
Большие языковые модели: Обсуждение текущей ситуации и возможностей для будущего.
GigaChat и Kandinsky: Два громких проекта от Сбера, которые задали новые стандарты в области AI и ML.
Стратегия и инновации: Как российский компаниям выйти на международную арену в новых реалиях. А также обсуждение глобальных технологических и экономических трендов.
Присоединяйтесь к трансляции докладов, участие бесплатное. Подробности и регистрация доступны на официальном сайте конференции.
#вопросы_с_собеседований
Почему метод clone объявлен как protected?
Метод clone() по умолчанию объявлен как protected, чтобы ограничить возможность клонирования объектов.
Если бы метод был public, то любой код мог бы клонировать объекты класса. А это не всегда желательно по соображениям безопасности и корректности программы.
С protected доступом клонирование разрешено только внутри класса и его наследников. Таким образом разработчик класса может сам решить, будет ли класс поддерживать клонирование и как именно оно будет реализовано в методе clone().
Делая клонирование protected по умолчанию, Java принуждает разработчика сознательно разрешить клонирование класса путем переопределения метода clone() как public в самом классе.
Это позволяет более гибко контролировать возможности клонирования в каждом конкретном классе.
Selector
Класс Selector
используется для организации многоканального неблокирующего ввода-вывода.
Основная идея в том, что Selector
позволяет одному потоку следить за состоянием множества каналов (сокетов, файловых каналов) и обрабатывать их события (готовность к чтению/записи).
Возможности Selector
:
— Регистрация множества каналов в Selector
для мониторинга.
— Проверка готовности зарегистрированных каналов к операциям чтения, записи.
— Извлечение готовых каналов и выполнение операций с ними.
— Отмена регистрации каналов в Selector
.
Использование Selector
позволяет избежать блокировки на операциях чтения/записи по каналам и эффективно масштабировать приложение для одновременной работы с большим количеством соединений.
Класс часто применяется в сетевых серверах для неблокирующей обработки большого числа клиентских соединений в одном потоке.
Erid:Kra23n5hm
13 сентября — отличный восьмибитный повод, чтобы хотя бы на пять минут отложить разработку ПО, отвлечься от Java, Python, Kotlin и принять поздравления: сегодня — День программиста.
В честь этого вместе с Мир Plat.Form (НСПК) мы объявляем розыгрыш сертификата на 15 000 рублей в магазин geekboards.ru!
Команда Мир Plat.Form проектирует, создаёт и развивает платёжные сервисы, которыми пользуются по всей России. Например, СБП и платёжную систему «Мир».
Чтобы принять участие, подпишись на @mir_platform и @seniorjavist и напиши развёрнутый ответ на вопрос:
❓ «Какие основные плюсы и минусы микросервисной архитектуры в сравнении с монолитной архитектурой и какие факторы следует учесть при выборе между ними для разрабатываемого приложения?»
Победитель будет определён 20 сентября случайным образом среди всех комментаторов, которые выполнят условия.
Желаем удачи!
Pеклама. АО «НСПК»
ByteArrayOutputStreamByteArrayOutputStream
предназначен для записи данных в байтовый массив. Он позволяет записывать данные в память, а не сразу в файл или куда-то еще.
Этот класс реализует интерфейс OutputStream
, поэтому его можно использовать в любом месте программы, где требуется OutputStream
. Данные записываются во внутренний буфер, который автоматически увеличивается по мере необходимости.
Методы:
— write()
используется для записи данных.
— toByteArray()
возвращает внутренний буфер в виде байтового массива.
— size()
и reset()
позволяют управлять размером буфера.ByteArrayOutputStream
удобно использовать, когда нужно записать данные в память, а затем преобразовать в массив байтов, например, чтобы сохранить в файл или отправить по сети.
Этот класс часто используют в связке с ByteArrayInputStream
для различных преобразований данных в памяти.
#это_база
🚀 Раскрой свой потенциал Java с помощью канала Java | Фишки и трюки! 🚀
Готовы ли вы поднять свои навыки разработки на Java на новый уровень? Наш канал посвящен всему, что касается разработки на Java. 📚🖥️
🌟 Будьте готовы погрузиться глубоко в мир Java, воспользовавшись советами опытных разработчиков. Будьте в курсе последних тенденций, лучших практик и отраслевых секретов.
🔗 Полезные ресурсы: получите доступ к тщательно подобранной коллекции ресурсов, включая блоги, статьи, видеоролики и рекомендуемые инструменты, которые помогут вам улучшить свой путь разработки Java.
📢 Оставайтесь в курсе: получайте мгновенные обновления о последних разработках, библиотеках, платформах и инструментах Java. Никогда не упускайте возможности улучшить свои навыки и знания.
🔗 Присоединяйтесь сейчас, чтобы отправиться в уникальное Java-приключение. Ваша история успеха в программировании начинается здесь!🌐📚
CompleteableFutureCompleteableFuture
— это класс, который позволяет асинхронно выполнять операции и получать результаты в будущем. Он является частью concurrent
пакета, добавленного в Java 8.
Основные применения CompleteableFuture
:
— Выполнение асинхронных задач параллельно с использованием ThreadPoolExecutor
.
— Организация асинхронных pipeline.
— Получение первого завершенного результата среди нескольких асинхронных вызовов через методы anyOf
и firstCompletedOf
.
— Обработка ошибок и исключений при выполнении асинхронных задач.
— Тайм-ауты на асинхронные операции, чтобы не ждать результата неограниченно долго.CompleteableFuture
хорошо подходит для создания reactive
систем и приложений с неблокирующей архитектурой, где важна асинхронная обработка данных с множеством источников.
CountDownLatchCountDownLatch
— это утилита для синхронизации потоков. Она позволяет одному или нескольким потокам ждать, пока другие потоки не завершат какую-то операцию.CountDownLatch
инициализируется с заданным счетчиком. Каждый поток, который должен завершить работу, вызывает метод countDown()
, уменьшая счетчик на 1. Поток, который ждет завершения работы других потоков, вызывает метод await()
. Он блокируется до тех пор, пока счетчик не станет равным нулю. CountDownLatch
часто используется:
— Для ожидания завершения всех потоков пула перед завершением программы.
— В многопоточных тестах: поток главного теста ждет выполнения assertion
во всех потоках через CountDownLatch
.
— Для имплементации барьеров в параллельных алгоритмах: потоки ждут друг друга в определенной точке.