Java Interview Review

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

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


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
SearcheeBot
Ваш гид в мире Telegram-каналов
Telegram Analytics
Подписывайся, чтобы быть в курсе новостей TGStat.
TGAlertsBot
Мониторинг упоминаний ключевых слов в каналах и чатах.
4 004
подписчиков
~3.4k
охват 1 публикации
~2.6k
дневной охват
~5
постов / нед.
85.4%
ERR %
6.2
индекс цитирования
Репосты и упоминания канала
16 упоминаний канала
15 упоминаний публикаций
1 репостов
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
trgt
Лысый из браузера
Android Interview Review
Android Interview Review
Последние публикации
Удалённые
С упоминаниями
Репосты
Особенности работы класса Matcher (3/3)

Для замены совпавших с регулярным выражением подстрок есть методы replaceFirst и replaceAll. В них можно передать как строку-замену, так и коллбэк, который будет вычислять её на лету. Оба метода сбрасывают состояние.

При замене можно использовать $ для ссылки на группы совпадения, а символ \ используется для escape-последовательностей. Если требуется воспринимать эти символы без дополнительного смысла, необходимо обернуть строку-замену в вызов quoteReplacement.

Есть более гибкий способ замены. Matcher позволяет последовательно вручную выполнять поиск (всё теми же методами), а затем добавлять пройденный кусок строки с замененным совпадением в StringBuilder/StringBuffer методом appendReplacement. Оставшийся непройденный хвост добавляется методом appendTail. То есть, последовательность вызовов m.find(); m.appendReplacement(); m.appendTail(); эквивалентна вызову m.replaceFirst(), а while(m.find()) m.appendReplacement(); m.appendTail(); – это m.replaceAll().

#Строки
Читать полностью
Бесплатный онлайн практикум DevOps by REBRAIN: Docker Build
Для системных администраторов / Инженеров / Программистов

Регистрация - https://clck.ru/KfEmv
Количество мест строго ограничено!

Практикум по освоению DevOps

Время проведения:
10 Декабря (Вторник) в 19:00 по МСК

Что будет на практикуме?

🔹Разбираемся как докер хранит фс нашего контейнера
🔹Как работает кеширование при сборке образа
🔹Несколько советов для быстрой сборки образа
🔹Ускоряем сборку образа в gitlab ci

Кто ведет?

Василий Озеров - основатель агентства Fevlake (fevlake.com) и действующий Devops-инженер (опыт в Devops более 5 лет). Регулярно выступает на RootConf, DevOpsConf Russia, HighLoad.

Расписание DevOps практикумов на декабрь - https://clck.ru/KfEok
Присоединяйтесь!
Читать полностью
Особенности работы класса Matcher (2/3)

Регулярные выражения используются для двух задач: поиска и замены. Поговорим о поиске.

Метод matches проверяет, удовлетворяет ли выражению весь регион, lookingAt – хотя бы его начало. Метод find похож на next итератора – он последовательно идет по строке, и находит следующие совпадения с выражением. Эту итерацию можно сдвинуть на определенную позицию строки, передав позицию как параметр.

Matcher реализует интерфейс MatchResult. Через него предоставляется информация о последнем успешном поиске (любым из перечисленных методов). Если эту информацию необходимо сохранить, toMatchResult() выделит её в отдельный иммутабельный объект. А если хочется обработать последовательность всех совпадений в виде стрима, поможет метод results().

Интерфейс MatchReslut предоставляет методы group, start и end. Они дают содержимое найденной подстроки и ее позицию в строке. Если этим методам параметром передать номер или имя группы, то результатом будет информация не о всей подстроке, а о ее группах. Общее количество групп хранится в свойстве groupCount.

Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс: hitEnd и requireEnd. hitEnd сообщает, пришлось ли при последнем поиске дойти до конца региона. requireEnd подскажет, мог ли измениться результат (успех/неудача) последнего поиска, если бы в конец региона был добавлен хвост.

Метод reset сбрасывает всё это текущее состояние поиска. Передав в него параметр, можно заодно заменить строку, с которой работаем. Используемое регулярное выражение тоже можно заменить, методом usePattern, но состояние поиска при этом не сбросится.

#Строки
Читать полностью
Особенности работы класса Matcher (1/3)

Как мы уже писали ранее, основная функциональность работы с регулярными выражениями представлена в Java классом Matcher. Рассмотрим его подробнее.

Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы regionStart и regionEnd возвращают текущие границы, а region устанавливает новые.

Свойство transparentBounds экземпляра матчера может разрешать регулярному выражению заглядывать при поиске за границы, при условии что итоговая совпавшая подстрока будет всё ещё в границах региона (lookahead и lookbehind). А выключив свойство anchoringBounds можно перестать трактовать границы региона как границы строки (^ и $ в выражении).

#Строки
Читать полностью
Бесплатный онлайн практикум DevOps by REBRAIN: Kubernetes
Для системных администраторов / Инженеров / Программистов

Регистрация - https://clck.ru/KQNyf
Количество мест строго ограничено!

Практикум по освоению DevOps

Время проведения:
3 Декабря (Вторник) в 19:00 по МСК

Что будет на практикуме?

🔹Разворачиваем свой инстанс Kubernetes
🔹Сравнение облачных решений (в т.ч. от Яндекса)
🔹Разбираем архитектуру Kubernetes
🔹Деплоим приложение и осваиваем ресурсы

Кто ведет?

Василий Озеров - основатель агентства Fevlake (fevlake.com) и действующий Devops-инженер (опыт в Devops более 5 лет). Регулярно выступает на RootConf, DevOpsConf Russia, HighLoad.

Открытые еженедельные DevOps практикумы - https://bit.ly/2CGmm3C
Присоединяйтесь!
Читать полностью
Java Interview Review 29 Nov, 18:01
Как избежать NPE? (2/2)

Как справедливо заметили коллеги в чате-обсуждении, в предыдущем посте не был упомянут класс Optional, исправляемся.

Другое направление разрешения проблемы NPE – отказ от значения null вообще, и использование вместо этого класса-обертки Optional. Такой класс существовал раньше в различных библиотеках (например Google Guava), а с Java версии 8 стал частью стандарта.

Optional – более объектно-ориентированный путь обработки отсутствия значения. Пустое значение тоже является полноценным объектом, и вместо языковых конструкций для null, обработка пустоты выполняется обычными методами orElse*. Optional близок к паттерну ООП Null Object.

Любое nullable значение можно превратить в Optional вызовом его фабричного метода ofNullable(). Также класс предоставляет методы создания заведомо непустого значения of() со встроенной проверкой на null, и empty() для заведомо пустышки.

Класс Optional относительно свежий и активно развивается – в каждой версии Java в него добавлялись новые вспомогательные методы, с самого его появления и до Java 11.

#Классы
Читать полностью
Java Interview Review 28 Nov, 18:01
Как избежать NPE? (1/2)

NullPointerException – самое частое исключение в Java. По некоторым данным, это порядка 70% от всех логгируемых исключений. Тони Хоар, создатель понятия Null Reference, назвал свое изобретение «Ошибка на миллиард долларов». К сожалению, у неё нет универсального решения, но есть рекомендации по борьбе.

Первым делом, если API не подразумевает работу с null-параметрами, каждый его метод должен начинаться с проверок на null и последующих исключений. Или хотя бы с assert-а. Фактически это заменит NPE на исключение другого типа, но такой код будет выглядеть как предварительное условие вызова, а особое исключение или текст сообщения ассерта лучше объяснит произошедшее.

Следующий шаг – юнит-тесты. Не важно, считаются ли null-аргументы штатной или исключительной ситуацией – хорошие тесты обязаны фиксировать реакцию компонентов программы на null.

Уже давно победить NPE hell помогают инструменты статического анализа кода. Этап анализа обычно включается в процесс сборки, наряду с тестами. Все современные IDE предоставляют аннотации @Nullable/@NonNull для явного указания nullability. С версии Java 9 аннотации для статического анализа в рамках стандарта JSR-305 попали в пакет javax.annotation.

В современных языках, таких как Kotlin, анализ встроен в компилятор. Информация о nullability является частью объявления типа, а попытка передать зануляемое значение в незануляемый параметр приведет к несовместимости типов и ошибке компиляции. Вдобавок, языки снабжаются множеством наллобезопасных операторов вроде ?:.

#Классы
Читать полностью
Java Interview Review 26 Nov, 18:01
Что можно делать с классом Connection?

Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.

Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..

В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.

Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.

#SQL
Читать полностью
Java Interview Review 24 Nov, 18:00
Бесплатный онлайн практикум DevOps by REBRAIN: Kubernetes Gitlab CI
Для системных администраторов / Инженеров / Программистов

Регистрация - https://clck.ru/K9P6n
Количество мест строго ограничено!

Практикум по освоению DevOps

Время проведения:
26 Ноября (Вторник) в 19:00 по МСК

Что будет на практикуме?

🔹Для чего нужен Helm и Gitlab CI?
🔹Пишем Helm chart
🔹Подготовка пайплайна в Gitlab CI
🔹Деплоим чарт с помощью Gitlab CI

Кто ведет?

Юрий Медведев - DevOps engineer Fevlake. Выпускник REBRAIN. Спикер практикумов REBRAIN

Открытые еженедельные DevOps практикумы - https://bit.ly/2CGmm3C
Присоединяйтесь!
Читать полностью
Java Interview Review 22 Nov, 18:00
Есть ли в Java goto?

Это вопрос с подвохом. Оператор GOTO в общем виде – это оператор безусловного перехода в некоторую точку программы. Даже если вы не сталкивались с ним на практике, можете представить, сколько путаницы может принести возможность прыжка из середины одной функции, в середину другой. В современных высокоуровневых языках существует консенсус о том, что goto – это плохо.

На низком же уровне, от него никуда не деться, и в этом нет ничего плохого. Операция goto присутствует и в байткоде JVM. Компилятор заботится о её разумном использовании. В неё компилируются циклы, операторы ветвления, обработчики исключений.

Ещё goto присутствует в Java как зарезервированное слово – то, что скорее всего подсвечивается особым цветом в вашей IDE. Пока оно не используется, но разработчики языка оставляют за собой такое право.

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

#Язык
Читать полностью
Java Interview Review 21 Nov, 18:01
Что такое метки и как их использовать?

Наверняка вам приходилось писать неуклюжий код выхода из циклов нескольких уровней вложенности:

boolean flag = false;
for (...) {
for (...) {
if (...) { x = true; break; }
}
if (flag == true) break;
}

В Java существует полезный синтаксис, который упрощает код в таких ситуациях – метки (label).

Метка используется как пункт назначения для операторов break и continue. Помечать можно любой блок – цикл for, while, даже простой блок и операторы switch и if. Метки делают возможным использование оператора break вне цикла, хотя пользы в этом обычно немного.

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

#Язык
Читать полностью
Java Interview Review 19 Nov, 18:01
Зачем нужно ключевое слово assert?

assert – не то же самое, что методы вроде assertTrue() из тестовых библиотек. Это зарезервированное ключевое слово, унарный оператор.

Этот оператор ничего не возвращает, а принимает проверяемое утверждение типа boolean. Если значение оказывается false, проверка утверждения считается проваленной и выбрасывается AssertionError. Это похоже на сокращенную запись пары if и throw, с фиксированным типом исключения.

В Java до версии 4 слово assert не было ключевым. Поэтому для обратной совместимости механизм проверки утверждений выключен по умолчанию – логика программы никогда не должна полагаться на assert!

Включается флагом -ea или -enableassertions команды java. Можно указывать конкретные классы и пакеты в которых включить. Есть противоположный флаг -da (-disableassertions), эти флаги можно использовать в комбинации.

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

Дополнительно у оператора assert есть синтаксис передачи параметра detailMessage в конструктор AssertionError:
assert 2*2==5 : "two times two is not five!";


#Язык
Читать полностью
Java Interview Review 18 Nov, 18:00
🍀Обратите внимание на Spring Framework🍀

С ним не болит голова при решении стандартных задач.
Подключение к SQL и NoSQL базам данных, разработка Web-приложений, изучение микросервисов, монолитов и облаков - все это ждет вас на курсе "Разработчик на Spring Framework".

Пройдите вступительный тест, чтобы попасть в ближайшую группу: https://otus.pw/iWDg/

А также подключайтесь 19 ноября в 20:00 (мск) ко Дню открытых дверей курса и задайте все интересующие вас вопросы преподавателю курса, Юрию Дворжецкому. Регистрация по ссылке: https://otus.pw/TASZ/
Читать полностью
Java Interview Review 15 Nov, 18:01
Какие значения возвращают мутаторы Map?

Давайте разберемся с этой путаницей раз и навсегда.

Методы put (put, putIfAbsent) возвращают старое значение.

Методы работы с множеством элементов (putAll, replaceAll, clear) не возвращают ничего.

remove и replace с указанием не только ключа, но и старого значения, возвращают boolean; без указания – это самое старое значение.

Методы с коллбэками (computeIfPresent, computeIfAbsent, compute, merge) возвращают актуальное значение после вызова, оставшееся или новое.

#Классы
Читать полностью
Java Interview Review 14 Nov, 12:00
Бесплатный онлайн практикум DevOps by REBRAIN: Kubernetes
Для системных администраторов / Инженеров / Программистов

Регистрация - https://clck.ru/Jv8QK
Количество мест строго ограничено!

Практикум по освоению DevOps

Время проведения:
19 Ноября (Вторник) в 19:00 по МСК

Что будет на практикуме?

🔹Что такое Google Kubernetes Engine (GKE)? И для чего?
🔹Инфраструктура Kubernetes и Разбор возможностей GKE
🔹Решение проблем GKE дополнительными сервисами
🔹Берем лучшее от обеих инфраструктур и живем счастливо

Кто ведет?

Дмитрий Дунаев - Senior DevOps engineer. DevOps Team Lead Fevlake. 5 лет в DevOps практиках. Speaker / Creator DevOps by REBRAIN

Открытые еженедельные DevOps практикумы - https://bit.ly/2CGmm3C
Присоединяйтесь!
Читать полностью
Java Interview Review 13 Nov, 18:00
Как создать объект в обход конструктора?

Этот пост – не рекомендация. Описанное здесь крайне редко имеет основание к применению (если имеет вообще).

Десериализация – полагается, что сериализационная форма уже была когда-то сконструирована, теперь же экземпляр просто восстанавливается с помощью метода readObject. Вызывается конструктор ближайшего не serializable родителя.

Внутри десериализация использует ReflectionFactory.newConstructorForSerialization из пакета sun.reflect – метод создания объекта заданного типа с указанным (возможно родительским) конструктором. Можно использовать его напрямую. Конструктор всё же вызывается, но это может быть конструктор класса Object.

Unsafe.allocateInstance – непосредственно создает экземпляр не вызывая конструктор, ничего лишнего.

Оба способа позволяют создать объект, не вызван ни конструктор, ни инициализаторы полей. Все члены остаются со значениями по-умолчанию (null, 0, false). Однако для final поля дефолтным значением считается указанное в инициализации, оно и будет установлено.

Пользуясь этими грязными хаками, помните: пакеты sun.* никогда не были частью официально поддерживаемого API Java, и есть не во всех версиях Java.

Подробнее читайте на хабре: 1, 2.

#Сериализация
#JVM
Читать полностью
Java Interview Review 11 Nov, 18:00
Какие данные есть в исключении?

Разработчик может добавлять в исключение, как и в любой другой класс, произвольные поля и методы. Но у всех исключений есть общая часть, унаследованная от Throwable. В базовых Exception, RuntimeException и Error нет ничего кроме неё.

Cause – другое исключение, которым было вызвано это. Опционально. Можно задать через сеттер или аргумент конструктора, но задается не больше одного раза.

Message – сообщение ошибки. Устанавливается в конструкторе. Кроме обычного геттера есть getLocalizedMessage, который в наследниках может возвращать локализованный вариант сообщения.

Stack Trace – стек вызовов методов потока до того места, где сообщение было сконструировано (не выброшено!). JVM позволено терять часть, или даже все фреймы стека. Есть сеттер для фреймворков удаленного вызова (RPC). Сеттер можно отключить параметром конструктора writableStackTrace.

Suppressed – список исключений, которые были выброшены и подавлены, пока это исключение шло к обработчику. Сюда попадают подавленные исключения финализации ресурсов при использовании try-with-resource. Сеттер доступен и для пользовательского кода. Подавление можно отключить параметром конструктора enableSuppression.

#Классы
Читать полностью
Какие классы вовлечены в соединение с базой данных?

DriverManager управляет всеми JDBC-драйверами в приложении. Представляет набор статических методов. Лениво загружает системным класслоадером доступные предсконфигурированные драйверы:
• По списку полных имен классов из проперти jdbc.drivers;
• Через Service Provider Interface (SPI).

Менеджер занимается созданием экземпляра Connection – ключевого класса при работе с базой данных. Альтернативный менеджеру (и даже рекомендуемый) способ соединения с источником данных – ConnectionBuilder. Билдер получают из javax.sql.DataSource – формально это часть Java EE, так что здесь не будем подробно на нем останавливаться.

Driver – главный класс реализации JDBC-драйвера. Когда загружается класслоадером, сам регистрирует себя в DriverManager. Так что кроме предсконфигурированных драйверов, дополнительные можно загрузить просто вызвав Class.forName.

Можно явно создавать Connection через драйвер, минуя менеджера и билдер. Драйвер предоставляет информацию о возможных/требуемых для своей работы свойствах в виде массива DriverPropertyInfo.

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

#SQL
Читать полностью
Назовите несколько примеров java.lang.Error

Как уже упоминалось ранее, исключения типа Error говорят о серьезных проблемах во время выполнения программы. Вот все ошибки стандартной библиотеки Java SE:

• AnnotationFormatError – AnnotationParser (Reflection) обнаружил дефект .class-файла аннотации;
• AssertionError – провалилась проверка утверждения (ключевое слово assert). Используется в тестах;
• CoderMalfunctionError – неисправность при кодировании/декодировании Unicode (в пакетах java.io/java.nio);
• ServiceConfigurationError – проблема с загрузкой сервисов в ServiceLoader (Service Provider Interface);
• IOError – серьезная ошибка ввода-вывода;
• ThreadDeath – особенная ошибка: в отличие от остальных наследников Error, это – «нормальное явление», сигнал асинхронного завершения текущего потока;

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

• VirtualMachineError – JVM сломалась. Абстрактный класс-предок для:
◦ StackOverflowError – переполнение стека вызовов, обычно встречается при бесконечной рекурсии;
◦ OutOfMemoryError – кончилась память, и GC уже не помогает;
◦ InternalError – внутренняя проблема JVM. Её единственный наследник ZipError не используется с Java 9;
◦ UnknownError – что-то другое.

#Классы
Читать полностью
Обычно мы не публикуем здесь новости, но сейчас происходит нечто важное, что незаслуженно обходится вниманием.

Компания GitLab (главный конкурент GitHub) по просьбам нескольких клиентов рассматривает изменение принципов найма сотрудников. Если изменение будет принято, в компании станет запрещено нанимать жителей России и Китая, а нынешним работникам будет запрещено переезжать в эти страны.

Инициативу подал технический сотрудник – Эрик Джонсон, вице-президент компании по инженирингу. Такие вот «инженерные решения» встречаются в свободном западном мире.

#Новости
Читать полностью