#вопросы_с_собеседований
Что такое «каналы»?
Каналы (channels) – это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных. При организации вывода, данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал. При вводе, данные из канала помещаются в заранее предоставленный буфер.
Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы – это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с минимальными накладными расходами, а буферы – внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.
Что такое «каналы»?
Каналы (channels) – это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных. При организации вывода, данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал. При вводе, данные из канала помещаются в заранее предоставленный буфер.
Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы – это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с минимальными накладными расходами, а буферы – внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.
Чем синхронный сервер отличается от асинхронного?
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
🔥 Бесплатный интенсив Java Concurrency пройдет с 8 по 10 июля
Три дня будем изучать многопоточность и закрепим знания на Live coding сессии, где вместе с Senior-разработчиком из Сбера напишем многопоточную программу.
После интенсива ты:
— Разберешься, в чем отличие между многопоточностью и параллельностью
— Научишься применять на практике средства для работы с многопоточностью, предоставляемые Java
— Сможешь проектировать многопоточные приложения, отлаживать, тестировать и оптимизировать их
Преподаватель:
👨🏼💻 Александр Литвинов — Team Lead в Сбере, 10 лет в разработке, преподаватель курса Middle Java Dev
🚀 Стартуем 8 июля в 19:00 мск
Регистрируйся бесплатно: https://cutt.ly/zKPaJGl
Три дня будем изучать многопоточность и закрепим знания на Live coding сессии, где вместе с Senior-разработчиком из Сбера напишем многопоточную программу.
После интенсива ты:
— Разберешься, в чем отличие между многопоточностью и параллельностью
— Научишься применять на практике средства для работы с многопоточностью, предоставляемые Java
— Сможешь проектировать многопоточные приложения, отлаживать, тестировать и оптимизировать их
Преподаватель:
👨🏼💻 Александр Литвинов — Team Lead в Сбере, 10 лет в разработке, преподаватель курса Middle Java Dev
🚀 Стартуем 8 июля в 19:00 мск
Регистрируйся бесплатно: https://cutt.ly/zKPaJGl
📊 «Сделай красиво и чтоб работало – это вместо ТЗ». Что больше всего раздражает программистов на работе? Результаты опроса «Библиотеки программиста»
Отправь эту статью коллеге или руководителю. Может что-нибудь поменяется.
https://proglib.io/sh/RHx4fjPaLT
Отправь эту статью коллеге или руководителю. Может что-нибудь поменяется.
https://proglib.io/sh/RHx4fjPaLT
#вопросы_с_собеседований
Какие некоторые из важных особенностей и преимуществ Spring Framework?
• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (
•
• Проект
Какие некоторые из важных особенностей и преимуществ Spring Framework?
Spring Framework
обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики
и организации, которые хотят создать информационную систему, основанную на платформе Java
. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework
не всецело связан с платформой Java Enterprise
, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.Spring Framework
, вероятно, наиболее известен как источник расширений (features
), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java
. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java
. Считается, что Spring Framework
реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java
. Таким образом к достоинствам Spring
можно отнести:• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (
DI
) и инверсия управления (IoC
) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..•
Spring IoC
контейнер управляет жизненным циклом Spring Bean
и настраивается наподобие JNDI lookup
(поиска).• Проект
Spring
содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.#вопросы_с_собеседований
Какие подклассы класса InputStream вы знаете, для чего они предназначены?
•
•
•
•
•
•
•
•
•
•
•
Какие подклассы класса InputStream вы знаете, для чего они предназначены?
•
InputStream
- абстрактный класс, описывающий поток ввода;•
BufferedInputStream
- буферизованный входной поток;•
ByteArrayInputStream
позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока;•
DataInputStream
- входной поток для байтовых данных, включающий методы для чтения стандартных типов данных Java
;•
FileInputStream
- входной поток для чтения информации из файла;•
FilterInputStream
- абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;•
ObjectInputStream
- входной поток для объектов;•
StringBufferInputStream
превращает строку (String
) во входной поток данных InputStream
;•
PipedInputStream
реализует понятие входного канала;•
PushbackInputStream
- разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток, позволяет «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.•
SequenceInputStream
используется для слияния двух или более потоков InputStream
в единый.#вопросы_с_собеседований
Для чего используется PushbackInputStream?
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс
У класса есть дополнительный метод
Для чего используется PushbackInputStream?
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс
PushbackInputStream
представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.У класса есть дополнительный метод
unread()
.#вопросы_с_собеседований
Что вы понимаете под Dependency Injection (DI)?
Внедрение зависимости (Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» ( Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. К достоинствам применения DI можно отнести:
• Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост — при создании зависимости должен создаваться новый экземпляр соответствующего объекта.
• Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы.
• Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны — внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах), что существенно упрощает управление зависимостями и снижает количество возможных ошибок.
• Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения.
• Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе.
Что вы понимаете под Dependency Injection (DI)?
Внедрение зависимости (Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» ( Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. К достоинствам применения DI можно отнести:
• Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост — при создании зависимости должен создаваться новый экземпляр соответствующего объекта.
• Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы.
• Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны — внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах), что существенно упрощает управление зависимостями и снижает количество возможных ошибок.
• Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения.
• Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе.
#вопросы_с_собеседований
Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)?
Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире
Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)?
Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире
Java
. АОП предоставляет возможность реализации сквозной логики — т.е. логики, которая применяется к множеству частей приложения — в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring
к АОП заключается в создании “динамических прокси” для целевых объектов и “привязывании” объектов к конфигурированному совету для выполнения сквозной логики.#вопросы_с_собеседований
Какие подклассы класса Reader вы знаете, для чего они предназначены?
•
•
•
•
•
•
•
•
•
•
Какие подклассы класса Reader вы знаете, для чего они предназначены?
•
Reader
- абстрактный класс, описывающий символьный ввод;•
BufferedReader
- буферизованный входной символьный поток;•
CharArrayReader
- входной поток, который читает из символьного массива;•
FileReader
- входной поток, читающий файл;•
FilterReader
- абстрактный класс, предоставляющий интерфейс для классов-надстроек;•
InputStreamReader
- входной поток, транслирующий байты в символы;•
LineNumberReader
- входной поток, подсчитывающий строки;•
PipedReader
- входной канал;•
PushbackReader
- входной поток, позволяющий возвращать символы обратно в поток;•
StringReader
- входной поток, читающий из строки.Хочешь освоить азы главного языка «энтерпрайза», Java, всего за 14 дней?
Школа программирования Хекслет объявляет набор на подготовительный курс: https://clck.ru/rpdjp
Даём только мясную и прикладную информацию. По окончанию курса ты уже владеешь базовым знанием языка и даже напишешь собственную программу!
Прямо сейчас переходите по ссылке ниже и бронируйте место, стартуем завтра, 5 июля!
Школа программирования Хекслет объявляет набор на подготовительный курс: https://clck.ru/rpdjp
Даём только мясную и прикладную информацию. По окончанию курса ты уже владеешь базовым знанием языка и даже напишешь собственную программу!
Прямо сейчас переходите по ссылке ниже и бронируйте место, стартуем завтра, 5 июля!
Какие подклассы класса Writer вы знаете, для чего они предназначены?
• Writer - абстрактный класс, описывающий символьный вывод;
• BufferedWriter - буферизованный выходной символьный поток;
• CharArrayWriter - выходной поток, который пишет в символьный массив;
• FileWriter - выходной поток, пишущий в файл;
• FilterWriter - абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• OutputStreamWriter - выходной поток, транслирующий байты в символы;
• PipedWriter - выходной канал;
• PrintWriter - выходной поток символов, включающий методы print() и println();
• StringWriter - выходной поток, пишущий в строку;
• Writer - абстрактный класс, описывающий символьный вывод;
• BufferedWriter - буферизованный выходной символьный поток;
• CharArrayWriter - выходной поток, который пишет в символьный массив;
• FileWriter - выходной поток, пишущий в файл;
• FilterWriter - абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• OutputStreamWriter - выходной поток, транслирующий байты в символы;
• PipedWriter - выходной канал;
• PrintWriter - выходной поток символов, включающий методы print() и println();
• StringWriter - выходной поток, пишущий в строку;
#вопросы_с_собеседований
В чем отличие класса PrintWriter от PrintStream?
Прежде всего, в классе
Кроме того, методы класса
В чем отличие класса PrintWriter от PrintStream?
Прежде всего, в классе
PrintWriter
применен усовершенствованный способ работы с символами Unicode
и другой механизм буферизации вывода: в классе PrintStream
буфер вывода сбрасывался всякий раз, когда вызывался метод print()
или println()
, а при использовании класса PrintWriter
существует возможность отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода flush()
.Кроме того, методы класса
PrintWriter
никогда не создают исключений. Для проверки ошибок необходимо явно вызвать метод checkError()
.#вопросы_с_собеседований
Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
•
•
Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
•
OutputStreamWriter
— «мост» между классом OutputStream
и классом Writer
. Символы, записанные в поток, преобразовываются в байты.•
InputStreamReader
— аналог для чтения. При помощи методов класса Reader
читаются байты из потока InputStream
и далее преобразуются в символы.Какие классы позволяют ускорить чтение/запись за счет использования буфера?
•
•
•
•
BufferedInputStream(InputStream in)
/ BufferedInputStream(InputStream in, int size)
,•
BufferedOutputStream(OutputStream out)
/BufferedOutputStream(OutputStream out, int size)
,•
BufferedReader(Reader r)
/BufferedReader(Reader in, int sz),
• BufferedWriter(Writer out)
/BufferedWriter(Writer out, int sz)
#вопросы_с_собеседований
Какой класс предназначен для работы с элементами файловой системы?
Какой класс предназначен для работы с элементами файловой системы?
File
работает непосредственно с файлами и каталогами. Данный класс позволяет создавать новые элементы и получать информацию существующих: размер, права доступа, время и дату создания, путь к родительскому каталогу.AssertJ как способ значительно улучшить код ваших тестов
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно.
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
Читать статью
В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно.
За последние пару лет, несмотря на менеджерскую позицию, я написал свыше пятисот тестов, и мой подход к тестированию претерпел значительные изменения. В этой статье я постараюсь объяснить, почему AssertJ — это лучшее решение для проверок в тестах, существующее сегодня (год 2022 от Р.X.). Разумеется, всё ниже сказанное — это моё субъективное мнение.
Читать статью
Telegraph
AssertJ как способ значительно улучшить код ваших тестов
Привет! В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как…
#вопросы_с_собеседований
Какие методы класса File вы знаете?
Наиболее используемые методы класса File:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Какие методы класса File вы знаете?
Наиболее используемые методы класса File:
•
boolean createNewFile()
: делает попытку создать новый файл;•
boolean delete()
: делает попытку удалить каталог или файл;•
boolean mkdir()
: делает попытку создать новый каталог;•
boolean renameTo(File dest)
: делает попытку переименовать файл или каталог;•
boolean exists()
: проверяет, существует ли файл или каталог;•
String getAbsolutePath()
: возвращает абсолютный путь для пути, переданного в конструктор объекта;•
String getName()
: возвращает краткое имя файла или каталога;•
String getParent()
: возвращает имя родительского каталога;•
boolean isDirectory()
: возвращает значение true
, если по указанному пути располагается каталог;•
boolean isFile()
: возвращает значение true
, если по указанному пути находится файл;•
boolean isHidden()
: возвращает значение true
, если каталог или файл являются скрытыми;•
long length()
: возвращает размер файла в байтах;•
long lastModified()
: возвращает время последнего изменения файла или каталога;•
String[] list()
: возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге;•
File[] listFiles()
: возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге.🔥 Бесплатная Live coding сессия, где будем решать задачу с собеседования в международную FinTech компанию
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 14 июля в 19:00 по мск
Регистрируйся бесплатно: https://cutt.ly/aLl5hVI
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 14 июля в 19:00 по мск
Регистрируйся бесплатно: https://cutt.ly/aLl5hVI
Сравнение виртуальных и обычных потоков в Java
Мы все знаем и ждем Project Loom для виртуальных потоков и надеемся на бесплатное ускорение своих приложений без или почти без изменения их кода.
Примеры с запуском миллиона потоков все уже видели и они скучные. А какое ускорение будет на самом деле в реальных примерах использования многопоточности в нормально написанном проекте?
Читать статью
Мы все знаем и ждем Project Loom для виртуальных потоков и надеемся на бесплатное ускорение своих приложений без или почти без изменения их кода.
Примеры с запуском миллиона потоков все уже видели и они скучные. А какое ускорение будет на самом деле в реальных примерах использования многопоточности в нормально написанном проекте?
Читать статью
Telegraph
Сравнение виртуальных и обычных потоков в Java
Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом. Примеры запускались на доступной сегодня jdk. openjdk version "19-loom" 2022-09-20 OpenJDK Runtime Environment…