#вопросы_с_собеседований
Какие методы для работы с cookies предусмотрены в сервлетах?
Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie:
• Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest.getCookies(). Методов для добавления cookies в HttpServletRequest не предусмотрено.
• Для добавления cookie в ответ используется HttpServletResponse.addCookie(Cookie c). Метода получения cookies в HttpServletResponse отсутствует.
Какие методы для работы с cookies предусмотрены в сервлетах?
Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie:
• Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest.getCookies(). Методов для добавления cookies в HttpServletRequest не предусмотрено.
• Для добавления cookie в ответ используется HttpServletResponse.addCookie(Cookie c). Метода получения cookies в HttpServletResponse отсутствует.
#ищу_работу
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
👨🎓 31 лучший вуз России для будущих программистов 2022-2023
Составили список из 31 вуза, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Основной сайт
🔗 Зеркало
Составили список из 31 вуза, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Что такое «фреймворк Fork/Join»?
Фреймворк
• Этап
• Этап
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного
Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует
Что такое «фреймворк Fork/Join»?
Фреймворк
Fork/Join
, представленный в JDK 7
, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.• Этап
Fork
: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.• Этап
Join
: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного
QuickSort
— массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join
будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует
work-stealing
алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.💡Сколько курсов вы купили и не стали проходить? ⬇️
Расскажите в комментариях ⬇️
Расскажите в комментариях ⬇️
#вопросы_с_собеседований
Что такое Semaphore?
Что такое Semaphore?
Semaphore
– это новый тип синхронизатора: семафор со счётчиком, реализующий шаблон синхронизации Семафор. Доступ управляется с помощью счётчика: изначальное значение счётчика задаётся в конструкторе при создании синхронизатора, когда поток заходит в заданный блок кода, то значение счётчика уменьшается на единицу, когда поток его покидает, то увеличивается. Если значение счётчика равно нулю, то текущий поток блокируется, пока кто-нибудь не выйдет из защищаемого блока. Semaphore
используется для защиты дорогих ресурсов, которые доступны в ограниченном количестве, например подключение к базе данных в пуле.#вопросы_с_собеседований
override vs overload
• override — возможность переопределениия поведения метода в типах-потомках
• overload — возможность переопределять метод с одним именем, но разным набором аргументов
override vs overload
• override — возможность переопределениия поведения метода в типах-потомках
• overload — возможность переопределять метод с одним именем, но разным набором аргументов
#вопросы_с_собеседований
Чем полезны неизменяемые объекты?
Неизменяемость (
Чем полезны неизменяемые объекты?
Неизменяемость (
immutability
) помогает облегчить написание многопоточного кода. Неизменяемый объект может быть использован без какой-либо синхронизации. К сожалению, в Java
нет аннотации @Immutable
, которая делает объект неизменяемым, для этого разработчикам нужно самим создавать класс с необходимыми характеристиками. Для этого необходимо следовать некоторым общим принципам: инициализация всех полей только в конструкторе, отсутствие методов setX()
вносящих изменения в поля класса, отсутствие утечек ссылки, организация отдельного хранилища копий изменяемых объектов и т.д.#вопросы_с_собеседований
Зачем добавили ArrayList, если уже был Vector?
☕️ Методы класса Vector синхронизированы, а ArrayList - нет;
☕️ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
Зачем добавили ArrayList, если уже был Vector?
☕️ Методы класса Vector синхронизированы, а ArrayList - нет;
☕️ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
Вы когда-нибудь обманывали на собеседованиях? ⬇️
Anonymous Poll
62%
Нет
10%
Да, о причинах увольнения
22%
Да, об опыте работы
6%
Другое (напишу в комментариях)
Как в Java сделать утечку памяти?
• Используя самописный класс стека, при выполнении операции pop() не присваивать предыдущей ссылке значение null.
• Также можно неверно использовать HashMap вместо WeakHashMap для кэширования чего-нибудь большого, например картинок ваших товаров, пользователей и.т.д в. Т.к ссылки на ключи сильные (strong references), значения по этим ключам будут висеть в хипе до следующей перезагрузки jvm процесса или удаления ключа из мапы и обнуления ссылки на него. Вообще, кэширование — тема для отдельного разговора
• Также статья (но староватая)
• Используя самописный класс стека, при выполнении операции pop() не присваивать предыдущей ссылке значение null.
• Также можно неверно использовать HashMap вместо WeakHashMap для кэширования чего-нибудь большого, например картинок ваших товаров, пользователей и.т.д в. Т.к ссылки на ключи сильные (strong references), значения по этим ключам будут висеть в хипе до следующей перезагрузки jvm процесса или удаления ключа из мапы и обнуления ссылки на него. Вообще, кэширование — тема для отдельного разговора
• Также статья (но староватая)
#вопросы_с_собеседований
Какое из следующих утверждений о потоках неверно?
1. Если метод
2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
3. Если метод
4. Если метод
Правильный ответ: 3. Если метод
Вызов метода
Какое из следующих утверждений о потоках неверно?
1. Если метод
start()
вызывается дважды для одного и того же объекта Thread
, во время выполнения генерируется исключение.2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
3. Если метод
run()
вызывается напрямую для объекта Thread
, во время выполнения генерируется исключение.4. Если метод
sleep()
вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.Правильный ответ: 3. Если метод
run()
вызывается напрямую для объекта Thread
, во время выполнения исключение не генерируется. Однако, код, написанный в методе run()
будет выполняться текущим, а не новым потоком. Таким образом, правильный способ запустить поток – это вызов метода start()
, который приводит к выполнению метода run()
новым потоком.Вызов метода
start()
дважды для одного и того же объекта Thread
приведёт к генерированию исключения IllegalThreadStateException
во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.#вопросы_с_собеседований
Что такое «монитор» в Java?
Монитор, мьютекс (mutex) – это средство обеспечения контроля за доступом к ресурсу. У монитора может быть максимум один владелец в каждый текущий момент времени. Следовательно, если кто-то использует ресурс и захватил монитор для обеспечения единоличного доступа, то другой, желающий использовать тот же ресурс, должен подождать освобождения монитора, захватить его и только потом начать использовать ресурс.
Удобно представлять монитор как id захватившего его объекта. Если этот id равен 0 – ресурс свободен. Если не 0 – ресурс занят. Можно встать в очередь и ждать его освобождения.
В Java у каждого экземпляра объекта есть монитор, который контролируется непосредственно виртуальной машиной. Используется он так: любой нестатический synchronized-метод при своем вызове прежде всего пытается захватить монитор того объекта, у которого он вызван (на который он может сослаться как на this). Если это удалось – метод исполняется. Если нет – поток останавливается и ждет, пока монитор будет отпущен.
Что такое «монитор» в Java?
Монитор, мьютекс (mutex) – это средство обеспечения контроля за доступом к ресурсу. У монитора может быть максимум один владелец в каждый текущий момент времени. Следовательно, если кто-то использует ресурс и захватил монитор для обеспечения единоличного доступа, то другой, желающий использовать тот же ресурс, должен подождать освобождения монитора, захватить его и только потом начать использовать ресурс.
Удобно представлять монитор как id захватившего его объекта. Если этот id равен 0 – ресурс свободен. Если не 0 – ресурс занят. Можно встать в очередь и ждать его освобождения.
В Java у каждого экземпляра объекта есть монитор, который контролируется непосредственно виртуальной машиной. Используется он так: любой нестатический synchronized-метод при своем вызове прежде всего пытается захватить монитор того объекта, у которого он вызван (на который он может сослаться как на this). Если это удалось – метод исполняется. Если нет – поток останавливается и ждет, пока монитор будет отпущен.
🧑🎨 Искусство новых медиа: как стать цифровым художником?
Давайте вместе разберемся с понятием «искусства новых медиа» (New media Art) и поймем, что нужно, чтобы стать цифровым художником.
https://proglib.io/sh/IC6d9AuSen
Давайте вместе разберемся с понятием «искусства новых медиа» (New media Art) и поймем, что нужно, чтобы стать цифровым художником.
https://proglib.io/sh/IC6d9AuSen
Как разбить строку на слова?
Вместо него рекомендуется использовать метод
Другой подходящий метод –
StringTokenizer
– специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.Вместо него рекомендуется использовать метод
String.split()
. Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.Другой подходящий метод –
Pattern.split()
. Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split()
. Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.Какова структура веб-проекта?
src/main/java
Исходники приложения/библиотекиsrc/main/resources
Ресурсные файлы приложения/библиотекиsrc/main/filters
Файлы сервлетных фильтровsrc/main/webapp
Исходники веб-приложенияsrc/test/java
Исходники тестовsrc/test/resources
Ресурсные файлы тестовsrc/test/filters
Тесты сервлетных фильтровsrc/it
Интеграционные тестыsrc/assembly
Описание сборкиsrc/site
СайтLICENSE.txt
Лицензия проектаNOTICE.txt
Замечания и определения библиотек зависимостей.README.txt
Описание проектаВведение в DbChange JUnit расширение
Простой и декларативный способ выполнять SQL запросы в JUnit тестах.
Читать статью
Простой и декларативный способ выполнять SQL запросы в JUnit тестах.
Читать статью
Telegraph
Введение в DbChange JUnit расширение
Простой и декларативный способ выполнять sql запросы в JUnit тестах. Введение Структура JUnit теста следует модели тестового сценария (test case): ПредУсловия (PreConditions) - это действия, которые переводят тестируемую систему в определённое состояние необходимое…
#вопросы_с_собеседований
Как контейнер сервлетов управляет жизненным циклом сервлета, когда и какие методы вызываются?
Контейнер сервлетов управляет четырьмя фазами жизненного цикла сервлета:
• Загрузка класса сервлета — когда контейнер получает запрос для сервлета, то происходит загрузка класса сервлета в память и вызов его конструктора без параметров.
• Инициализация класса сервлета — после того как класс загружен контейнер инициализирует объект ServletConfig для этого сервлета и внедряет его через
• Обработка запросов — после инициализации сервлет готов к обработке запросов. Для каждого запроса клиента сервлет контейнер порождает новый поток и вызывает метод service() путем передачи ссылки на объекты ответа и запроса.
• Удаление - когда контейнер останавливается или останавливается приложение, то контейнер сервлетов уничтожает классы сервлетов путем вызова
Таким образом, сервлет создаётся при первом обращении к нему и живёт на протяжении всего времени работы приложения (в отличии от объектов классов, которые уничтожаются сборщиком мусора после того, как они уже не используются) и весь жизненный цикл сервлета можно описать как последовательность вызова методов:
•
•
•
Как контейнер сервлетов управляет жизненным циклом сервлета, когда и какие методы вызываются?
Контейнер сервлетов управляет четырьмя фазами жизненного цикла сервлета:
• Загрузка класса сервлета — когда контейнер получает запрос для сервлета, то происходит загрузка класса сервлета в память и вызов его конструктора без параметров.
• Инициализация класса сервлета — после того как класс загружен контейнер инициализирует объект ServletConfig для этого сервлета и внедряет его через
init()
метод. Это и есть место где сервлет класс преобразуется из обычного класса в сервлет.• Обработка запросов — после инициализации сервлет готов к обработке запросов. Для каждого запроса клиента сервлет контейнер порождает новый поток и вызывает метод service() путем передачи ссылки на объекты ответа и запроса.
• Удаление - когда контейнер останавливается или останавливается приложение, то контейнер сервлетов уничтожает классы сервлетов путем вызова
destroy()
метода.Таким образом, сервлет создаётся при первом обращении к нему и живёт на протяжении всего времени работы приложения (в отличии от объектов классов, которые уничтожаются сборщиком мусора после того, как они уже не используются) и весь жизненный цикл сервлета можно описать как последовательность вызова методов:
•
public void init(ServletConfig config)
– используется контейнером для инициализации сервлета. Вызывается один раз за время жизни сервлета.•
public void service(ServletRequest request, ServletResponse response)
– вызывается для каждого запроса. Метод не может быть вызван раньше выполнения init()
метода.•
public void destroy()
– вызывается для уничтожения сервлета (один раз за время жизни сервлета).В каком случае требуется переопределять метод service()?
Метод
Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода
Метод
service()
переопределяется, когда необходимо, чтобы сервлет обрабатывал все запросы (и GET
, и POST
) в одном методе.Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода
service()
, который в зависимости от поступившего запроса вызывает или метод doGet()
или метод doPost()
.