Kotlin | Вопросы собесов
Разбираем вопросы с собеседований на Android разработчка. Kotlin / Java Сайт: easyoffer.ru Реклама: @easyoffer_adv
Show more1 467
Subscribers
+424 hours
+747 days
+46530 days
- Subscribers
- Post coverage
- ER - engagement ratio
Data loading in progress...
Subscriber growth rate
Data loading in progress...
🤔 Что такое `data class` в Kotlin?Anonymous voting
- Класс для хранения констант
- Класс, автоматически генерирующий методы
- Абстрактный класс
- Интерфейс
❤ 1
Какие архитектурные паттерны, которые используются в 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 разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍 6
Photo unavailableShow in Telegram
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке
🤔 Какое ключевое слово используется для объявления расширения функции в Kotlin?Anonymous voting
- extend
- func
- fun
- override
Какое главное отличие между Java и Kotlin касательно абстрактных классов, методов ?
Спросят с вероятностью 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
🤔 Что делает функция `apply` в Kotlin?Anonymous voting
- Возвращает новый объект
- Изменяет контекст
- Возвращает контекстный объект
- Создает анонимный класс
Чем отличаются единицы измерения, например 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:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:padding="8dp"
android:text="Пример текста" />
Такое разделение позволяет оптимизировать приложение для различных устройств и настроек доступности, улучшая пользовательский опыт. Поэтому важно всегда использовать sp для текста и dp для всех остальных размеров в приложении Android.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 7
🤔 Какая особенность у ключевого слова `val` в Kotlin?Anonymous voting
- Иммутабельность
- Ленивая инициализация
- Внутренняя синхронизация
- Глобальная видимость
❤ 2👾 1
Что известно про extension ?
Спросят с вероятностью 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 разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 4
Как будут вести себя linked list и array list, если вставить в них элемент ?
Спросят с вероятностью 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 разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 9🔥 1
Choose a Different Plan
Your current plan allows analytics for only 5 channels. To get more, please choose a different plan.