Что будет выведено на экран после выполнения следующего кода?
Anonymous Quiz
20%
122
28%
111
19%
112
33%
222
Какие есть преимущества у массива перед коллекцией?
Для хранения ссылочных типов массив подходит хуже чем
Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.
1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных,
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.
С другой стороны, для массива всё так же нужно написать больше кода, он сложнее. Поэтому замена листов на массивы обычно считается излишней микрооптимизацией.
Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть
#Коллекции
@javatg
Для хранения ссылочных типов массив подходит хуже чем
ArrayList
. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.
1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных,
Object
занимает дополнительную память под метаинформацию;3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.
С другой стороны, для массива всё так же нужно написать больше кода, он сложнее. Поэтому замена листов на массивы обычно считается излишней микрооптимизацией.
Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть
HashMap
с целочисленными ключами – SparseArray.#Коллекции
@javatg
Forwarded from Android разработка
Нужно ли думать о сохранении состояния, если приложение поддерживает только портретную ориентацию?
– Да.
Поворот экрана – это частный случай Configuration Changes. Другой пример – изменение языка системы.
Кроме того, как было упомянуто постом выше, система может уничтожить активити, чтобы использовать занятые ей ресурсы. В этом случае состояние сохраняется и восстанавливается при пересоздании активити.
#State
Fragment
Fragment используется для отображения части UI на экране. Фрагмент создается внутри активити или внутри другого фрагмента.
Для создания и управления фрагментами используется FragmentManager.
Класс-наследник класса Fragment должен иметь дефолтный конструктор без параметров. Система использует этот конструктор при пересоздании фрагмента.
Начиная с API v28 системный класс Fragment – deprecated. Рекомендуется использовать Fragment из Support Library.
#Fragment
@android_its - все о Android разработке
– Да.
Поворот экрана – это частный случай 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 в иерархическом порядке.
Назовите исключения, создаваемые классами Spring DAO.
На диаграмме изображены все классы Spring DAO в иерархическом порядке.
Как разбить строку на слова?
Вместо него рекомендуется использовать метод
Другой подходящий метод –
#Строки
@javatg
StringTokenizer
– специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.Вместо него рекомендуется использовать метод
String.split()
. Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.Другой подходящий метод –
Pattern.split()
. Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split()
. Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.#Строки
@javatg
Карьерный путь: от гида в Барселоне до автоматизатора тестирования на Java
https://tproger.ru/articles/karernyj-put-ot-gida-v-barselone-do-avtomatizatora-testirovanija-na-java/
@javatg
https://tproger.ru/articles/karernyj-put-ot-gida-v-barselone-do-avtomatizatora-testirovanija-na-java/
@javatg
Tproger
Как я бросил туризм в Барселоне и стал тестировщиком Java
Инженер-энергетик из Москвы сперва ушёл в туризм и переехал в Барселону, а затем стал тестировщиком и устроился в международную компанию.
Какая разница между @Controller и @RestController?
Controller – это один из стереотипов Spring Framework. Компоненты такого типа обычно занимаются обработкой сетевых запросов. Контроллер состоит из набора методов-обработчиков, помеченных аннотацией
Ответ на запрос можно сформировать разными способами: например просто вернуть из обработчика строку с именем jsp-файла, или же вернуть
Большинство современных API реализуется по архитектуре REST. В ней каждая сущность доступна под собственным URI. В методе-обработчике возвращается экземпляр класса этой сущности, который преобразуется в ответ сервера одним из
#Spring
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
Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».
Агрегация предполагает, что объекты связаны взаимоотношением «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
Согласно 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
Forwarded from Java tests
Что произойдет в результате компиляции кода?
Anonymous Quiz
59%
Ошибка компиляции в строке 4.
7%
Ошибка компиляции в строке 5.
7%
Ошибка компиляции в строке 6.
27%
Код скомпилируется успешно
Можно ли удалять части API?
Иногда этот вопрос можно встретить в форме задачи. Когда библиотека попадает в пользование широкого круга разработчиков, на её разработку фактически накладывается ограничение обратной совместимости. То есть, если в следующей версии вдруг пропадут используемые классы и их члены, разработчики не захотят обновляться. Тогда развитие библиотеки остановится.
Это масштабная и сложная проблема. В её решении помогает в первую очередь семантическое версионирование и механизм прекращения поддержки (deprecation).
В новой версии библиотеки некоторые компоненты API могут получать аннотацию
Ранее мы уже писали об особенностях использования
Обычно разработчики библиотеки дают пользователю запас времени на миграцию. Они предоставляют Deprecation policy – документ, в котором дают обещание, сколько времени (или версий) после появления
Для поиска в коде использования deprecated компонентов комплект JDK содержит утилиту jdeprscan. Утилита
#Инструменты
@javatg
Иногда этот вопрос можно встретить в форме задачи. Когда библиотека попадает в пользование широкого круга разработчиков, на её разработку фактически накладывается ограничение обратной совместимости. То есть, если в следующей версии вдруг пропадут используемые классы и их члены, разработчики не захотят обновляться. Тогда развитие библиотеки остановится.
Это масштабная и сложная проблема. В её решении помогает в первую очередь семантическое версионирование и механизм прекращения поддержки (deprecation).
В новой версии библиотеки некоторые компоненты API могут получать аннотацию
@Deprecated
. Функционально она не делает в программе ничего, но разработчик получит на этапе компиляции предупреждение: компонент устарел и не должен больше использоваться.Ранее мы уже писали об особенностях использования
@Deprecated
. Собираясь удалить компонент API, нужно прежде отметить его @Deprecated(forRemoval=true)
.Обычно разработчики библиотеки дают пользователю запас времени на миграцию. Они предоставляют Deprecation policy – документ, в котором дают обещание, сколько времени (или версий) после появления
@Deprecated
компонент всё еще не будет удален.Для поиска в коде использования deprecated компонентов комплект JDK содержит утилиту jdeprscan. Утилита
javadoc
собирает список устаревших компонентов в отдельную страницу deprecated-list.html
.#Инструменты
@javatg
Wikipedia
Нумерация версий программного обеспечения
Жизненный цикл успешной компьютерной программы может быть очень долгим; изменения в программе бывают разными — от исправления ошибки до полного переписывания. В большинстве случаев название программы остаётся тем же, изменяется подназвание — так называемая…