Java Interview Review

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

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


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
TGStat Bot
Бот для получения статистики каналов не выходя из Telegram
Telegram Analytics
Подписывайся, чтобы быть в курсе новостей TGStat.
SearcheeBot
Ваш гид в мире Telegram-каналов
3 969
подписчиков
~3.7k
охват 1 публикации
~2.7k
дневной охват
~4
постов / нед.
92.1%
ERR %
6.11
индекс цитирования
Репосты и упоминания канала
16 упоминаний канала
13 упоминаний публикаций
1 репостов
Android Interview Review
Clean Code
Kosmos Time
Next 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
Последние публикации
Удалённые
С упоминаниями
Репосты
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) по просьбам нескольких клиентов рассматривает изменение принципов найма сотрудников. Если изменение будет принято, в компании станет запрещено нанимать жителей России и Китая, а нынешним работникам будет запрещено переезжать в эти страны.

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

#Новости
Читать полностью
Как выбрать между Statement, PreparedStatement и CallableStatement?

Statement – SQL-выражение, подготовленное к выполнению в рамках определенной JDBC-сессии. Выполняется методом execute для обычного выражения, executeUpdate для модифицирующего, executeBatch для пакетного. Когда ожидаемый размер результата больше Integer.MAX_VALUE, используются версии методов executeLarge*.

После выполнения, экземпляр Statement владеет ResultSet-ом, и другими данными о результате выполнения, такими как количество обновленных записей и сгенерированные ключи.

PreparedStatement – предскомпилированная версия Statement, его наследник. Эффективнее выполняет одно и то же выражение множество раз. Входные параметры объявляются в SQL-выражении символом ?, следом сеттерами задаются их типы и значения. Делегирует обязанность экранировать введенные пользователем параметры базе данных.

CallableStatement – наследник PreparedStatement для вызова хранимых процедур. Кроме входных параметров, позволяет регистрировать выходные.

Экземпляры всех трех типов создаются методами интерфейса Connection.

#SQL
Читать полностью
Перечислите все мета-аннотации

Мета-аннотации – это аннотации для объявления других аннотаций. Вообще мета-аннотациями можно назвать любую аннотацию с таргетом ANNOTATION_TYPE, но основных в Java существует 5. Они определяют для аннотации:

• @⁠Retention – переживет ли компиляцию. Подробнее...

• @⁠Inherited – применяется к наследникам. Подробнее...

• @⁠Repeatable – применяема несколько раз к одному и тому же элементу. Подробнее...

• @⁠Target – контексты, в которых можно применять. Подробнее...

• @⁠Deprecated – не должна использоваться. Подробнее...

#Аннотации
Читать полностью
Java Interview Review 30 Oct, 18:00
Как используется @⁠Deprecated?

Этой аннотацией помечают код, который устарел и не должен быть более использован. Классы, которые используют или переопределяют @Deprecated элементы, будут компилироваться с warning-ом.

Имеет retention RUNTIME, что значит, что фреймворки могут динамически проверять наличие аннотации на элементе с помощью Reflection API.

Начиная с Java 9 у этой аннотации появились опциональные параметры – строка since и булево значение forRemoval. В since указывается версия вашего приложения, начиная с которой элемент считается устаревшим. Значение true в forRemoval предупреждает, что со следующей мажорной версии этот элемент будет удален. Такое нововведение связано с изменением политики устаревания – с Java 9 и устаревшие элементы самой JDK тоже могут удаляться в будущих версиях.

Обычно, когда элемент помечают устаревшим, причины устаревания и дальнейшие рекомендации указывают в его Javadoc-документации под тегом @deprecated.

#Аннотации
Читать полностью
Java Interview Review 28 Oct, 18:01
Для чего служит Java KeyStore?

KeyStore и TrustStore – это хранилища криптографических публичных и приватных ключей и сертификатов. Обычно они представляются файлами формата .jks, .dks, .p12, и другими, в зависимости от типа хранилища.

Для манипуляций над файлами хранилищ в JDK поставляется специальная утилита – keytool. Отдельные ключи разных типов добавляются в хранилище под заданными именами (alias). Еще этот файл называют базой данных сертификатов. Этот файл обычно защищен паролем.

KeyStore и TrustStore устроены похоже, но служат разным целям. KeyStore хранит данные о нашем приложении, тогда как TrustStore – о других, которым мы доверяем.

По умолчанию не подключается никакой KeyStore. Подключить его можно параметрами javax.net.ssl.keyStore (расположение файла), javax.net.ssl.keyStoreType (тип) и javax.net.ssl.keyStorePassword (пароль). Добавочные можно загружать динамически, классом java.security.KeyStore.

По умолчанию в приложении подключен один TrustStore, файл jre/lib/security/cacerts. Переопределить его можно параметрами JVM javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword и javax.net.ssl.trustStorePassword.

Типичный пример использования – подключить TrustStore с самоподписанным SSL сертификатом, чтобы приложение могло ходить на определенный сайт по протоколу HTTPS, не проваливая проверку безопасности. Либо же подключить KeyStore с подлинным SSL сертификатом, чтобы приложение само работало как HTTPS-сервер.

#Безопасность
Читать полностью
Java Interview Review 25 Oct, 18:00
Дженерики в исключениях – что можно, а что нельзя?

1. Можно выбрасывать исключение generic-типа.
Тип-параметр T может использоваться в throws, переменная типа T может использоваться в throw. Недавно мы уже говорили об этом.

2. Нельзя использовать дженерик в catch.
Множественные блоки catch должны идти без повторений, в определенном порядке – от специфичного класса к более базовому. Стирание типов-параметров в связи с этими правилами добавило бы путаницу, не неся особой пользы.

3. Нельзя параметризовать класс-исключение типами.
Если вы попытаетесь скомпилировать конструкцию вида class MyException extends Throwable {}, то увидете ошибку generic class may not extend java.lang.Throwable.

4. Можно реализовывать исключением generic-интерфейс.
Исключение вполне может быть например Comparable или Iterable. Механизм обработки исключений работает на классах, никак не затрагивая интерфейсы.

#Дженерики
Читать полностью
Java Interview Review 24 Oct, 18:00
🔥Открыт набор на курс «Разработчик на Spring Framework»🔥

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

👉🏻ПРОЙТИ ТЕСТ В ГРУППУ: https://otus.pw/HiGT/

Вас ждет практика современных возможностей IoC-контейнера Spring, разработка Web-приложений, как для собственных проектов, так и для больших проектов на микросервисной архитектуре, погружение в использование стека Reactive Spring.

👉🏻А в завершение – работа над выпускным проектом (выполняется на основе Spring Boot с применением в работе DB и с использованием Spring Data репозиториев и/или Spring JDBC).

Проходите вступительное тестирование и присоединяйтесь!
Читать полностью
Java Interview Review 23 Oct, 18:01
Можно ли достать параметры метода рефлекшеном?

По умолчанию – нет. Рефлекшн-информация о параметрах метода представляется объектами класса Parameter. По умолчанию их свойство name синтетическое: "arg0", "arg1", и так далее. Метод isNamePresent при этом возвращает false, что значит что действительная информация об имени недоступна. Она не попадает даже в байт-код.

Начиная с Java 8 у компилятора (javac) появилась опция -parameters. В скомпилированный с этой опцией класс добавляются имена аргументов методов. Parameter#getName() тогда возвращает уже настоящее имя.

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

До появления флага -parameters Jackson использовал для этого аннотации. Каждый параметр снабжался аннотацией @JsonProperty. Значением аннотации передавалась строка, которая повторяла имя параметра. Эти аннотации затем можно было получить, вызвав Method#getParameterAnnotations().

#JVM
Читать полностью
Java Interview Review 21 Oct, 20:30
Как применить регулярное выражение в Java?

Регулярные выражения – мощный механизм работы со строками. Здесь мы не будем говорить о регулярных выражениях в целом, поговорим об их использовании в Java. Это становится возможно благодаря пакету java.util.regex стандартной библиотеки.

Работа с регулярными выражениями в Java начинается с класса Pattern. Это представление самого выражения, без привязки к целевому тексту. Создать его можно компиляцией строки, с помощью фабричного метода Pattern.compile(). Паттерн иммутабельный и потокобезопасный.

Matcher – регулярное выражение, примененное к конкретному тексту. Пораждается вызовом метода Pattern.matches(). Одним паттерном можно порождать несколько разных матчеров. В отличие от паттерна, матчер мутирует. Он не безопасен для многопоточной среды. Основные операции регулярных выражений – перебор совпадений, доступ к группам, замена – реализованы именно в этом классе.

Работа с экземпляром Matcher похожа на работу с итератором. Результат метода matches() просто скажет, соответствует ли строка шаблону. Но после его вызова матчер поменяет состояние. Теперь, из него можно получить группы, позицию совпадения в тексте, а также произвести замену.

В объекте шаблона Pattern реализованы несколько методов-сокращений, чтобы не использовать Matcher явно. Например, просто проверить строку на соответствие выражению можно одним методом Pattern.matches().

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

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

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

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

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

🔹Зачем нужен Docker? - Обзор самых актуальных проблем - Как Docker их решает
🔹Обзор внутреннего устройства Docker - Контейнерная виртуализация - Auths - Docker registry
🔹Собираем и запускаем свой первый Docker контейнер
🔹Обзор систем оркестрации для Docker

Кто ведет?

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

Открытые еженедельные DevOps практикумы, расписание на Октябрь - https://clck.ru/JWACJ
Присоединяйтесь!
Читать полностью
Java Interview Review 18 Oct, 18:00
#пятница

250 видео о Java.
Хотя подборке уже 4 года, в ней много всё еще актуального.

https://habr.com/ru/company/luxoft/blog/272025/
Java Interview Review 17 Oct, 18:00
Классы BigInteger и BigDecimal (2/2)

У класса BigDecimal есть редкая особенность: у него не согласованы методы equals() и compareTo(). equals() сравнивает значения с точки зрения структуры объекта – компоненты точности, размерности и значения сравниваются по отдельности. Так equals на числах 0.1 и 0.10 вернет false – у них разная точность, 1 и 2. compareTo() сравнивает числа с математической точки зрения – на тех же 0.1 и 0.10 compareTo вернет 0.

Вместе с BigDecimal активно используется класс MathContext. Это точность, плюс план действий когда значение в нее не влазит – стратегия округления. MathContext можно передавать как в конструктор, так и в математические операции.

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

#Классы
Читать полностью
Java Interview Review 16 Oct, 18:01
Классы BigInteger и BigDecimal (1/2)

BigInteger и BigDecimal – иммутабельные числа с заданной точностью. Эти классы – наследники Number, наряду с обертками примитивных чисел. В классах также реализованы базовые математические операции. Наибольший интерес представляет класс BigDecimal – дробное число.

Числа с плавающей точкой (float, double) хранят свои значения в памяти в экспоненциальном виде: знак-порядок-мантисса. Этот факт приводит к неочевидным с точки зрения десятичной системы округлениям при математических операциях.

BigDecimal хранит число в десятичном виде: немасштабированное значение (intVal), размерность (scale), точность (precision) и знак. Значение раскладывается на эти компоненты как intVal ÷ 10^scale. Точность – количество используемых знаков, без учета нулей в начале, но с учетом нулей в конце. Точность числа 0.0010 – 2.

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

#Классы
Читать полностью
Java Interview Review 14 Oct, 18:01
Можно ли выбрасывать исключение generic-типа?

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

Чтобы объявить, что метод выбрасывает исключение обобщенного типа T, этот тип T должен быть объявлен расширяющим Throwable. Именно в Throwable в таком случае сотрется T при компиляции. Также в качестве типа-верхней границы можно использовать любого наследника Throwable:

class MyClass {
void foo() throws T {
// ...
}
}

#Дженерики
Читать полностью