Java Interview Review

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

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


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
TGStat Bot
Бот для получения статистики каналов не выходя из Telegram
Telegram Analytics
Подписывайся, чтобы быть в курсе новостей TGStat.
SearcheeBot
Ваш гид в мире Telegram-каналов
5 150
подписчиков
~4.2k
охват 1 публикации
~2.8k
дневной охват
~5
постов / нед.
82%
ERR %
7.91
индекс цитирования
Репосты и упоминания канала
23 упоминаний канала
18 упоминаний публикаций
1 репостов
Программист
Продакшн
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
Android Interview Review
Android Interview Review
trgt
Лысый из браузера
Android Interview Review
Android Interview Review
Последние публикации
Удалённые
С упоминаниями
Репосты
Можно ли переопределить статический метод?

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

На перегрузку (overload) статического метода не накладывается никаких ограничений. С точки зрения компилятора, методы с разным списком аргументов – разные методы. Но это не переопределение.

Метод с модификатором static относится к классу, а не к его объектам. Для него работает статическое связывание, поэтому именно переопределение (override) в дочернем классе не работает.

Несмотря на это, в дочернем классе можно объявить static метод с такой же сигнатурой, как в родительском. В этом случае произойдет не перегрузка и не переопределение, а перекрытие (shadowing). К такому методу нельзя применить аннотацию @Override, в нём нельзя использовать ключевое слово super.

Если вы вызываете статический метод от переменной, а не типа, перекрытие таит в себе опасность. Без динамического связывания компилятор знает только о типе переменной, но не о типе ее значения. Если объявленный тип переменной – базовый класс, то метод-перекрытие никогда не вызовется. Поэтому при попытке такого вызова в IDE мы видим предупреждение.

#Язык
Читать полностью
Java Interview Review 31 Mar, 18:01
Когда использовать WEB-INF, а когда META-INF?

В корне архива java-приложения часто встречаются директории WEB-INF и META-INF. Обе директории хранят в себе различные файлы с метаинформацией о программе, обычно в текстовом виде: yaml, xml, json, обычный текст.

META-INF используется в архивах всех типов. Главный файл этой директории – MANIFEST.MF, о котором уже говорили ранее. Там же хранятся
• Объявления провайдеров SPI;
• Подпись архива: файлы .SF, .DSA, .RSA;
• INDEX.LIST с подсказками о местонахождении пакетов для загрузчика.
Иногда (не часто) приложения добавляют туда свои статические ресурсы, так как эта директория попадает в classpath и доступна в рантайме.

WEB-INF используется только в web-архивах (.war). Она не заменяет, но дополняет META-INF. В ней хранится:
• Главный файл web-приложения web.xml;
• Дескрипторы тегов .TLD;
• Поддиректория classes/ с классами web-приложения;
• Поддиректория lib/ с .jar-библиотеками зависимостей;
• Поддиректория tag/ с файлами тегов.

#Инструменты
#JavaEE
Читать полностью
Java Interview Review 27 Mar, 18:01
Для чего нужно ключевое слово super?

Как и многие другие ключевые слова, super имеет несколько разных значений в зависимости от контекста:

1. Задать нижнюю границу generic-типа: Consumer
Java Interview Review 26 Mar, 18:01
Как приложению ограничить доступ к файлу?

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

Внутри менеджера представлен набор методов check*(), которые делегируют выполнение основному методу checkPermission(). Сам доступ, права на который нужно проверить, представляется классом java.security.Permission. Так, доступ к файлу на чтение проверяет метод checkRead. Он передает в checkPermission объект FilePermission с указанным именем файла.

Экземпляр класса SecurityManager, который реализует нужную логику ограничения доступа, можно установить программно методом System.setSecurityManager, или на старте приложения флагом -Djava.security.manager. По умолчанию менеджер не установлен.

Менеджер безопасности изначально был нужен для ограничения апплетов – они выполнялись в браузере пользователя и не должны были получить доступ к локальным пользовательским данным. Сейчас технология апплетов устарела, но SecurityManager остается всё таким же актуальным.

#Безопасность
Читать полностью
Java Interview Review 24 Mar, 18:01
Завтра, 25 марта в 20:00 мск OTUS приглашает на День открытых дверей онлайн-курса «Разработчик Java»: https://otus.pw/ZAyZ/

— Старт 15-ого набора уже на этой неделе - успейте пройти тест и попасть в группу со скидкой 20%: https://otus.pw/HWgf/

📌На бесплатном вебинаре:
— вы познакомитесь с преподавателем Сергеем Петрелевичем — Java-разработчиком и экспертом по разработке высоконадежных трейдинговых приложений. Специалистом с 17-летним опытом работы в отрасли, который на практике знает, как часто приходится погружаться в детали внутренней реализации виртуальной машины Java и заглядывать «под капот» популярных фреймфорков;
— сможете задать любые вопросы по продвинутой Java-разработке;
— узнаете подробнее о хардкорной программе курса, формате обучения и выпускном проекте;
— расскажем о карьерных перспективах.

Вебинар рассчитан на программистов с опытом разработки на Java и других языках ООП.
Читать полностью
Java Interview Review 24 Mar, 10:01
Что хранится в файле манифеста?

В JAR архиве можно найти файл META-INF/MANIFEST.MF. Это манифест архива – хранилище его метаинформации. Манифест обычно добавляется той же утилитой, которой собирается jar-файл: maven-jar-plugin, команда JDK jar.

Манифест – текстовый файл, который состоит из заголовков, строчек вида ключ: значение. Заголовки разделены на секции. Файл начинается с главной секции, описывающей метаинформацию всего архива. Следом, отделенные пустыми строками, идут секции для отдельных пакетов и файлов. В них могут переопределяться общие заголовки. JVM игнорирует неизвестные ей заголовки, что позволяет сторонним утилитам хранить в манифесте свою специфичную метаинформацию.

Вот некоторые из часто используемых заголовков:
• Информация об архиве: Manifest-Version, Created-By, Multi-Release, Built-By
• Main-class – точка входа приложения
Classpath приложения
• Информация об экстеншне (Specification и Implementation, deprecated)
• Заголовки OSGI бандла
• Типы и хэши файлов архива (особенно применимо в Android приложениях)

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

#JVM
Читать полностью
Java Interview Review 19 Mar, 18:00
OTUS открывает новый набор онлайн-курса «Алгоритмы для разработчиков».

Пройдите вступительный тест и поступите в группу со скидкой -20%: https://otus.pw/7Mv9/

Знание классических алгоритмов и структур данных — обязательное требование, которое предъявляют брендовые IT-компании к претендентам на вакансию Middle developer.

Благодаря этим знаниям можно повысить производительность и улучшить качество кода. Именно поэтому так важно понимать принципы работы алгоритмов и структур данных и уметь использовать их с учётом поставленных задач. Получить эти ценные навыки вы сможете на курсе по уникальной авторской программе от Михаила Горшкова - инженера-программиста известной международной компании с 18-летним опытом программирования.

Онлайн-курс предназначен для разработчиков, владеющих С++/Python/Java. Он подходит и для Middle-специалистов, которые застоялись на месте, и для «джуниоров», которые хотят быстрее вырасти как профессионалы и избежать многих ошибок.

Проходите вступительное тестирование и присоединяйтесь - будет круто:
https://otus.pw/7Mv9/
Читать полностью
Java Interview Review 18 Mar, 18:01
Сравните репозитории Spring Data

Основная часть работы в Spring Data строится вокруг интерфейса Repository. Это маркерный интерфейс. От него наследуются интерфейсы-специализации, которые уже содержат методы для работы с сущностями базы данных. Все эти интерфейсы параметризуются двумя типами: самой сущности и её идентификатора.

CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).

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

JpaRepository – расширение PagingAndSortingRepository, полноценно реализующее Java Persistence API. Добавляет ряд методов, таких как например flush и deleteInBatch.

MongoRepository – расширение PagingAndSortingRepository, специфичное для MongoDB.

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

#Spring
Читать полностью
Java Interview Review 17 Mar, 18:00
Когда используется StampedLock?

StampedLock – примитив синхронизации, добавленный в Java с версии 8. Общий принцип его работы точно такой же, как у ReadWriteLock: захват неэксклюзивной блокировки (на чтение), и эксклюзивной (на запись). Но есть у этих классов ряд различий в деталях.

Во-первых, если блокировка ReadWriteLock возвращает объекты типа Lock, то StampedLock возвращает числа типа long, которые и называется «штампами». Штамп служит идентификатором лока, он передается параметром в методы по работе с ранее захваченной блокировкой чтения или записи. Специальный штамп 0 означает неудавшийся захват.

StampedLock в отличие от ReentrantReadWriteLock – не реентрант. Это накладывает бóльшую ответственность на программиста: можно устроить дедлок на одном потоке.

В StampedLock расширена функциональность. Новые методы с префиксом try* не висят в ожидании. Методы tryOptimistic* реализуют оптимистичную блокировку. Методы tryConvert* дают возможность изменять «уровень» заблокированности: можно попытаться превратить readLock во writeLock, и наоборот.

Не смотря на похожесть, StampedLock не наследуется от ReadWriteLock. Но для совместимости в нём предусмотрены методы-адаптеры asReadWriteLock, asReadLock и asWriteLock.

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

#Многопоточность
Читать полностью
Java Interview Review 16 Mar, 18:01
Видеокурс по Java-разработке от OTUS – быстрый старт в профессии для начинающих программистов. Подробнее 👉🏻 https://otus.pw/nwcU/

✅ Удобный видео-формат
✅ Доступная цена
✅ Проверочные тесты после каждой темы

Бонус при покупке — 10% скидка на любой основной курс из нашей линейки.
Java Interview Review 13 Mar, 17:00
Как работают фильтры сервлетов?

Servlet содержит саму бизнес-логику обработки запросов. Реализации интерфейса javax.servlet.Filter выстраиваются в цепочку, через которую проходит запрос по пути в сервлет, и ответ на него по пути обратно к пользователю.

Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.

Фильтр состоит из трех методов: init, doFilter и destroy. doFilter – основная реализация фильтрации, он вызывается для каждого запроса. Инициализация и уничтожение вызываются строго по одному разу. Кроме того, сервлет-контейнер гарантирует, что их вызовы не будут пересекаться: doFilter не начнет работать до конца выполнения init, и закончит до начала destroy.

#JavaEE
Читать полностью
Java Interview Review 12 Mar, 18:01
Научись программировать на самом востребованном языке в сфере IT и стань Java-разработчиком.

Чем интересна именно эта профессия? Повторимся, что Java — самый востребованный язык, работать с ним несложно и интересно, заработок немаленький, и еще один большой плюс — можно работать удаленно из любой точки мира. Круто, да?

📌 Тогда забирай курс «Профессия Java-разработчик»
📌 Все подробности по ссылке: https://clc.to/ssH07A

Что тебя ждет:
✔ интересная и продуманная программа курса;
✔ решение бизнес-задач компании;
✔ много часов практики;
✔ доступ к этому курсу на веки-вечные (ну а вдруг ты что-то забудешь);
✔ Бесплатные 2 месяца английского языка в EnglishDom

И самое главное, после обучения Skillbox гарантирует трудоустройство в IT-компанию!
Читать полностью
Java Interview Review 11 Mar, 18:01
Можно ли хранить null в стандартных коллекциях?

Все интерфейсы Collections Framework позволяют своим реализациям самостоятельно решать, поддерживать ли null-значения. Если реализация не может принять null, она выбрасывает NullPointerException или ClassCastException.

Большинство списков (LinkedList, ArrayList) принимают null без проблем. Большинство очередей (Queue и Deque) не хранят null – возвращая из читающего метода null они сообщают пользователю о пустоте коллекции.

Unmodifiable Maps не допускают null-ов совсем. Обычные изменяемые мапы обычно не испытывают трудности со значениями null. А вот с ключами дело обстоит интереснее.

HashMap не может посчитать hash-сумму от null. Но вместо этого для таких ключей просто используется бакет номер 0.

Иногда этот вопрос дается как задача с подвохом про TreeMap. Nullability её ключей зависит от готовности к этому компаратора. Натуральный порядок (который работает для Comparable ключей) не поддерживает null. Раньше в реализации был баг, который позволял положить значение по ключу null в корень дерева без выброса исключения.

Для значений Set-ов действуют те же правила, что для ключей лежащих в основе их Map-ов.

#Коллекции
Читать полностью
Java Interview Review 10 Mar, 18:00
Какие задачи решает Spring Data?

Это проект, который упрощает работу с системами доступа к данным: реляционными и нереляционными базами данных, map-reduce фреймворками и облачными хранилищами. Центральная концепция проекта – репозитории из предметно-ориентированного дизайна (Domain-driven design, DDD).

Spring Data состоит из множества отдельных библиотек для разных случаев жизни. Вот самые популярные из них:

• Spring Data JPA – адаптер для реализаций Java Persistence API, таких как Hibernate.
• Spring Data JDBC – более простой и ограниченный чем JPA адаптер для JDBC-драйверов.
• Spring Data REST – создание готовых hypermedia-driven RESTful сервисов на основе репозиториев.
• Spring Data KeyValue – работа с хранилищами типа ключ-значение.
Библиотеки поддержки конкретных реализаций хранилищ: MongoDB, Redis, Cassandra, LDAP, и других.

#Spring
Читать полностью
Что происходит внутри TreeMap.put()?

Недавно мы в деталях рассматривали, какие процессы происходят при добавлении элемента в HashMap. Теперь поговорим о TreeMap. Здесь не так много тонкостей, как в хэш-таблице.

TreeMap требует либо задать порядок ключей вручную (передать в конструктор Comparator), либо чтобы они имели собственный естественный порядок (были Comparable).

Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).

Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:

1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода compare. Дойдя до конца, пара ключ-значение «повисает» новым узлом.

2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.

Чтобы осознать процесс построения RB-дерева, есть интерактивное демо.

#Коллекции
Читать полностью
Перечислите стандартные функциональные интерфейсы

Стандартная библиотека содержит пакет java.util.function, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:

Функции
Обычная обобщенная функция – интерфейс Function. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).

Бинарные функции – функции с двумя параметрами и возвращаемым значением. BiFunction, ToXBiFunction.

Поставщики (Suppliers)
Интерфейсы Supplier, XSupplier – не принимают ничего, возвращают (поставляют) значение.

Потребители (Consumers)
Consumer, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer и XYConsumer, потребляет два параметра.

Предикаты
Predicate, XPredicate – принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.

Операторы
Унарный (UnaryOperator) и бинарный (BinaryOperator) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.

#Классы
Читать полностью
Какие отличия между @⁠Component, @⁠Service, @⁠Repository и @⁠Controller?

@Component – простой способ сделать объявление класса объявлением Spring-бина. Из всех компонентов, которые попали в сканирование (о которых знает @ComponentScan), будут созданы бин-дефинишны.

Остальные аннотации – это алиасы аннотации @Component. Сами по себе они не добавляют поведения, и технически в рамках ядра Spring Framework работают так же.

Эти аннотации называют «Stereotype annotations». Их главное отличие – семантика, логическая роль компонентов:
• @⁠Service – реализация бизнес-логики;
• @⁠Repository – хранилище данных: «репозиторий» из Domain-Driven Design или классический DAO;
• @⁠Controller – обработка веб-запросов (методы @RequestMapping)

Сторонние компоненты могут пользоваться этой семантикой. Например, трансляция исключений Persistence API работает именно на компонентах стереотипа @Repository. Таким образом, в отдельных случаях кроме семантики может меняться и поведение кода библиотек.

#Spring
Читать полностью
Java Interview Review 28 Feb, 18:01
Как использовать ReadWriteLock?

Стандартный интерфейс ReadWriteLock предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock() и writeLock(). Они возвращают объекты под интерфейсом Lock.

Оба типа блокировок одного экземпляра ReadWriteLock связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock осуществляется модификация ресурса.

Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.

Интерфейс реализуется классом ReentrantReadWriteLock, который во многом похож на обычный ReentrantLock.

#Многопоточность
Читать полностью
Java Interview Review 27 Feb, 18:00
OTUS приглашает на бесплатные вебинары по базовой и продвинутой Android-разработке на Kotlin.

Для регистрации пройдите тест:
📌4 марта в 20:00 мск - вебинар «Быстрый переход на Kotlin для Android-разработки» в рамках базового онлайн-курса: https://otus.pw/jX5B/
Узнаете, почему Android-разработчики предпочитают Kotlin. Познакомитесь с основными возможностями языка. Напишете простое Android-приложение на Kotlin.

📌16 марта в 20:00 мск - вебинар «ProGuard / R8. Сжатие и оптимизация кода для Android-приложений» в рамках продвинутого онлайн-курса: https://otus.pw/xZRG/
Научитесь писать строгие keep директивы и настраивать оптимизации. Увидите, как proguard/R8 миницифируют, оптимизируют и убирают неиспользуемый код. Сравните эффективность proguard и R8. Разберетесь, как внедрять proguard/R8 в проект.

Поделятся экспертизой преподаватели-практики курса Антон Казаков (Руководитель направления Android-разработки одного из крупнейших банков России) и Михаил Борисов (Software Engineer, Android-разработчик на Kotlin с большим опытом).
Читать полностью
Java Interview Review 26 Feb, 18:00
Что такое classpath?

Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.

Кроме непосредственно Java-приложений (команда java), этот параметр применим и для других утилит JDK, таких как javac, javadoc и другие.

Есть два основных способа установки classpath: в переменной окружения ОС CLASSPATH, и в аргументе командной строки -cp (синоним -classpath). Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория.

В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом : в параметре командной строки, или же ; в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ *.

Если приложение запускается из jar-файла (java -jar), classpath должен быть указан в его манифесте.

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