Java Interview Review

@JavaSobes Нравится 2 4 000 + ВП

Популярные вопросы и ответы с собеседований на Java-разработчика.
Канал для Android-разработчиков @AndroidSobes
Связаться с нами @SobesAdmin
http://itsobes.ru/
Гео и язык канала
Россия, Русский
Категория
Образование


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
AdGram.io - биржа рекламы в Telegram
Зарабатывай на размещении рекламы в Telegram!
TGStat Bot
Бот для получения статистики каналов не выходя из Telegram
TGAlertsBot
Мониторинг упоминаний ключевых слов в каналах и чатах.
5 498
подписчиков
~3.1k
охват 1 публикации
~2.1k
дневной охват
~5
постов / нед.
55.9%
ERR %
8.33
индекс цитирования
Репосты и упоминания канала
25 упоминаний канала
21 упоминаний публикаций
2 репостов
Android Live 🤖
Java Developer
Android Live 🤖
Android Interview Review
Android Interview Review
Программист
Продакшн
Clean Code
Новые каналы
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Clean Code
Next Time
Kosmos Time | Наука | Физика
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Android Live 🤖
Лысый из браузера
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Android Interview Review
Говнокод
Android Interview Review
Android Interview Review
Android Interview Review
Clean Code
Типичный программист
Coding
Типичный программист
Библиотека джависта
IT Юмор
Программист
Говнокод
Каналы, которые цитирует @JavaSobes
WebFilter
WebServlet
Android Live 🤖
WebServlet
Java: fill the gaps
Java Developer
embeddable
Oracle Developer👨🏻‍💻
Android Interview Review
Java: fill the gaps
Android Interview Review
Channel
Android Interview Review
trgt
Лысый из браузера
Android Interview Review
Android Interview Review
Последние публикации
Удалённые
С упоминаниями
Репосты
OTUS открывает набор на два новых онлайн-курса, способных прокачать и сделать незаменимыми программистов с опытом ООП. Чтоб проверить свой уровень и попасть на курс по спеццене, пройдите тест:

🔥ПРОЙТИ ТЕСТ по SCALA-разработке: https://otus.pw/w39w/
🔥ПРОЙТИ ТЕСТ по Backend-разработке на KOTLIN: https://otus.pw/0O38/

Узнайте больше о курсах на Днях открытых дверей онлайн:
📌06.07 — Всё о курсе «Backend-разработка на Kotlin»: https://otus.pw/BQOC/
📌15.07 — Всё о курсе «Scala-разработчик»: https://otus.pw/0YfV/

Познакомитесь с преподавателями-практиками, зададите любые вопросы по Kotlin/Scala, курсам и тому, как после обучения обеспечить себе надёжный карьерный прогресс. Регистрируйтесь сейчас — напомним в день вебинара!
Читать полностью
Как остановить поток?

В Java поток представлен классом Thread. В нём есть метод stop(), но пользоваться им нельзя, метод помечен как deprecated. Такая жесткая остановка моментально возвращает все захваченные потоком мониторы, и защищенные ими данные могут оказаться в неконсистентном состоянии.

Разработчики рекомендуют вместо этого использовать флаг, который будет показывать о намерении остановить поток. Флаг выставляется извне потока, а внутри проверяется в подходящий момент. Если нужно остановиться, поток просто выходит из метода run(). В качестве такого флага подойдет переменная типа AtomicBoolean.

Когда в потоке используются блокирующие операции, обычно для определенного типа операции существует свой способ её прервать. Например, можно закрыть сокет, на котором поток ожидает. Для большинства блокирующих операций сработает метод Thread.interrupt(). С его помощью можно прервать Object.wait() и операции из NIO.

Останется только правильно обработать такое прерывание. Прерванный wait() выбросит InterruptedException, Selector.select() вернет результат. Чтобы отличить осознанное прерывание с целью завершить тред от какого-либо другого, его обработку всё ещё необходимо снабдить проверкой флага.

#Многопоточность
Читать полностью
Хочешь освоить востребованную и высокооплачиваемую IT-профессию? Попробуй свои силы в Java-разработке!

Пройди бесплатный интенсив и напиши свою первую программу на Java: 👉 https://clc.to/Q19HvQ.

Своими навыками и лайфхаками поделится Даниил Пилипенко, программист с опытом в коммерческой разработке более 12 лет.

Почему Java — отличный выбор?
➕ Этот язык занимает призовые места в рейтингах разработчиков ПО.
➕ Является одним из самых популярных языков в крупнейших IT-компаниях.
➕ Многогранен и раскрывает множество возможностей применения.
➕ Имеет дружественный и понятный синтаксис.

Подключайся к прямым эфирам, пройди интенсив до конца и получи в подарок электронную книгу Кея Петерсона и Дэвида Колба «Век живи — век учись»!
Читать полностью
Как сравнивать элементы перечисления?

Элементы enum-а компилируются в статические константы-экземпляры его класса. Экземпляры гарантированно синглтоны. Это значит, для их сравнения безопасно использовать ==, даже после десериализации и в многопоточной среде.

Скомпилированный класс неявно наследуется от java.lang.Enum, в котором все методы из Object кроме toString объявлены финальными. В частности, невозможно изменить поведение метода equals – он сравнивает enum-ы с помощью ==. Так что equals тоже можно использовать без опаски.

Но помимо этого есть несколько отличий в пользу ==:

1. == не выбросит NullPointerException. Прежде чем вызывать equals у переменной, придется удостовериться что она не null.

2. == не позволит сравнить объекты разных типов. Оператор еще на этапе компиляции подскажет, что такое сравнение не имеет смысла. equals же будет принимать аргумент под типом Object, и всегда возвращать false уже в рантайме.

3. == быстрее. Скорее всего разница в производительности будет незаметной, но тем не менее, оператор не требует лишнего вызова метода.

#Язык
Читать полностью
Java Interview Review 30 Jun, 18:01
Какой способ логирования выбрать?

Библиотеки логирования, ставшие стандартом де-факто, в хронологическом порядке их появления:

• java.util.Logging из стандартной библиотеки
• Log4j (deprecated)
• Logback
• Log4j 2

Все эти библиотеки поддерживают основные фичи: уровни логирования (что писать), различные хэндлеры (куда писать), форматы (как писать). Развитие библиотек происходило последовательно, в нюансах каждая из них учитывала ошибки предыдущей, сохраняя её преимущества. Обычно выбирают самые свежие варианты – Logback и Log4j 2.

Для совмещения нескольких решений в одном проекте существуют библиотеки-фасады, которые подставляют разные реализации под общий интерфейс:
• SLF4j
• Apache Commons Logging (JCL)

Кроме того, можно использовать bridge-библиотеки. Они маскируют одну реализацию непосредственно под интерфейс другой. С их помощью, например, можно уместить в одном проекте использование двух разных фасадов, или обойтись вовсе без фасадов.

Для более глубокого погружения в вопрос библиотек логирования рекомендуется к просмотру этот доклад.

#Инструменты
Читать полностью
Java Interview Review 27 Jun, 15:00
Международная онлайн-конференция для опытных Java-разработчиков JPoint 2020 пройдет с 29 июня по 3 июля.

Главные темы: производительность, concurrency, тестирование, распределённые системы и высокие нагрузки в мире Java, а также будущее платформы.

На конференции выступят:
— James Gosling: отец языка Java.
— Cay Horstmann: автор бестселлера Core Java, Java Champion, преподаватель Университета штата Калифорния в Сан-Хосе.

Что будет: технические доклады, интервью, развлекательные подкасты, ток-шоу и дискуссии со спикерами. А ещё вы можете принять участие в активностях партнеров и выиграть классные призы.

Билет со скидкой по промокоду JavaSobes2020pc: https://bit.ly/31kGw0m
Читать полностью
Java Interview Review 20 Jun, 18:01
Что такое fail-fast и fail-safe итераторы?

Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса Iterator. Они определяют, как поведет себя итератор при изменении перебираемой последовательности.

Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса ArrayList, при изменении он выбрасывает ConcurrentModificationException. Рекомендуется не основывать логику программы на fail-fast отказах, и использовать их только как признак ошибки реализации.

Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса ConcurrentHashMap работает с копией данных, он не выбросит исключение при изменении коллекции, но может не увидеть часть свежих изменений. Плата за отсутствие ошибок других fail-safe итераторов может отличаться, детали всегда можно найти в документации коллекций.

#Коллекции
Читать полностью
Java Interview Review 19 Jun, 18:01
Считаешь себя крутым разработчиком? 
А как насчет побороться за это звание в прямом эфире? 

Альфа-Банк запускает Alfa Battle – онлайн-чемпионат по прикладному программированию для Java-разработчиков по всей стране с призовым фондом 500 000 рублей.

Отборочный раунд, в ходе которого необходимо решить 5 небольших задач на навыки программирования, пройдет с 9 по 25 июня.

А 27 июня состоится финал, где на протяжении 5 часов лучшие участники будут решать реальные бизнес-задачи backend-разработки от компаний Альфа-Банк, Билайн и X5 Retail Group.

Зачем участвовать:
• 250 000 рублей за первое место
• 150 000 рублей за второе место
• 100 000 рублей за третье место
• Предложение работы (в офис или на удаленку в своем городе)
• Билет на Joker за самое креативное решение по мнению жюри
• Экскурсия по Alfa Digital и мерч ALFA BATTLE LIMITED EDITION – каждому участнику
Регистрируйся и докажи, что ты лучший: https://link.alfabattle.ru/c2fyJ

Параллельно финалу 27 июня в 12:00 пройдет стрим-конференция «Кодинг будущего», где специалисты и топ-менеджеры Альфа-Банка, Билайн и X5 Retail Group расскажут о футуристических прогнозах IT-индустрии, а также выступят с техническими докладами про AI, web-банкинг, growth hacking, mobile banking, продуктовый дизайн и архитектуры Java-проектов. Регистрация по ссылке: https://link.alfabattle.ru/Edzyd
Читать полностью
Java Interview Review 18 Jun, 18:01
Как передать runtime информацию о generic-типе?

Когда вы проектируете API-метод библиотеки, иногда логика его реализации может зависеть от указанного клиентом типа. Особенно часто с этой задачей встречаются при разработке парсеров. Например, библиотека Jackson превращает JSON в объект заданного класса. На интервью этот вопрос можно встретить в виде практической задачи.

Первое, что приходит в голову для решения – дженерик-параметр. Такой подход не сработает, потому что тип будет стёрт во время компиляции, а логика будет происходить позже, во время выполнения.

Решение, которое сработает для многих случаев – объявление в методе аргумента типа Class. Пользователь будет передавать в него значение Foo.class или fooInstance.getClass(). Проблемы с ним начинаются, когда становится нужно передать generic-тип. Синтаксис .class не поддерживает дженерики, а .getClass() от экземпляров List и List вернет один и тот же объект-описание сырого типа List.

На помощь приходит техника, описанная в предыдущей публикации.

1. Объявляется generic класс-обертка над типом: TypeInformation;. Наш метод будет принимать информацию о типе в виде экземпляра этой обертки.

2. В обертку добавляется конструктор с видимостью protected. Теперь можно создавать объекты только наследников, но не самого этого типа.

3. Пользователь будет передавать экземпляр анонимного наследника обертки: new TypeInformation() {}.

4. Внутри вызов getClass().getGenericSuperclass() вернет ParameterizedType. Это будет описание типа родителя анонима, то есть самой обертки. Из него с помощью getActualTypeArguments() можно достать рантайм-информацию о значении дженерика (о List).

#Дженерики
Читать полностью
Java Interview Review 17 Jun, 18:01
JavaQuiz - канал на котором публикуются интересные задачки и вопросы по Java и их разбор.

Проверь свои знания на @javaquiz
Java Interview Review 15 Jun, 18:01
Как использовать JavaEE сервлет в Spring Framework?

Web-приложение на Spring MVC технически само по себе работает на сервлетах: всю обработку запросов берет на себя единый DispatcherServlet. С его помощью реализуется паттерн Front Controller.

Если вам нужно определить в программе полностью независимый от Spring-контекста сервлет или фильтр, ничего особенного для этого делать не нужно. Как обычно в Servlet API, нужно объявить класс, добавить его в web.xml как сервлет, добавить для сервлета маппинг.

Сервлет живет вне Spring-контекста, внедрение зависимостей в нём просто так не заработает. Чтобы использовать autowiring, на этапе инициализации сервлета вызывается статический SpringBeanAutowiringSupport.processInjectionBasedOnServletContext, с текущим сервлетом и его контекстом в аргументах. В этом же утилитарном классе есть ряд других средств для работы с контекстом извне.

Если программа построена на Spring Boot, создание бина типа ServletRegistrationBean поможет добавить сервлеты в рантайме. А для декларативного добавления на этапе компиляции, к классу конфигурации применяется @ServletComponentScan. С этой аннотацией стартер приложения просканирует и добавит в контекст все web-компоненты в стиле Servlet 3.0: классы с аннотациями @WebFilter, @WebListener и @WebServlet.

#JavaEE
#Spring
Читать полностью
Java Interview Review 12 Jun, 17:01
Что такое Jakarta EE?

Сомнительно, что такое спросят на собеседовании. Этот пост – скорее экскурс в историю и способ разобраться в хитросплетениях названий.

Enterprise-версия Java дважды за свою историю была переименована.

Говоря о первом переименовании, стоит сказать пару слов о версиях Java вообще. Сначала JDK подчинялся правилам версионирования semver, продукт с названием Java 1 – это JDK версии 1.0.2 и позже 1.1.

В 1.2 вся платформа получил маркетинговое название Java 2, а версия JDK разделилась на отдельные части: J2SE, J2ME и J2EE. Эти правила, сохранялись до 1.4.

В 2004 году, подгоняемая молодым конкурентом в лице C#, Java получила множество обновлений. Среди них – появление современной нумерации. Из названия следующего релиза пропала цифра 2, а формат версии из инженерного стал маркетинговым. Вышла Java 5, J2EE 1.5 превратилась в Java EE 5.

В 2018-ом компания Oracle рассталась с enterprise-версией, передала её open-source организации Eclipse Foundation. Авторское право на слово «Java» осталось за компанией, и технология получила свое нынешнее официальное название: Jakarta EE. Не следует путать ее с другим проектом Apache Jakarta.

Еще один забавный факт: до Java 7 у версий были кодовые имена, семерка вышла под именем «Дельфин». Далее разработка перешла от Sun к Oracle, и веселье кончилось.

#JavaEE
Читать полностью
Java Interview Review 11 Jun, 18:00
15 июня пройдет открытый практический вебинар «Фабричный метод» и «Абстрактная фабрика». Присоединяйтесь, будет интересно и профессионально: https://otus.pw/rCCY/

На открытом уроке разберем следующие темы: связанность и связность; закон Деметры; шаблон «Фабричный метод»; шаблон «Абстрактная фабрика».

Онлайн-курс рассчитан на разработчиков, которые хотят изучить основные паттерны проектирования и научиться применять их, находить им замену в сложных ситуация и научиться мыслить, как архитектор программного обеспечения.

Вебинар проходит в рамках набора на профессиональный онлайн-курс «Архитектура и шаблоны проектирования». Чтобы попасть на этот курс с welcome-скидкой, пройдите вступительный тест: https://otus.pw/3INi/
Читать полностью
Java Interview Review 11 Jun, 11:00
Может ли имя класса не совпадать с именем файла?

Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.

Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.

Так что ответ – может.

#Язык
Читать полностью
Java Interview Review 10 Jun, 18:01
Хотим порекомендовать вам ещё один интересный канал про Android-разработку — @android_live.

Если на нашем канале вы найдете все для успешного прохождения интервью, то на канале AndroidLive автор делится не только своим практическим опытом в разработке, но и делает обзоры статей, а также берет интервью у других разработчиков и команд.

@android_live
Читать полностью
Как обойти коллекцию?

for/while. Классический способ: целочисленная переменная-индекс, которая увеличивается от 0 до size(). Можно использовать для неполного обхода, с нестандартным шагом. Плата за это – возможность ошибиться в индексах и менее читабельный код.

Iterator. ООП-способ: методом iterator() получить объект-итератор, и вызывать у него next() пока hasNext() возвращает true. В реализации может быть дополнительная логика, такая как потокобезопасность. Такой «объект-итерацию» коллекции можно передать в сторонний код, не отдавая саму коллекцию. Всё еще требует слишком много кода.

for Iterable. Синтаксический сахар для обхода итератором. Простейший синтаксис когда нужен просто обход. В отличие от явного использования итератора не дает возможности модифицировать элементы в процессе.

Стримы. Создать от коллекции стрим и работать с элементами в нём. Кроме простого forEach(), можно воспользоваться всей мощью Java Steam API – фильтровать, преобразовывать и агрегировать элементы. За это создаются лишние объекты, а синтаксис гораздо более развесистый.

Функции Java 8. С этой версии появились удобные средства для обхода не только строк. У коллекций и хэш-таблиц добавились методы forEach для обхода и replaceAll для модификации. Как со стримами, они дают функциональный стиль, но без избыточного создания стримов. Внутри используются простые итераторы и циклы for.

#Коллекции
#Язык
Читать полностью
Опишите жизненный цикл сервлета (2/2)

Другая группа событий – то что происходит со связанными с сервлетом сущностями. Таких сущностей три: ServletContext, ServletRequest и HttpSession.

На каждую из этих сущностей есть два интерфейса-слушателя. Интерфейс XListener сообщает о создании и уничтожении сущности через два соответствующих метода. Так, чтобы совершить какое-то действие при открытии новой HTTP-сессии, действие нужно поместить в реализацию метода HttpSessionListener.sessionCreated().

Все три типа позволяют хранить пользовательские данные – атрибуты. Они хранятся по ключам-строкам, как в хэш-таблице. Методы второго интерфейса XAttributeListener дают возможность обработать добавление, изменение и удаление атрибутов. То есть, если где-то в программе в контекст сервлета добавляется значение (вызван ServletContext.setAttribute("myKey", someValue)), то сработает ServletContextAttributeListener.attributeAdded.

• ServletContext – прослойка между отдельными сервлетами и сервлет-контейнером. Есть только один контекст на всё web-приложение. Он в отличие от сервлетов не ленивый, и инициализируется на старте приложения, до инициализации отдельных сервлетов.

• ServletRequest – отдельный запрос. На каждый запрос создается новый такой объект, инициализируется перед основным обработчиком Servlet.service(), уничтожается после.

• HttpSession – HTTP-сессия, которая служит для поддержания состояния между запросами для одного пользователя. Обычно создается вручную внутри обработчика Servlet.service(). Уничтожаться может как тоже вручную в обработчике, так и по истечению срока жизни. Только для сессии есть третий интерфейс, который уведомляет об изменении идентификатора – HttpSessionIdListener.

Чтобы объект под этими интерфейсами начал получать уведомления, его нужно зарегистрировать в контексте. Это делается либо явным вызовом ServletContext.addListener, либо аннотацией @WebListener на класс.

#JavaEE
Читать полностью
Опишите жизненный цикл сервлета (1/2)

Совсем недавно мы рассмотрели жизненный цикл компонентов Spring-приложения. Поговорим теперь об этапах работы центрального элемента JavaEE web-приложения – сервлета.

События жизненного цикла сервлета можно разделить на две группы. Первая группа – события, относящиеся непосредственно к самому сервлету. Все они объявляются методами из базового интерфейса Servlet. Примерно такие же фазы жизни и у фильтров.

1. Загрузка класса и создание экземпляра сервлета, конструктор. Может быть создано несколько экземпляров, здесь можно располагать только техническую часть инициализации (подробнее).

2. Инициализация – в общем случае метод init. Инициализация гарантированно происходит до первого запроса, один раз на один сервлет (даже если экземпляров несколько). По умолчанию она ленивая, то есть случается непосредственно перед обработкой этого первого запроса. Другой режим, пре-инициализация, включается свойством loadOnStartup.

Если в качестве инициализации нужно всего лишь параметризовать сервлет, вместо реализации метода достаточно передать параметры в свойстве initParams аннотации @WebServlet. Эти параметры, и другую информацию можно прочитать из объекта конфигурации типа ServletConfig. Дефолтная реализация init-метода принимает эту конфигурацию и сохраняется в поле.

3. Обработка запроса – service. В отличие от Spring Framework, в классической JavaEE все запросы вне зависимости от HTTP-метода, пути и набора параметров попадают в единый метод-обработчик. Вся информация о запросе приходит в параметре ServletRequest. У метода нет возвращаемого значения, вместо этого модифицируется второй параметр – ServletResponse. Для фильтров аналогичный метод doFilter, он кроме запроса и ответа принимает третий параметр, FilterChain.

4. Завершение работы – destroy. Здесь всё как обычно с финализациями: вызывается только однажды, только при корректном завершении, после ее вызова service/doFilter уже никогда не будет вызван.

#JavaEE
Читать полностью
Спрос на Android-разработчиков сохраняется даже в кризис. Но теперь мало просто научиться писать приложения по слитым видеокурсам. Работодателям нужны те, кто выдает чистый код, разбирается в архитектуре и UI, умеет работать в команде и покрывать приложение тестами.

Узнайте, как быть конкурентоспособным, на бесплатных вебинарах базового и продвинутого онлайн-курсов Android-разработки на Kotlin от OTUS и Альфа-Банка (для разработчиков с опытом ООП/Android):

📌18.06 — «Приложение под Android на Kotlin за 1,5 часа»: https://otus.pw/bglL/
Создадим приложение с одним экраном, на котором будет показываться погода на данный момент: используем MVVM, Retrofit, Glide, Coroutine, Kotlin, часть приложения сгенерим с помощью студии. Базовый уровень.

📌19.06 — «Android Animations»: https://otus.pw/WY82/
Разберемся в инструментах Android SDK для создания крутых анимаций: View Animations, Motion Layout, ValueAnimator, ObjectAnimator, Transitions, Animated Vector Drawable, Evaluator, Interpolator и Physics. Продвинутый уровень.

Поделятся своей экспертизой преподаватели Антон Казаков (Руководитель направления Android-разработки) и Антон Мачихин (старший разработчик).
Читать полностью
Что будет со ссылкой на метод, если заменить объект-владельца?

Ответ на этот вопрос будет очевиден, если вы уверенно понимаете, что скрывается за терминами ссылки вообще и ссылки на метод.

Для нестатических методов работает позднее связывание. По этой причине, когда мы обращаемся к такому методу по ссылке, то получаем метод экземпляра, а не типа переменной. На примере с изображения ниже метод класса A не будет затронут.

Факт позднего связывания в этом вопросе может ввести в заблуждение. Связывание случается в момент обращения, а не вызова. В результате в переменной хранится неизменяемая копия ссылки на метод. Она ведет на метод объекта, а не хранящей его переменной. Поэтому переприсвоение переменной позже не окажет на ссылку никакого эффекта.

Для достижения реального связывания в момент вызова в байткоде существует инструкция invokedynamic. Однако гораздо проще добиться того же результата, если использовать поведенческий паттерн ООП, например, посетителя.

#Язык
Читать полностью