Anonymous Quiz
6%
Создаёт новый поток
92%
Означает, что функция может быть асинхронной
1%
Запускает цикл
1%
Инициализирует переменную
Как будут вести себя linked list и array list, если вставить в них элемент ?
Спросят с вероятностью 13%
LinkedList и ArrayList представляют собой две разные реализации интерфейса
ArrayList
Основан на динамическом массиве. Это означает, что внутри
Добавление элемента в конец списка `ArrayList` (используя метод `add(E e)`):
✅Когда вы добавляете элемент в конец, операция обычно выполняется за время O(1), так как не требуется сдвигать элементы.
✅Однако, если внутренний массив заполнен, и требуется его расширение,
Добавление элемента в середину списка (используя метод `add(int index, E element)`):
✅Если вам нужно вставить элемент в середину списка,
LinkedList
Реализует структуру данных двунаправленного связного списка. Каждый элемент (узел) содержит ссылки на предыдущий и следующий элементы в списке, а также данные элемента.
Добавление элемента в конец списка
✅Это обычно выполняется за время O(1), так как достаточно просто обновить ссылки последнего узла и добавить новый узел в конец.
Добавление элемента в начало списка:
✅Так же как и добавление в конец, добавление элемента в начало списка (используя метод
Добавление элемента в середину списка (используя метод `add(int index, E element)`):
✅Для этого необходимо сначала найти узел, который в данный момент находится на данной позиции. Поскольку для этого требуется пройти от начала или конца списка до индекса, это занимает O(n / 2) в среднем, а затем вставка нового узла происходит за O(1). Таким образом, общая сложность составляет O(n).
Выбор между
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
LinkedList и ArrayList представляют собой две разные реализации интерфейса
List, и каждая из них имеет свои особенности поведения при вставке элементов. Разберем, как эти две структуры данных ведут себя при добавлении элемента, исходя из их внутренней структуры и алгоритмической сложности операций.ArrayList
Основан на динамическом массиве. Это означает, что внутри
ArrayList данные хранятся в массиве, размер которого автоматически увеличивается, когда текущая емкость массива исчерпана.Добавление элемента в конец списка `ArrayList` (используя метод `add(E e)`):
✅Когда вы добавляете элемент в конец, операция обычно выполняется за время O(1), так как не требуется сдвигать элементы.
✅Однако, если внутренний массив заполнен, и требуется его расширение,
ArrayList создает новый массив большего размера и копирует в него все элементы из старого массива, что занимает O(n) времени, где n — количество элементов в списке. Это случается редко, но делает среднюю сложность вставки в конец O(1) (амортизированное время).Добавление элемента в середину списка (используя метод `add(int index, E element)`):
✅Если вам нужно вставить элемент в середину списка,
ArrayList должен сдвинуть все последующие элементы на одну позицию вправо для освобождения места для нового элемента. Эта операция имеет временную сложность O(n - index), где index — индекс, на который вставляется элемент.LinkedList
Реализует структуру данных двунаправленного связного списка. Каждый элемент (узел) содержит ссылки на предыдущий и следующий элементы в списке, а также данные элемента.
Добавление элемента в конец списка
LinkedList (используя методсебя linked или `addLast(E e)`):✅Это обычно выполняется за время O(1), так как достаточно просто обновить ссылки последнего узла и добавить новый узел в конец.
Добавление элемента в начало списка:
✅Так же как и добавление в конец, добавление элемента в начало списка (используя метод
addFirst(E e)) выполняется за время O(1), потому что требуется только изменить несколько ссылок в узлах.Добавление элемента в середину списка (используя метод `add(int index, E element)`):
✅Для этого необходимо сначала найти узел, который в данный момент находится на данной позиции. Поскольку для этого требуется пройти от начала или конца списка до индекса, это занимает O(n / 2) в среднем, а затем вставка нового узла происходит за O(1). Таким образом, общая сложность составляет O(n).
Выбор между
LinkedList и ArrayList зависит от типа операций, которые вы планируете чаще всего выполнять. Если вам нужно быстро добавлять и удалять элементы без учета их позиции, LinkedList может быть более предпочтительным. Если же вам нужен быстрый произвольный доступ к элементам и добавление в конец списка, ArrayList будет лучшим выбором.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍10🔥1
Что известно про extension ?
Спросят с вероятностью 20%
Extension функции и свойства (расширения) позволяют добавлять новую функциональность к существующим классам без их модификации или наследования. Расширения не изменяют класс, к которому они добавлены, а предоставляют способ расширить его функциональность "снаружи".
Extension функции
Позволяют добавлять новые методы к классу. Они объявляются с указанием типа, который они расширяют, за которым следует точка и имя функции. Расширяющая функция внутри своего тела может обращаться к членам класса через
Пример расширяющей функции:
Extension свойства
Подобно функциям, можно объявлять расширяющие свойства, которые позволяют "добавлять" новые свойства к существующим классам.
Пример расширяющего свойства:
Это расширение добавляет к классу
Расширения не могут доступать к приватным или защищенным членам класса, так как они фактически являются внешними функциями или свойствами, добавленными к классу.
Преимущества использования
1️⃣Улучшение читаемости кода: Расширения позволяют писать более четкий и понятный код, особенно когда функциональность тесно связана с конкретным типом данных.
2️⃣Более удобная организация кода: Функциональность можно добавлять к классам без изменения исходного кода класса или создания подклассов.
3️⃣Повышение гибкости: Расширения дают возможность расширять функциональность классов из внешних библиотек или фреймворков, к исходному коду которых у вас нет доступа.
Расширения особенно полезны при работе с библиотеками или фреймворками, когда модификация исходного класса невозможна. Они также идеально подходят для создания DSL (Domain-Specific Languages).
Extension функции и свойства — это мощный инструмент, позволяющий расширять функциональность существующих классов без их изменения или наследования, облегчая тем самым разработку и поддержку кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 20%
Extension функции и свойства (расширения) позволяют добавлять новую функциональность к существующим классам без их модификации или наследования. Расширения не изменяют класс, к которому они добавлены, а предоставляют способ расширить его функциональность "снаружи".
Extension функции
Позволяют добавлять новые методы к классу. Они объявляются с указанием типа, который они расширяют, за которым следует точка и имя функции. Расширяющая функция внутри своего тела может обращаться к членам класса через
this.Пример расширяющей функции:
fun String.lastChar(): Char = this[this.length - 1]
Это расширение добавляет к классу
String функцию lastChar, возвращающую последний символ строки.Extension свойства
Подобно функциям, можно объявлять расширяющие свойства, которые позволяют "добавлять" новые свойства к существующим классам.
Пример расширяющего свойства:
val String.lastChar: Char
get() = this[this.length - 1]
Это расширение добавляет к классу
String свойство lastChar, которое позволяет получить последний символ строки.Расширения не могут доступать к приватным или защищенным членам класса, так как они фактически являются внешними функциями или свойствами, добавленными к классу.
Преимущества использования
1️⃣Улучшение читаемости кода: Расширения позволяют писать более четкий и понятный код, особенно когда функциональность тесно связана с конкретным типом данных.
2️⃣Более удобная организация кода: Функциональность можно добавлять к классам без изменения исходного кода класса или создания подклассов.
3️⃣Повышение гибкости: Расширения дают возможность расширять функциональность классов из внешних библиотек или фреймворков, к исходному коду которых у вас нет доступа.
Расширения особенно полезны при работе с библиотеками или фреймворками, когда модификация исходного класса невозможна. Они также идеально подходят для создания DSL (Domain-Specific Languages).
Extension функции и свойства — это мощный инструмент, позволяющий расширять функциональность существующих классов без их изменения или наследования, облегчая тем самым разработку и поддержку кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍5
Anonymous Quiz
88%
Иммутабельность
6%
Ленивая инициализация
2%
Внутренняя синхронизация
4%
Глобальная видимость
❤2👾1
Чем отличаются единицы измерения, например dp от sp ?
Спросят с вероятностью 13%
Используются различные единицы измерения для указания размеров и расстояний в пользовательском интерфейсе, среди которых наиболее часто используются dp (density-independent pixels) и sp (scale-independent pixels). Обе эти единицы предназначены для обеспечения одинакового визуального представления элементов интерфейса на различных устройствах, но они служат разным целям.
1️⃣Density-independent Pixels (dp)
✅Определение: Или "пиксель, не зависящий от плотности", — это абстрактная единица, которая используется для выражения размеров макета или элементов интерфейса. 1 dp эквивалентен одному пикселю на экране с плотностью 160 dpi (точек на дюйм), которая считается базовой плотностью (mdpi).
✅Цель использования: dp используется для гарантии того, что элементы пользовательского интерфейса (например, кнопки, поля, отступы) будут иметь одинаковый физический размер на всех устройствах, независимо от плотности экрана устройства.
2️⃣Scale-independent Pixels (sp)
✅Определение: Или "пиксель, не зависящий от масштаба", также является абстрактной единицей и используется специально для размеров шрифтов текста.
✅Особенность: Помимо учета плотности экрана, как и dp, sp также учитывает предпочтения пользователя по масштабу текста. Если пользователь увеличивает масштаб текста в настройках доступности своего устройства, размеры текста в sp автоматически увеличиваются, обеспечивая лучшую читаемость.
Основные различия между dp и sp
1️⃣Масштабирование текста: sp масштабируются не только с изменением плотности экрана, но и в зависимости от пользовательских настроек масштабирования текста. Это делает sp предпочтительной единицей для задания размеров текста, чтобы обеспечить его доступность и комфортное восприятие.
2️⃣Использование в макетах: dp рекомендуется использовать для всех других размеров в пользовательском интерфейсе, включая отступы, ширины, высоты элементов и т. д., чтобы обеспечить их консистентность на различных устройствах.
В XML-разметке Android можно указать размер текста в sp и размер элемента в dp:
Такое разделение позволяет оптимизировать приложение для различных устройств и настроек доступности, улучшая пользовательский опыт. Поэтому важно всегда использовать sp для текста и dp для всех остальных размеров в приложении Android.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Используются различные единицы измерения для указания размеров и расстояний в пользовательском интерфейсе, среди которых наиболее часто используются dp (density-independent pixels) и sp (scale-independent pixels). Обе эти единицы предназначены для обеспечения одинакового визуального представления элементов интерфейса на различных устройствах, но они служат разным целям.
1️⃣Density-independent Pixels (dp)
✅Определение: Или "пиксель, не зависящий от плотности", — это абстрактная единица, которая используется для выражения размеров макета или элементов интерфейса. 1 dp эквивалентен одному пикселю на экране с плотностью 160 dpi (точек на дюйм), которая считается базовой плотностью (mdpi).
✅Цель использования: dp используется для гарантии того, что элементы пользовательского интерфейса (например, кнопки, поля, отступы) будут иметь одинаковый физический размер на всех устройствах, независимо от плотности экрана устройства.
2️⃣Scale-independent Pixels (sp)
✅Определение: Или "пиксель, не зависящий от масштаба", также является абстрактной единицей и используется специально для размеров шрифтов текста.
✅Особенность: Помимо учета плотности экрана, как и dp, sp также учитывает предпочтения пользователя по масштабу текста. Если пользователь увеличивает масштаб текста в настройках доступности своего устройства, размеры текста в sp автоматически увеличиваются, обеспечивая лучшую читаемость.
Основные различия между dp и sp
1️⃣Масштабирование текста: sp масштабируются не только с изменением плотности экрана, но и в зависимости от пользовательских настроек масштабирования текста. Это делает sp предпочтительной единицей для задания размеров текста, чтобы обеспечить его доступность и комфортное восприятие.
2️⃣Использование в макетах: dp рекомендуется использовать для всех других размеров в пользовательском интерфейсе, включая отступы, ширины, высоты элементов и т. д., чтобы обеспечить их консистентность на различных устройствах.
В XML-разметке Android можно указать размер текста в sp и размер элемента в dp:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:padding="8dp"
android:text="Пример текста" />
Такое разделение позволяет оптимизировать приложение для различных устройств и настроек доступности, улучшая пользовательский опыт. Поэтому важно всегда использовать sp для текста и dp для всех остальных размеров в приложении Android.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍9
Anonymous Quiz
18%
Возвращает новый объект
26%
Изменяет контекст
52%
Возвращает контекстный объект
4%
Создает анонимный класс
Какое главное отличие между Java и Kotlin касательно абстрактных классов, методов ?
Спросят с вероятностью 13%
Java и Kotlin оба поддерживают концепции абстрактных классов и методов, но существуют определенные различия в подходах и возможностях, связанных с этими концепциями в каждом из языков. Рассмотрим ключевые отличия:
1️⃣Синтаксис и использование
Java:
✅Абстрактные классы и методы объявляются с использованием ключевого слова
✅Абстрактные методы не могут иметь реализации в абстрактном классе.
✅Любой класс, содержащий один или более абстрактных методов, должен быть объявлен абстрактным.
Пример:
Kotlin:
✅Абстрактные классы и методы также объявляются с использованием ключевого слова
✅Абстрактные методы не могут иметь реализации в абстрактном классе.
✅Основное отличие в том, что Kotlin поддерживает свойства (properties), которые могут быть абстрактными, что не поддерживается.
Пример:
2️⃣Наследование и реализация
Java:
✅Классы могут наследовать только один абстрактный класс, так как Java не поддерживает множественное наследование классов.
Kotlin:
✅Также позволяет классам наследовать только один абстрактный класс. Однако он вводит понятие интерфейсов, которые могут содержать реализацию по умолчанию, и класс может реализовывать несколько интерфейсов. Это предоставляет большую гибкость по сравнению с Java.
3️⃣Модификаторы доступа по умолчанию
Java:
✅Если он не указан, по умолчанию он имеет уровень доступа "package-private", что означает, что члены класса доступны только внутри того же пакета.
Kotlin:
✅Если он не указан, по умолчанию он является
И Java, и Kotlin предоставляют мощные средства для работы с абстрактными классами и методами, но Kotlin предлагает более современный подход с дополнительной гибкостью благодаря поддержке свойств, интерфейсов с реализацией по умолчанию и более открытым модификатором доступа по умолчанию. Эти особенности делают его привлекательным выбором для новых проектов и разработчиков, стремящихся использовать более современные практики и возможности языка.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Java и Kotlin оба поддерживают концепции абстрактных классов и методов, но существуют определенные различия в подходах и возможностях, связанных с этими концепциями в каждом из языков. Рассмотрим ключевые отличия:
1️⃣Синтаксис и использование
Java:
✅Абстрактные классы и методы объявляются с использованием ключевого слова
abstract.✅Абстрактные методы не могут иметь реализации в абстрактном классе.
✅Любой класс, содержащий один или более абстрактных методов, должен быть объявлен абстрактным.
Пример:
abstract class Animal {
abstract void makeSound();
void breathe() {
System.out.println("I breathe air.");
}
}Kotlin:
✅Абстрактные классы и методы также объявляются с использованием ключевого слова
abstract.✅Абстрактные методы не могут иметь реализации в абстрактном классе.
✅Основное отличие в том, что Kotlin поддерживает свойства (properties), которые могут быть абстрактными, что не поддерживается.
Пример:
abstract class Animal {
abstract fun makeSound()
fun breathe() {
println("I breathe air.")
}
}2️⃣Наследование и реализация
Java:
✅Классы могут наследовать только один абстрактный класс, так как Java не поддерживает множественное наследование классов.
Kotlin:
✅Также позволяет классам наследовать только один абстрактный класс. Однако он вводит понятие интерфейсов, которые могут содержать реализацию по умолчанию, и класс может реализовывать несколько интерфейсов. Это предоставляет большую гибкость по сравнению с Java.
3️⃣Модификаторы доступа по умолчанию
Java:
✅Если он не указан, по умолчанию он имеет уровень доступа "package-private", что означает, что члены класса доступны только внутри того же пакета.
Kotlin:
✅Если он не указан, по умолчанию он является
public, что означает, что член класса доступен везде, где виден сам класс.И Java, и Kotlin предоставляют мощные средства для работы с абстрактными классами и методами, но Kotlin предлагает более современный подход с дополнительной гибкостью благодаря поддержке свойств, интерфейсов с реализацией по умолчанию и более открытым модификатором доступа по умолчанию. Эти особенности делают его привлекательным выбором для новых проектов и разработчиков, стремящихся использовать более современные практики и возможности языка.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🤔6👍4❤1
Anonymous Quiz
35%
extend
2%
func
37%
fun
26%
override
Какие архитектурные паттерны, которые используются в android фреймворке есть ?
Спросят с вероятностью 20%
В разработке Android-приложений применяются различные архитектурные паттерны, которые помогают сделать код более читаемым, удобным для тестирования и легким в обслуживании. Ниже перечислены ключевые часто используемые архитектурные паттерны:
1️⃣Model-View-Controller (MVC)
✅Model содержит бизнес-логику и данные приложения.
✅View отвечает за отображение данных (пользовательский интерфейс).
✅Controller действует как посредник между Model и View, управляя потоком данных к Model и обновляя View.
В Android активности и фрагменты обычно играют роль контроллера.
2️⃣Model-View-Presenter (MVP)
✅Model представляет слой данных и бизнес-логику.
✅View отвечает за отображение данных и делегирует обработку пользовательских действий Presenter.
✅Presenter содержит логику представления, работает с Model и обновляет View.
В MVP View (активности и фрагменты) полностью отделены от логики представления, что облегчает тестирование.
3️⃣Model-View-ViewModel (MVVM)
✅Model обеспечивает структуру данных и бизнес-логику.
✅View отображает визуальные элементы и действия пользователя.
✅ViewModel служит абстракцией View и содержит логику представления, отвечая за наблюдение за данными и состоянием UI.
MVVM поддерживается архитектурными компонентами Android Jetpack, такими как LiveData и DataBinding, что обеспечивает простую и эффективную реализацию реактивного UI.
4️⃣Clean Architecture
Clean Architecture предложена Робертом Мартином (Uncle Bob) и адаптирована для Android. Она направлена на разделение кода на слои с четко определенными задачами:
✅Доменный слой содержит бизнес-логику (сущности, использование случаев).
✅Слой данных отвечает за доступ к данным (базы данных, сетевые запросы).
✅Презентационный слой содержит логику UI (активности, фрагменты, ViewModel).
Этот подход помогает достичь высокой степени декомпозиции и независимости компонентов, что упрощает тестирование и поддержку приложения.
5️⃣Component-Based Architecture
Компонентно-ориентированная архитектура фокусируется на разделении приложения на переиспользуемые компоненты, каждый из которых имеет четко определенные задачи и интерфейсы. В контексте Android это может включать создание модульных фрагментов, вью и сервисов, которые могут быть легко заменены или переиспользованы в различных частях приложения или даже в других приложениях.
Выбор архитектурного паттерна зависит от конкретных требований и сложности проекта. Использование этих паттернов облегчает масштабирование приложения, обеспечивает его устойчивость к изменениям и упрощает процесс разработки и тестирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 20%
В разработке Android-приложений применяются различные архитектурные паттерны, которые помогают сделать код более читаемым, удобным для тестирования и легким в обслуживании. Ниже перечислены ключевые часто используемые архитектурные паттерны:
1️⃣Model-View-Controller (MVC)
✅Model содержит бизнес-логику и данные приложения.
✅View отвечает за отображение данных (пользовательский интерфейс).
✅Controller действует как посредник между Model и View, управляя потоком данных к Model и обновляя View.
В Android активности и фрагменты обычно играют роль контроллера.
2️⃣Model-View-Presenter (MVP)
✅Model представляет слой данных и бизнес-логику.
✅View отвечает за отображение данных и делегирует обработку пользовательских действий Presenter.
✅Presenter содержит логику представления, работает с Model и обновляет View.
В MVP View (активности и фрагменты) полностью отделены от логики представления, что облегчает тестирование.
3️⃣Model-View-ViewModel (MVVM)
✅Model обеспечивает структуру данных и бизнес-логику.
✅View отображает визуальные элементы и действия пользователя.
✅ViewModel служит абстракцией View и содержит логику представления, отвечая за наблюдение за данными и состоянием UI.
MVVM поддерживается архитектурными компонентами Android Jetpack, такими как LiveData и DataBinding, что обеспечивает простую и эффективную реализацию реактивного UI.
4️⃣Clean Architecture
Clean Architecture предложена Робертом Мартином (Uncle Bob) и адаптирована для Android. Она направлена на разделение кода на слои с четко определенными задачами:
✅Доменный слой содержит бизнес-логику (сущности, использование случаев).
✅Слой данных отвечает за доступ к данным (базы данных, сетевые запросы).
✅Презентационный слой содержит логику UI (активности, фрагменты, ViewModel).
Этот подход помогает достичь высокой степени декомпозиции и независимости компонентов, что упрощает тестирование и поддержку приложения.
5️⃣Component-Based Architecture
Компонентно-ориентированная архитектура фокусируется на разделении приложения на переиспользуемые компоненты, каждый из которых имеет четко определенные задачи и интерфейсы. В контексте Android это может включать создание модульных фрагментов, вью и сервисов, которые могут быть легко заменены или переиспользованы в различных частях приложения или даже в других приложениях.
Выбор архитектурного паттерна зависит от конкретных требований и сложности проекта. Использование этих паттернов облегчает масштабирование приложения, обеспечивает его устойчивость к изменениям и упрощает процесс разработки и тестирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍9
Anonymous Quiz
16%
Класс для хранения констант
80%
Класс, автоматически генерирующий методы
4%
Абстрактный класс
1%
Интерфейс
👍2
Anonymous Quiz
10%
private
5%
protected
76%
public
9%
internal
Что такое dp ?
Спросят с вероятностью 13%
dp означает "density-independent pixels" или "пиксели, не зависящие от плотности". Это виртуальная единица измерения, которая используется для обеспечения одинакового визуального размера элементов пользовательского интерфейса на экранах с различной плотностью пикселей. Это важно, поскольку устройства Android могут иметь различные размеры и разрешения экранов, и использование dp помогает создать консистентный пользовательский интерфейс на всех этих устройствах.
Как он работает?
1️⃣Базовый расчёт: Базовая логика такова, что 1 dp равен одному пикселю на экране с плотностью 160 точек на дюйм (dpi). Это плотность соответствует "среднему" уровню, который называется "mdpi" в терминах Android. На таком экране:
✅1 dp = 1 px
2️⃣Масштабирование на других устройствах: На устройствах с более высокой или ниже плотностью экрана dp масштабируются соответственно:
✅На устройстве с плотностью 320 dpi (high density, hdpi), 1 dp = 2 px.
✅На устройстве с плотностью 240 dpi (high density, hdpi), 1 dp = 1.5 px.
✅И так далее.
Зачем его использовать?
Цель использования — обеспечить, чтобы элементы интерфейса (как размеры, так и отступы) выглядели одинаково на разных устройствах, несмотря на физические различия в размерах экранов и их разрешениях. Это позволяет создавать приложения, которые хорошо выглядят и функционируют на множестве устройств без необходимости перепроектирования интерфейса под каждое конкретное устройство.
При определении макета в XML-файлах Android вы можете указать размеры в dp, чтобы обеспечить независимость от плотности:
В этом примере отступы вокруг текста в кнопке будут иметь ширину 16 dp. Это означает, что кнопка будет иметь достаточный отступ, который визуально будет выглядеть одинаково на всех устройствах, независимо от их плотности экрана.
Использование dp является ключевым для создания адаптивного дизайна, который корректно отображается на различных устройствах. Это помогает обеспечить хороший пользовательский опыт, где элементы интерфейса сохраняют свои пропорции и читаемость на разных экранах.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
dp означает "density-independent pixels" или "пиксели, не зависящие от плотности". Это виртуальная единица измерения, которая используется для обеспечения одинакового визуального размера элементов пользовательского интерфейса на экранах с различной плотностью пикселей. Это важно, поскольку устройства Android могут иметь различные размеры и разрешения экранов, и использование dp помогает создать консистентный пользовательский интерфейс на всех этих устройствах.
Как он работает?
1️⃣Базовый расчёт: Базовая логика такова, что 1 dp равен одному пикселю на экране с плотностью 160 точек на дюйм (dpi). Это плотность соответствует "среднему" уровню, который называется "mdpi" в терминах Android. На таком экране:
✅1 dp = 1 px
2️⃣Масштабирование на других устройствах: На устройствах с более высокой или ниже плотностью экрана dp масштабируются соответственно:
✅На устройстве с плотностью 320 dpi (high density, hdpi), 1 dp = 2 px.
✅На устройстве с плотностью 240 dpi (high density, hdpi), 1 dp = 1.5 px.
✅И так далее.
Зачем его использовать?
Цель использования — обеспечить, чтобы элементы интерфейса (как размеры, так и отступы) выглядели одинаково на разных устройствах, несмотря на физические различия в размерах экранов и их разрешениях. Это позволяет создавать приложения, которые хорошо выглядят и функционируют на множестве устройств без необходимости перепроектирования интерфейса под каждое конкретное устройство.
При определении макета в XML-файлах Android вы можете указать размеры в dp, чтобы обеспечить независимость от плотности:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me!"
android:padding="16dp" />
В этом примере отступы вокруг текста в кнопке будут иметь ширину 16 dp. Это означает, что кнопка будет иметь достаточный отступ, который визуально будет выглядеть одинаково на всех устройствах, независимо от их плотности экрана.
Использование dp является ключевым для создания адаптивного дизайна, который корректно отображается на различных устройствах. Это помогает обеспечить хороший пользовательский опыт, где элементы интерфейса сохраняют свои пропорции и читаемость на разных экранах.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4
В чем особенность sealed классов ?
Спросят с вероятностью 20%
Особенность запечатанных классов (sealed class) заключается в ограничении иерархии наследования: все их подклассы должны быть объявлены в том же файле, что и сам запечатанный класс. Это делает его идеальным инструментом для создания ограниченных иерархий классов, в которых требуется строго контролировать набор возможных подтипов, особенно при моделировании состояний или результатов операций в виде дерева наследования.
Ключевые особенности и преимущества:
1️⃣Ограниченная иерархия: Обеспечивает строго контролируемую иерархию наследования, где все возможные подклассы известны и закрыты для изменений извне. Это облегчает понимание модели данных и уменьшает вероятность ошибок.
2️⃣Поддержка выразительного механизма сопоставления с образцом: В сочетании с
3️⃣Улучшенная поддержка в IDE: Получают дополнительную поддержку от IDE, например, предупреждения о необработанных случаях в
4️⃣Гибкость в определении подклассов: Подклассы
5️⃣Использование в функциональном программировании: Особенно полезны в функциональном программировании для представления алгебраических типов данных (ADT), где тип может быть одним из ограниченного набора вариантов. Это позволяет строить более предсказуемые и надежные системы типов.
В этом примере
Sealed class обеспечивает механизм для создания ограниченных иерархий классов, позволяя строго контролировать наследование и обеспечивая безопасное и эффективное сопоставление с образцом, что делает их идеальным выбором для моделирования состояний, результатов операций и алгебраических типов данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 20%
Особенность запечатанных классов (sealed class) заключается в ограничении иерархии наследования: все их подклассы должны быть объявлены в том же файле, что и сам запечатанный класс. Это делает его идеальным инструментом для создания ограниченных иерархий классов, в которых требуется строго контролировать набор возможных подтипов, особенно при моделировании состояний или результатов операций в виде дерева наследования.
Ключевые особенности и преимущества:
1️⃣Ограниченная иерархия: Обеспечивает строго контролируемую иерархию наследования, где все возможные подклассы известны и закрыты для изменений извне. Это облегчает понимание модели данных и уменьшает вероятность ошибок.
2️⃣Поддержка выразительного механизма сопоставления с образцом: В сочетании с
when выражением, он позволяет эффективно и безопасно обрабатывать различные типы, гарантируя, что все случаи будут обработаны. Компилятор Kotlin будет проверять, обработаны ли все возможные подклассы в выражении when, что обеспечивает дополнительную безопасность при выполнении кода.3️⃣Улучшенная поддержка в IDE: Получают дополнительную поддержку от IDE, например, предупреждения о необработанных случаях в
when выражениях, что помогает предотвратить ошибки во время компиляции.4️⃣Гибкость в определении подклассов: Подклассы
sealed class могут быть как другими sealed class, так и обычными классами или объектами. Это предоставляет гибкость в организации иерархии типов.5️⃣Использование в функциональном программировании: Особенно полезны в функциональном программировании для представления алгебраических типов данных (ADT), где тип может быть одним из ограниченного набора вариантов. Это позволяет строить более предсказуемые и надежные системы типов.
sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
fun handleResult(result: Result<Int>) = when (result) {
is Result.Success -> println("Success with data ${result.data}")
is Result.Error -> println("Error with exception ${result.exception}")
}В этом примере
Result является sealed class, который имеет два подкласса: Success и Error. Использование sealed class гарантирует, что функция handleResult обрабатывает все возможные варианты Result, что обеспечивает безопасность и предсказуемость выполнения кода.Sealed class обеспечивает механизм для создания ограниченных иерархий классов, позволяя строго контролировать наследование и обеспечивая безопасное и эффективное сопоставление с образцом, что делает их идеальным выбором для моделирования состояний, результатов операций и алгебраических типов данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤3👍3
Anonymous Quiz
3%
open
22%
sealed
73%
final
3%
abstract
❤1
Anonymous Quiz
64%
String?
15%
String
12%
NullableString
9%
SafeString
Что известно про жизненные циклы View ?
Спросят с вероятностью 20%
Каждый виджет (View) и ViewGroup имеет свой жизненный цикл, который тесно связан с жизненным циклом активности или фрагмента, в котором этот виджет используется. Жизненный цикл в большей степени касается этапов создания, макетирования (layout), отрисовки (drawing) и его уничтожения. В отличие от жизненного цикла Activity или Fragment, у View нет встроенных коллбэков, как
Основные этапы жизненного цикла:
1️⃣Инфляция (Inflation): Создаются из XML файлов с помощью процесса, называемого инфляцией. В этот момент происходит чтение XML и создание объектов View в памяти.
2️⃣Прикрепление к окну (Attachment): После создания View прикрепляются к окну. Метод
3️⃣Макетирование (Layout): На этапе макетирования для каждой View определяются размеры и позиция в окне. Метод
4️⃣Рисование (Drawing): Когда макет готов, начинается процесс рисования. Метод
5️⃣Обновление (Update): Если данные, отображаемые в View, изменяются или если требуется изменить внешний вид, View может быть обновлена. Для этого можно использовать методы
6️⃣Отсоединение от окна (Detachment): Когда View удаляется из окна, например, при закрытии активности, вызывается метод
Рассмотрение слушателей событий:
Хотя эти этапы описывают основные аспекты жизненного цикла View, важную роль играют также слушатели событий (event listeners), через которые View может реагировать на взаимодействия пользователя, такие как касания или клики.
Важные моменты:
✅Нужно понимать, как работает макетирование и рисование, чтобы оптимизировать производительность своих приложений, избегая ненужных перерисовок и пересчетов макета.
✅Знание жизненного цикла View помогает в управлении ресурсами, например, правильном подписывании и отписывании от слушателей событий, чтобы избежать утечек памяти.
Жизненный цикл View включает в себя этапы создания, макетирования, отрисовки и уничтожения. Хотя у него нет встроенных методов жизненного цикла, как у Activity, понимание этих этапов критически важно для эффективного управления ресурсами и оптимизации пользовательского интерфейса.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 20%
Каждый виджет (View) и ViewGroup имеет свой жизненный цикл, который тесно связан с жизненным циклом активности или фрагмента, в котором этот виджет используется. Жизненный цикл в большей степени касается этапов создания, макетирования (layout), отрисовки (drawing) и его уничтожения. В отличие от жизненного цикла Activity или Fragment, у View нет встроенных коллбэков, как
onPause() или onResume(), для управления этапами их жизненного цикла. Тем не менее, понимание процессов, происходящих с View, важно для эффективной разработки пользовательского интерфейса.Основные этапы жизненного цикла:
1️⃣Инфляция (Inflation): Создаются из XML файлов с помощью процесса, называемого инфляцией. В этот момент происходит чтение XML и создание объектов View в памяти.
2️⃣Прикрепление к окну (Attachment): После создания View прикрепляются к окну. Метод
onAttachedToWindow() вызывается, когда View добавляется к окну. Здесь View начинает быть частью видимого пользовательского интерфейса.3️⃣Макетирование (Layout): На этапе макетирования для каждой View определяются размеры и позиция в окне. Метод
onLayout() вызывается в ViewGroup для расположения дочерних View. Для индивидуальных View метод onMeasure() определяет размеры View.4️⃣Рисование (Drawing): Когда макет готов, начинается процесс рисования. Метод
onDraw() вызывается для отрисовки содержимого View на экране.5️⃣Обновление (Update): Если данные, отображаемые в View, изменяются или если требуется изменить внешний вид, View может быть обновлена. Для этого можно использовать методы
invalidate() (для перерисовки) или requestLayout() (если изменения затрагивают макет).6️⃣Отсоединение от окна (Detachment): Когда View удаляется из окна, например, при закрытии активности, вызывается метод
onDetachedFromWindow(). Это последний этап в жизненном цикле View, где можно освободить ресурсы.Рассмотрение слушателей событий:
Хотя эти этапы описывают основные аспекты жизненного цикла View, важную роль играют также слушатели событий (event listeners), через которые View может реагировать на взаимодействия пользователя, такие как касания или клики.
Важные моменты:
✅Нужно понимать, как работает макетирование и рисование, чтобы оптимизировать производительность своих приложений, избегая ненужных перерисовок и пересчетов макета.
✅Знание жизненного цикла View помогает в управлении ресурсами, например, правильном подписывании и отписывании от слушателей событий, чтобы избежать утечек памяти.
Жизненный цикл View включает в себя этапы создания, макетирования, отрисовки и уничтожения. Хотя у него нет встроенных методов жизненного цикла, как у Activity, понимание этих этапов критически важно для эффективного управления ресурсами и оптимизации пользовательского интерфейса.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍11
Anonymous Quiz
38%
Передача всех свойств одного класса другому
7%
Автоматическая инициализация свойств
46%
Использование стороннего объекта для управления доступом к свойству
9%
Процесс наследования свойств от базового класса
Anonymous Quiz
33%
init
52%
companion object
7%
object
8%
static
Зачем нужен crossinline ?
Спросят с вероятностью 13%
Ключевое слово crossinline используется в контексте встроенных функций (inline functions) и имеет важное значение для корректного управления лямбда-выражениями, передаваемыми в эти функции как параметры. Встроенные функции позволяют избежать затрат на вызов функций и создание объектов лямбда-выражений при каждом вызове, что может улучшить производительность кода, особенно в критичных сценариях. Однако использование
Зачем он нужен
Необходим для обеспечения безопасности и корректности программы при передаче лямбда-выражений, которые не должны содержать нелокальных возвратов (например, возвратов из внешней функции), в inline функции. Это ключевое слово гарантирует, что лямбда-выражение не будет использовать нелокальный возврат, что позволяет безопасно встраивать лямбды, даже если они используются в контексте, где нелокальные возвраты могут привести к неожиданному поведению или ошибкам.
Рассмотрим следующий код без использования crossinline:
Здесь лямбда-выражение в
Слово crossinline позволяет избежать таких проблем:
В этом примере, использование
Использование
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Ключевое слово crossinline используется в контексте встроенных функций (inline functions) и имеет важное значение для корректного управления лямбда-выражениями, передаваемыми в эти функции как параметры. Встроенные функции позволяют избежать затрат на вызов функций и создание объектов лямбда-выражений при каждом вызове, что может улучшить производительность кода, особенно в критичных сценариях. Однако использование
inline функций влечёт за собой определённые ограничения и возможности, среди которых и возможность "невстроенного" вызова лямбды.Зачем он нужен
Необходим для обеспечения безопасности и корректности программы при передаче лямбда-выражений, которые не должны содержать нелокальных возвратов (например, возвратов из внешней функции), в inline функции. Это ключевое слово гарантирует, что лямбда-выражение не будет использовать нелокальный возврат, что позволяет безопасно встраивать лямбды, даже если они используются в контексте, где нелокальные возвраты могут привести к неожиданному поведению или ошибкам.
Рассмотрим следующий код без использования crossinline:
inline fun runOperation(f: () -> Unit) {
f()
}
fun main() {
runOperation {
println("Operation started")
return // Нелокальный возврат из main
}
println("Operation finished") // Этот код не выполнится
}Здесь лямбда-выражение в
runOperation содержит нелокальный возврат, который фактически прерывает выполнение функции main. Это может быть не то поведение, которое вы ожидаете, особенно если runOperation вызывается из библиотеки или общего кода.Слово crossinline позволяет избежать таких проблем:
inline fun runOperation(crossinline f: () -> Unit) {
val localFunction = object {
fun run() {
f()
}
}
localFunction.run()
}
fun main() {
runOperation {
println("Operation started")
//return // Компилятор выдаст ошибку, если раскомментировать
}
println("Operation finished") // Этот код выполнится
}В этом примере, использование
crossinline запрещает нелокальные возвраты в лямбда-выражении, передаваемом в runOperation. Таким образом, код становится предсказуемым и безопасным для использования в различных контекстах.Использование
crossinline важно для разработчиков, которые стремятся создать безопасный и надёжный код при использовании inline функций с лямбда-выражениями. Оно предотвращает непреднамеренные и потенциально вредоносные нелокальные возвраты, улучшая модульность и повторное использование кода.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍5❤1🔥1
Anonymous Quiz
84%
Использование модификатора `vararg`
6%
Использование списка `List`
3%
Использование массива `Array`
8%
Декларирование функции с параметрами по умолчанию