#вопросы_с_собеседований
Что произойдет при вызове
Если итератор указывает на последний элемент коллекции, то возникнет исключение
Что произойдет при вызове
Iterator.next()
без предварительного вызова Iterator.hasNext()?Если итератор указывает на последний элемент коллекции, то возникнет исключение
NoSuchElementException
, иначе будет возвращен следующий элемент.Открытая трансляция главного зала HighLoad++ Foundation 13 и 14 мая!
✅Для просмотра необходима только регистрация: https://bit.ly/3sdkadM
Программа охватывает такие аспекты веб-разработок, как архитектуры крупных проектов, базы данных и системы хранения, devops и системное администрирование, нагрузочное тестирование, эксплуатация крупных проектов и другие направления, связанные с большими и высоконагруженными IT-системами.
✅Для просмотра необходима только регистрация: https://bit.ly/3sdkadM
Программа охватывает такие аспекты веб-разработок, как архитектуры крупных проектов, базы данных и системы хранения, devops и системное администрирование, нагрузочное тестирование, эксплуатация крупных проектов и другие направления, связанные с большими и высоконагруженными IT-системами.
#вопросы_с_собеседований
Что такое ThreadLocal-переменная?
У каждого потока - т.е. экземпляра класса
Например, если мы объявим
Следует обратить внимание, что
Так же важно отметить, что т.к.
Что такое ThreadLocal-переменная?
ThreadLocal
- класс, позволяющий имея одну переменную, иметь различное её значение для каждого из потоков.У каждого потока - т.е. экземпляра класса
Thread
- есть ассоциированная с ним таблица ThreadLocal-переменных
. Ключами таблицы являются cсылки на объекты класса ThreadLocal
, а значениями - ссылки на объекты, «захваченные» ThreadLocal-переменными
, т.е. ThreadLocal-переменные
отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной. Доступ к значению можно получить через методы get()
или set()
.Например, если мы объявим
ThreadLocal-переменную
: ThreadLocal<Object> locals = new ThreadLocal<Object>();
. А затем, в потоке, сделаем locals.set(myObject)
, то ключом таблицы будет ссылка на объект locals
, а значением - ссылка на объект myObject
. При этом для другого потока существует возможность «положить» внутрь locals
другое значение.Следует обратить внимание, что
ThreadLocal
изолирует именно ссылки на объекты, а не сами объекты. Если изолированные внутри потоков ссылки ведут на один и тот же объект, то возможны коллизии.Так же важно отметить, что т.к.
ThreadLocal-переменные
изолированы в потоках, то инициализация такой переменной должна происходить в том же потоке, в котором она будет использоваться. Ошибкой является инициализация такой переменной (вызов метода set()
) в главном потоке приложения, потому как в данном случае значение, переданное в методе set()
, будет «захвачено» для главного потока, и при вызове метода get()
в целевом потоке будет возвращен null
.#вопросы_с_собеседований
Как поведёт себя коллекция, если вызвать iterator.remove()?
Если вызову
Как поведёт себя коллекция, если вызвать iterator.remove()?
Если вызову
iterator.remove()
предшествовал вызов iterator.next()
, то iterator.remove()
удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшено IllegalStateException()
.Сравните Iterator и ListIterator.
•
•
•
• При помощи
•
ListIterator
расширяет интерфейс Iterator
• ListIterator
может быть использован только для перебора элементов коллекции List
;•
Iterator
позволяет перебирать элементы только в одном направлении, при помощи метода next()
. Тогда как ListIterator
позволяет перебирать список в обоих направлениях, при помощи методов next()
и previous()
;•
ListIterator
не указывает на конкретный элемент: его текущая позиция располагается между элементами, которые возвращают методы previous()
и next()
.• При помощи
ListIterator
вы можете модифицировать список, добавляя/удаляя элементы с помощью методов add()
и remove()
. Iterator
не поддерживает данного функционала.Как избежать ConcurrentModificationException во время перебора коллекции?
• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу
• Использовать
• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока
Отрицательная сторона последних двух вариантов - ухудшение производительности.
• Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу
fail-safe
.• Использовать
ConcurrentHashMap
и CopyOnWriteArrayList
.• Преобразовать список в массив и перебирать массив.
• Блокировать изменения списка на время перебора с помощью блока
synchronized
.Отрицательная сторона последних двух вариантов - ухудшение производительности.
Какой существует эффективный способ удостовериться, что все сервлеты доступны только для пользователя с верной сессией?
Сервлет
фильтры используются для перехвата всех запросов между контейнером сервлетов
и сервлетом
. Поэтому логично использовать соответствующий фильтр для проверки необходимой информации (например валидности сессии) в запросе.#вопросы_с_собеседований
Какая коллекция реализует дисциплину обслуживания FIFO?
FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекция
Какая коллекция реализует дисциплину обслуживания FIFO?
FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекция
Queue
.#вопросы_с_собеседований
Что такое «фикстуры»?
Что такое «фикстуры»?
Фикстуры
(fixtures
) - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования.Как написать свой первый автотест за 1 час?
Посетить открытое занятие курса "Автоматизация тестирования на Java" от ребят из школы автоматизации QA.GURU бесплатное открытое занятие состоится 18-го мая в 20:00 МСК.
Почему надо сходить:
— Разработаем ваш первый (или не первый) автотест на поиск в Google
—Расскажут о рынке QA🔥 Кто, кому, за что и сколько платит?
— Покажут боевой проект с полной инфраструктурой (Web, mobile, API)
— Дадут домашнее задание и проверят его.
Занятие бесплатное — для участия вступайте в чат @qa_guru_chat — ссылка на занятие будет там.
Посетить открытое занятие курса "Автоматизация тестирования на Java" от ребят из школы автоматизации QA.GURU бесплатное открытое занятие состоится 18-го мая в 20:00 МСК.
Почему надо сходить:
— Разработаем ваш первый (или не первый) автотест на поиск в Google
—Расскажут о рынке QA🔥 Кто, кому, за что и сколько платит?
— Покажут боевой проект с полной инфраструктурой (Web, mobile, API)
— Дадут домашнее задание и проверят его.
Занятие бесплатное — для участия вступайте в чат @qa_guru_chat — ссылка на занятие будет там.
☕️ ТОП-20 бесплатных учебных курсов по Java для новичков
Популярность Java не спадает и только набирает обороты. Представляем лучшие бесплатные курсы для его изучения начинающим разработчикам.
https://proglib.io/sh/O3826tAiV0
Популярность Java не спадает и только набирает обороты. Представляем лучшие бесплатные курсы для его изучения начинающим разработчикам.
https://proglib.io/sh/O3826tAiV0
Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
ArrayList:
• доступ к произвольному элементу по индексу за константное время
• доступ к элементам по значению за линейное время
• вставка в конец в среднем производится за константное время
• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
• на добавление и удаление в начало или конец списка потребуется константное
• вставка или удаление в/из произвольного место константное
• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
ArrayList
это список, реализованный на основе массива, а LinkedList
— это классический двусвязный список, основанный на объектах с ссылками между ними.ArrayList:
• доступ к произвольному элементу по индексу за константное время
O(1)
;• доступ к элементам по значению за линейное время
O(N)
;• вставка в конец в среднем производится за константное время
O(1)
;• удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (
capacity
) не изменяется);• вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо;
• минимум накладных расходов при хранении.
LinkedList:
• на получение элемента по индексу или значению потребуется линейное время
O(N)
;• на добавление и удаление в начало или конец списка потребуется константное
O(1)
;• вставка или удаление в/из произвольного место константное
O(1)
;• требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
В целом,
LinkedList
в абсолютных величинах проигрывает ArrayList
и по потребляемой памяти, и по скорости выполнения операций. LinkedList
предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.#вопросы_с_собеседований
Какое худшее время работы метода contains() для элемента, который есть в LinkedList?
Какое худшее время работы метода contains() для элемента, который есть в LinkedList?
O(N)
. Время поиска элемента линейно пропорционально количеству элементов в списке.#вопросы_с_собеседований
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость,
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость,
capacity
) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой trimToSize()
.#вопросы_с_собеседований
Приведите примеры основных шаблонов проектирования.
☕️ Делегирование (Delegation pattern) - Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
☕️ Функциональный дизайн (Functional design) - Гарантирует, что каждая сущность имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие.
☕️ Неизменяемый интерфейс (Immutable interface) - Создание неизменяемого объекта.
☕️ Интерфейс (Interface) - Общий метод структурирования сущностей, облегчающий их понимание.
☕️ Интерфейс-маркер (Marker interface) - В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого применяются атрибуты или аннотации.
☕️ Контейнер свойств (Property container) - Позволяет добавлять дополнительные свойства сущности в контейнер внутри себя, вместо расширения новыми свойствами.
☕️ Канал событий (Event channel) - Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале.
Приведите примеры основных шаблонов проектирования.
☕️ Делегирование (Delegation pattern) - Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.
☕️ Функциональный дизайн (Functional design) - Гарантирует, что каждая сущность имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие.
☕️ Неизменяемый интерфейс (Immutable interface) - Создание неизменяемого объекта.
☕️ Интерфейс (Interface) - Общий метод структурирования сущностей, облегчающий их понимание.
☕️ Интерфейс-маркер (Marker interface) - В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого применяются атрибуты или аннотации.
☕️ Контейнер свойств (Property container) - Позволяет добавлять дополнительные свойства сущности в контейнер внутри себя, вместо расширения новыми свойствами.
☕️ Канал событий (Event channel) - Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале.
❌ За день вряд ли исправишь сделанный впопыхах хардкод.
❌ За день нельзя выкатить фичу, на которую нужна неделя, как бы ни умолял проджект.
✅ Зато всего за день можно стать Java-разработчиком в одной из двух продуктовых команд Сбера, приняв участие в One Day Offer 21-22 мая.
• Platform V
Основной элемент технологической стратегии Сбера, предоставляющий набор PAAS-сервисов для быстрого создания и развития бизнес-приложений в облаке.
Требования к участникам и условия работы смотрите здесь: http://sber.me/?p=vp3XM
❌ За день нельзя выкатить фичу, на которую нужна неделя, как бы ни умолял проджект.
✅ Зато всего за день можно стать Java-разработчиком в одной из двух продуктовых команд Сбера, приняв участие в One Day Offer 21-22 мая.
• Platform V
Основной элемент технологической стратегии Сбера, предоставляющий набор PAAS-сервисов для быстрого создания и развития бизнес-приложений в облаке.
Требования к участникам и условия работы смотрите здесь: http://sber.me/?p=vp3XM
#вопросы_с_собеседований
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в
1,5
раза превышающим существующий (это верно для JDK
выше 1.7
, в более ранних версиях размер увеличения иной).➡️ Привет! Мы проводим опрос «Что тебя больше всего раздражает в рабочем процессе и в программировании?»
🔥 Говори прямо, не сдерживай себя. Орфографию и пунктуацию мы сохраним. Правда, вульгаризмы заменим на эвфемизмы, но без потери смысла :D
Что тебя больше всего раздражает на работе? 😶 Бессмысленные комментарии к коду? 😐 Постоянно отвлекают от работы, а потом ты полчаса входишь в рабочий процесс? 🤔 Переработки? 😕 Срочные задачи в конце рабочего дня? 😲 Низкий стол? 😵 14" электронно-лучевой монитор? 🤣
Опрос анонимный. Делись наболевшим. А в июне мы опубликуем статью со всеми ответами.
➡️ Опрос можно пройти по ссылке ⬅️
🔥 Говори прямо, не сдерживай себя. Орфографию и пунктуацию мы сохраним. Правда, вульгаризмы заменим на эвфемизмы, но без потери смысла :D
Что тебя больше всего раздражает на работе? 😶 Бессмысленные комментарии к коду? 😐 Постоянно отвлекают от работы, а потом ты полчаса входишь в рабочий процесс? 🤔 Переработки? 😕 Срочные задачи в конце рабочего дня? 😲 Низкий стол? 😵 14" электронно-лучевой монитор? 🤣
Опрос анонимный. Делись наболевшим. А в июне мы опубликуем статью со всеми ответами.
➡️ Опрос можно пройти по ссылке ⬅️
Тинькофф приглашает на One Day Offer
Ищем Java- и Kotlin-разработчиков с опытом от трех лет, чтобы сделать им оффер за день. В течение дня вы общаетесь с командой, а после получаете оффер, если вам понравится команда, работа подойдет по условиям, а задачи — по скиллам.
Встречаемся 28 мая онлайн. Успейте подать заявку до 26 мая. В течение трех дней вернемся с обратной связью: https://l.tinkoff.ru/java-one-day-offer
Ищем Java- и Kotlin-разработчиков с опытом от трех лет, чтобы сделать им оффер за день. В течение дня вы общаетесь с командой, а после получаете оффер, если вам понравится команда, работа подойдет по условиям, а задачи — по скиллам.
Встречаемся 28 мая онлайн. Успейте подать заявку до 26 мая. В течение трех дней вернемся с обратной связью: https://l.tinkoff.ru/java-one-day-offer
Сколько выделяется дополнительно памяти при вызове LinkedList.add()?
Создается один новый экземпляр вложенного класса
Создается один новый экземпляр вложенного класса
Node
.