Telegram Web Link
Что будет выведено на экран после выполнения следующего кода?

@javatg
Что будет выведено на экран после выполнения следующего кода?
Anonymous Quiz
20%
122
28%
111
19%
112
33%
222
Какие есть преимущества у массива перед коллекцией?

Для хранения ссылочных типов массив подходит хуже чем ArrayList. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.

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

1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных, Object занимает дополнительную память под метаинформацию;
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.

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

Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть HashMap с целочисленными ключами – SparseArray.

#Коллекции

@javatg
Нужно ли думать о сохранении состояния, если приложение поддерживает только портретную ориентацию?

– Да.

Поворот экрана – это частный случай Configuration Changes. Другой пример – изменение языка системы.

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

#State

Fragment

Fragment используется для отображения части UI на экране. Фрагмент создается внутри активити или внутри другого фрагмента.

Для создания и управления фрагментами используется FragmentManager.

Класс-наследник класса Fragment должен иметь дефолтный конструктор без параметров. Система использует этот конструктор при пересоздании фрагмента.

Начиная с API v28 системный класс Fragment – deprecated. Рекомендуется использовать Fragment из Support Library.

#Fragment

@android_its - все о Android разработке
При выполнении следующего кода будет сгенерировано исключение:
Anonymous Quiz
43%
IndexOutOfBoundsException
8%
ArithmetException
37%
ArrayIndexOutOfBoundsException
7%
ArrayIndexOutOfBoundsException и ArithmetException
6%
Узнать ответ
#вопросы_с_собеседований
Назовите исключения, создаваемые классами Spring DAO.

На диаграмме изображены все классы Spring DAO в иерархическом порядке.
Как разбить строку на слова?

StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.

Вместо него рекомендуется использовать метод String.split(). Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.

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

#Строки

@javatg
Какая разница между @⁠Controller и @⁠RestController?

Controller – это один из стереотипов Spring Framework. Компоненты такого типа обычно занимаются обработкой сетевых запросов. Контроллер состоит из набора методов-обработчиков, помеченных аннотацией @RequestMapping.

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

Большинство современных API реализуется по архитектуре REST. В ней каждая сущность доступна под собственным URI. В методе-обработчике возвращается экземпляр класса этой сущности, который преобразуется в ответ сервера одним из HttpMessageConverter-ов. Например, в JSON его превратит MappingJackson2HttpMessageConverter. Чтобы использовать этот способ ответа, метод, или весь контроллер, должен иметь аннотацию @ResponseBody.

@RestController – это просто сокращенная запись для @Controller + @ResponseBody.

#Spring
Какой шаблон проектирования лежит в основе класса java.lang.StringBuffer?
Anonymous Quiz
8%
Abstract Factory
62%
Builder
6%
Facade
7%
Adapter
17%
Узнать ответ
Для чего в Java используются статические блоки инициализации?

Статические блоки инициализация используются для выполнения кода, который должен выполняться один раз при инициализации класса загрузчиком классов, в момент, предшествующий созданию объектов этого класса при помощи конструктора. Такой блок (в отличие от нестатических, принадлежащих конкретном объекту класса) принадлежит только самому классу (объекту метакласса Class).
В чем разница между композицией и агрегацией?

Ассоциация
обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

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

@javatg
Какая связь между методами hashCode() и equals()?

Согласно Oracle, существует следующее правило:

Если два объекта равны (т.е. метод equals() возвращает true), у них должен быть одинаковый хэш-код.

При этом не стоит забывать, что одинаковый хэш-код может быть у двух разных объектов.

Xтобы разобраться, почему же equals() и hashCode() переопределяют всегда в паре, рассмотрим следующие случаи:
Оба метода переопределенные.

В таком случае два разных объекта с одинаковыми внутренними состояниями будут возвращать при equals() — true, в то время как и hashCode() будет у обоих возвращать одно и то же число.

Получается, все окей, ибо правило выполняется.

Оба метода не переопределенные.

В таком случае два разных объекта с одинаковыми внутренними состояниями при equals() будут возвращать false, так как сравнение идёт по ссылке через оператор ==.

Метод hashCode() также вернет разные значения (скорее всего), так как он выдает преобразованное значение адреса ячейки памяти. Но у одного и того же объекта это значение будет одинаковым, как и equals() в данном случае вернет true, только когда ссылки указывают на один и тот же объект.

Получается, и в данном случае все окей и правило выполняется.

Переопределен equals(), не переопределен hashCode().

В таком случае для двух разных объектов с одинаковыми внутренними состояниями equals() будет возвращать true, а hashCode() будет возвращать (скорее всего) разные значения.

Происходит нарушение правила, поэтому так делать не рекомендуется.

Не переопределен equals(), переопределен hashCode().

В таком случае для двух разных объектов с одинаковыми внутренними состояниями equals() будет возвращать false, а hashCode() будет возвращать одинаковые значения.

Происходит нарушение правила, поэтому подход неверный.

Как вы видите, выполнение правила возможно лишь когда equals() и hashCode() переопределяются оба либо оба не переопределяются вовсе.

Подробнее об equals() и hashCode() читайте в данной статье.

@javatg
Forwarded from Java tests
Что произойдет в результате компиляции кода?

@java_quizes - интересные задачи и тесты Java
Можно ли удалять части API?

Иногда этот вопрос можно встретить в форме задачи. Когда библиотека попадает в пользование широкого круга разработчиков, на её разработку фактически накладывается ограничение обратной совместимости. То есть, если в следующей версии вдруг пропадут используемые классы и их члены, разработчики не захотят обновляться. Тогда развитие библиотеки остановится.

Это масштабная и сложная проблема. В её решении помогает в первую очередь семантическое версионирование и механизм прекращения поддержки (deprecation).

В новой версии библиотеки некоторые компоненты API могут получать аннотацию @Deprecated. Функционально она не делает в программе ничего, но разработчик получит на этапе компиляции предупреждение: компонент устарел и не должен больше использоваться.

Ранее мы уже писали об особенностях использования @Deprecated. Собираясь удалить компонент API, нужно прежде отметить его @Deprecated(forRemoval=true).

Обычно разработчики библиотеки дают пользователю запас времени на миграцию. Они предоставляют Deprecation policy – документ, в котором дают обещание, сколько времени (или версий) после появления @Deprecated компонент всё еще не будет удален.

Для поиска в коде использования deprecated компонентов комплект JDK содержит утилиту jdeprscan. Утилита javadoc собирает список устаревших компонентов в отдельную страницу deprecated-list.html.

#Инструменты

@javatg
Скомпилируется ли код на картинке?

Нет. Ошибка во время компиляции, т. к. одна и та же константа перечисления появляется более одного раза в аннотации @Target.
Удаление повторяющейся константы приведет к успешной компиляции кода:

@Target({ ElementType.FIELD, ElementType.TYPE})
2024/10/04 17:17:09
Back to Top
HTML Embed Code: