ar
Feedback
Kotlin | Вопросы собесов

Kotlin | Вопросы собесов

الذهاب إلى القناة على Telegram
2 470
المشتركون
لا توجد بيانات24 ساعات
-47 أيام
-2230 أيام
جذب المشتركين
يوليو '26
يوليو '26
+8
في 0 قنوات
يونيو '26
+23
في 0 قنوات
Get PRO
مايو '26
+20
في 0 قنوات
Get PRO
أبريل '26
+30
في 0 قنوات
Get PRO
مارس '26
+32
في 0 قنوات
Get PRO
فبراير '26
+46
في 0 قنوات
Get PRO
يناير '26
+54
في 0 قنوات
Get PRO
ديسمبر '25
+23
في 0 قنوات
Get PRO
نوفمبر '25
+42
في 0 قنوات
Get PRO
أكتوبر '25
+38
في 0 قنوات
Get PRO
سبتمبر '25
+44
في 0 قنوات
Get PRO
أغسطس '25
+47
في 0 قنوات
Get PRO
يوليو '25
+35
في 0 قنوات
Get PRO
يونيو '25
+46
في 0 قنوات
Get PRO
مايو '25
+55
في 0 قنوات
Get PRO
أبريل '25
+57
في 0 قنوات
Get PRO
مارس '25
+110
في 1 قنوات
Get PRO
فبراير '25
+105
في 2 قنوات
Get PRO
يناير '25
+159
في 53 قنوات
Get PRO
ديسمبر '24
+59
في 0 قنوات
Get PRO
نوفمبر '24
+70
في 0 قنوات
Get PRO
أكتوبر '24
+210
في 42 قنوات
Get PRO
سبتمبر '24
+608
في 251 قنوات
Get PRO
أغسطس '24
+147
في 0 قنوات
Get PRO
يوليو '24
+203
في 54 قنوات
Get PRO
يونيو '24
+492
في 244 قنوات
Get PRO
مايو '24
+563
في 189 قنوات
Get PRO
أبريل '24
+461
في 23 قنوات
التاريخ
نمو المشتركين
الإشارات
القنوات
13 يوليو0
12 يوليو+1
11 يوليو0
10 يوليو+2
09 يوليو0
08 يوليو0
07 يوليو+1
06 يوليو+1
05 يوليو+1
04 يوليو0
03 يوليو+1
02 يوليو+1
01 يوليو0
منشورات القناة
🤔 Какие потоки есть в RxJava? 1. Schedulers.io(): для ввода-вывода, работы с сетью или файлами. 2. Schedulers.computation(): для интенсивных вычислений, таких как обработка данных или рендеринг. 3. Schedulers.newThread(): для запуска новых потоков. 4. Schedulers.single(): для выполнения задач в одном потоке. 5. AndroidSchedulers.mainThread(): для работы с главным (UI) потоком на Android. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

2
🤔 Как в interface оперировать со свойствами? В interface можно определять свойства (val или var), но их реализация зависит от того, есть ли у них get и set. 🚩Свойства без реализации (только объявление) В интерфейсе можно объявить val (только для чтения) или var (для чтения и записи), но без инициализации. interface User { val name: String // Объявляем свойство, но не реализуем var age: Int // Может изменяться, но без начального значения } Использование в классе class Person(override val name: String) : User { override var age: Int = 25 // Обязательно реализовать } 🚩Свойства с `get` (реализация в интерфейсе) Можно задать кастомный геттер прямо в интерфейсе. interface User { val name: String val greeting: String get() = "Привет, $name!" // Реализация внутри интерфейса } Использование в классе class Person(override val name: String) : User fun main() { val user = Person("Андрей") println(user.greeting) // Привет, Андрей! } 🚩Свойства с `get` и `set` (нельзя реализовать в интерфейсе) Если в интерфейсе объявить var, то нельзя задать реализацию геттера и сеттера — их должен реализовать класс. interface User { var age: Int // Только объявление, без реализации } Использование в классе class Person : User { override var age: Int = 30 // Реализуем свойство } 🚩Свойства с `get() = field` (не работает в интерфейсе!) В interface нельзя использовать field (бэкинг-поле), потому что у интерфейсов нет состояния. interface User { var age: Int get() = field // Ошибка! Нельзя использовать `field` в интерфейсе set(value) { field = value } } Ставь 👍 и забирай 📚 Базу знаний
200
3
🤔 Как бы передавал фотографию в редактор? Передача фото в редактор зависит от типа редактора: 1. Внешний редактор (например, Google Photos, Snapseed). 2. Встроенный редактор внутри приложения. 🚩Передача фото во внешний редактор (Intent) Если редактор — другое приложение, используем Intent.ACTION_EDIT. Как передать фото в редактор? fun openPhotoEditor(context: Context, uri: Uri) { val intent = Intent(Intent.ACTION_EDIT).apply { setDataAndType(uri, "image/*") addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // Разрешение на чтение } context.startActivity(Intent.createChooser(intent, "Выберите редактор")) } 🚩Передача в `Activity` своего приложения (FileProvider) Если редактор — внутри приложения, можно передавать фото через Intent с Uri. Отправка фото в редактор fun openEditor(context: Context, photoFile: File) { val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", photoFile) val intent = Intent(context, PhotoEditorActivity::class.java).apply { putExtra("PHOTO_URI", uri.toString()) } context.startActivity(intent) } Получение фото в редакторе (PhotoEditorActivity) class PhotoEditorActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val uriString = intent.getStringExtra("PHOTO_URI") val uri = uriString?.let { Uri.parse(it) } uri?.let { imageView.setImageURI(it) // Показываем фото } } } 🚩Если фото приходит в `byte[]` (с сервера) Если фото уже в памяти (byte[]), можно передать его как Parcelable. Отправка val bitmap = ... // Получили Bitmap val byteArray = ByteArrayOutputStream().apply { bitmap.compress(Bitmap.CompressFormat.PNG, 100, this) }.toByteArray() val intent = Intent(context, PhotoEditorActivity::class.java).apply { putExtra("PHOTO_BYTES", byteArray) } context.startActivity(intent) Получение val byteArray = intent.getByteArrayExtra("PHOTO_BYTES") byteArray?.let { val bitmap = BitmapFactory.decodeByteArray(it, 0, it.size) imageView.setImageBitmap(bitmap) } Ставь 👍 и забирай 📚 Базу знаний
256
4
🤔 Что такое desugaring? Desugaring — это процесс, при котором синтаксические "сладости" языка (например, лямбды, методы по умолчанию в интерфейсах) преобразуются в более простой код, понятный старым версиям Java или Android. Это позволяет использовать современные возможности языка даже на устройствах с устаревшей средой выполнения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
273
5
🤔 Что такое px, dp, sp? В Android используются разные единицы измерения для работы с экраном, чтобы адаптировать UI под разные устройства. 🚩`px` (пиксели) – физические точки экрана px (pixel) – это самая маленькая единица изображения на экране. Не зависит от плотности экрана → на разных устройствах элементы могут выглядеть слишком маленькими или большими. <TextView android:layout_width="100px" android:layout_height="50px"/> 🚩`dp` (density-independent pixels) – независимые от плотности пиксели dp (density-independent pixel) – это абстрактная единица измерения, которая адаптируется под плотность экрана (dpi). Рекомендуется для всех размеров UI, чтобы интерфейс выглядел одинаково на разных устройствах. <TextView android:layout_width="100dp" android:layout_height="50dp"/> Пример в Kotlin val sizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 100f, resources.displayMetrics ) 🚩`sp` (scale-independent pixels) – масштабируемые пиксели (для текста) sp (scale-independent pixel) – как dp, но ещё учитывает настройки шрифта пользователя. Используется только для размеров шрифтов. <TextView android:text="Привет, мир!" android:textSize="16sp"/> Пример в Kotlin val textSizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 16f, resources.displayMetrics ) Ставь 👍 и забирай 📚 Базу знаний
288
6
🤔 Зачем нужны Intents? Intents нужны для взаимодействия компонентов приложения: запуска Activity, Service, передачи данных или отправки Broadcast. Они являются основным способом коммуникации между модулями и приложениями в Android. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
299
7
🤔 Отличие sealed и enum классов sealed class – это ограниченная иерархия классов, где можно создавать разные подклассы с разными свойствами. enum class – это фиксированный набор однотипных объектов, которые не имеют разной структуры. 🚩`enum class` – для фиксированного набора значений Когда значения не изменятся (например, дни недели, цвета, статусы). Когда у всех значений одинаковая структура. enum class Status { LOADING, SUCCESS, ERROR } Можно добавлять свойства и методы enum class Color(val hex: String) { RED("#FF0000"), GREEN("#00FF00"), BLUE("#0000FF"); fun printHex() = println(hex) } fun main() { val color = Color.RED println(color.hex) // #FF0000 color.printHex() // #FF0000 } 🚩`sealed class` – для сложных состояний с разной структурой Когда у состояний разные параметры и поведение. Когда нужен when, который проверяет все возможные подклассы. sealed class Status { object Loading : Status() data class Success(val data: String) : Status() data class Error(val message: String) : Status() } Использование с when (без else) fun handleStatus(status: Status) { when (status) { is Status.Loading -> println("Загрузка...") is Status.Success -> println("Данные: ${status.data}") is Status.Error -> println("Ошибка: ${status.message}") } } Ставь 👍 и забирай 📚 Базу знаний
332
8
🤔 Как создать notification? Для создания уведомления необходимо определить его содержимое — заголовок, текст, иконку и поведение при нажатии. Также важно создать канал уведомлений, если целевая версия Android — 8.0 и выше, чтобы управлять настройками уведомлений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
337
9
🤔 Как расшифровывается xml? XML — это eXtensible Markup Language (Расширяемый язык разметки). 🚩Что означает расшифровка? eXtensible → Расширяемый (можно создавать свои теги). Markup → Разметка (использует теги <tag> для структурирования данных). Language → Язык (формат хранения и передачи данных). 🚩Где используется XML? В Android: Разметка UI (activity_main.xml). Конфигурация (AndroidManifest.xml). Ресурсы (strings.xml, colors.xml). В веб-разработке: Конфигурации (.xml файлы в серверных приложениях). Форматы обмена данными (SOAP, RSS, SVG). Пример XML-кода <user> <name>Алиса</name> <age>25</age> </user> Ставь 👍 и забирай 📚 Базу знаний
372
10
🤔 Как решать задачу оптимизации работы с помощью тулинга? 1. Использовать профайлеры, такие как Android Profiler или Perfetto, для анализа потребления памяти, CPU и времени выполнения. 2. Автоматизировать задачи с помощью инструментов, например, Gradle или CI/CD. 3. Оптимизировать код и архитектуру на основе результатов анализа производительности. 4. Постепенно внедрять улучшения, отслеживая влияние на производительность. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
345
11
🤔 Через какой класс вызываются методы get, replace? Методы get и replace в Kotlin относятся к работе с коллекциями, карты (Map) или к строкам. В зависимости от контекста, они вызываются через разные классы. Давайте разберем каждый случай отдельно. 🟠Методы `get` и `replace` для коллекций (`Map`) В контексте работы с картами (Map), методы get и replace относятся к получению значений по ключу и замене существующих значений. Метод get Метод get используется для извлечения значения из карты по указанному ключу. val map = mapOf("key1" to "value1", "key2" to "value2") println(map.get("key1")) // value1 println(map["key2"]) // value2 (альтернатива `get`) Метод replace используется для обновления значения, связанного с определённым ключом, если он существует. Этот метод доступен только для изменяемых карт (MutableMap). val mutableMap = mutableMapOf("key1" to "value1", "key2" to "value2") mutableMap.replace("key1", "newValue1") println(mutableMap) // {key1=newValue1, key2=value2} 🟠Методы `get` и `replace` для строк В контексте строк, методы get и replace работают с символами и подстроками. Метод get используется для доступа к символу строки по индексу. Это альтернатива квадратным скобкам. val text = "Kotlin" println(text.get(0)) // K println(text[1]) // o (альтернатива `get`) Метод replace заменяет символы или подстроки в строке на заданные. val text = "Kotlin is awesome" val newText = text.replace("awesome", "powerful") println(newText) // Kotlin is powerful 🟠Глобальные методы `get` и `replace` через пользовательские классы Если вы пишете свои классы, вы можете переопределить оператор get и метод replace, чтобы использовать их для своих нужд. class CustomList<T>(private val items: List<T>) { operator fun get(index: Int): T { return items[index] } } fun main() { val customList = CustomList(listOf(1, 2, 3)) println(customList[0]) // 1 } Пример с replace class CustomMap<K, V>(private val map: MutableMap<K, V>) { fun replace(key: K, value: V) { if (map.containsKey(key)) { map[key] = value } } } fun main() { val customMap = CustomMap(mutableMapOf("key1" to "value1")) customMap.replace("key1", "newValue1") println(customMap) // {key1=newValue1} } Ставь 👍 и забирай 📚 Базу знаний
341
12
🤔 Не знаешь, как появились фрагменты и для чего их начали использовать? Фрагменты появились в Android для упрощения управления пользовательским интерфейсом на устройствах с разными размерами экранов. Они позволяют разделить активность на независимые модули, которые можно повторно использовать, заменять и комбинировать Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
299
13
🤔 Какие в базовом классе Kotlin есть методы и что они делают? В Kotlin все классы неявно наследуются от Any (аналог Object в Java). Это значит, что любой класс в Kotlin имеет 3 базовых метода: 🚩`equals()` – сравнение объектов По умолчанию сравнивает ссылки (как ===) class Person(val name: String) fun main() { val p1 = Person("Alice") val p2 = Person("Alice") println(p1 == p2) // false (разные объекты) } Как переопределить equals() для сравнения по значениям? class Person(val name: String) { override fun equals(other: Any?): Boolean { return other is Person && this.name == other.name } } fun main() { val p1 = Person("Alice") val p2 = Person("Alice") println(p1 == p2) // true (теперь сравниваются значения) } 🚩`hashCode()` – хеш-код объекта По умолчанию генерируется на основе ссылки val p = Person("Alice") println(p.hashCode()) // Разный для каждого объекта Как переопределить hashCode()? class Person(val name: String) { override fun hashCode(): Int { return name.hashCode() // Генерируем хеш-код на основе имени } } 🚩`toString()` – строковое представление объекта По умолчанию печатает ClassName@hashCode val p = Person("Alice") println(p.toString()) // Person@4e25154f (неудобный вывод) Как сделать красивый вывод? class Person(val name: String) { override fun toString(): String { return "Person(name=$name)" } } val p = Person("Alice") println(p.toString()) // Person(name=Alice) 🚩Data-классы автоматически переопределяют `equals()`, `hashCode()`, `toString()` data class User(val name: String) fun main() { val u1 = User("Alice") val u2 = User("Alice") println(u1 == u2) // ✅ true (по значениям) println(u1.hashCode()) // ✅ Одинаковый для объектов с одинаковыми данными println(u1.toString()) // ✅ User(name=Alice) } Ставь 👍 и забирай 📚 Базу знаний
329
14
🤔 Какие этапы проводятся для отрисовки текста? 1. Измерение: определение размеров текста с учётом шрифта и стиля (используя Paint.measureText или StaticLayout). 2. Размещение: расчёт позиции текста на экране. 3. Рендеринг: отрисовка текста на Canvas через методы drawText или StaticLayout.draw. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
325
15
🤔 От какого объекта наследуются все классы в Java? В Java все классы неявно наследуются от класса Object, если явно не указано другое наследование. class MyClass { // Неявно наследуется от Object } class MyClass2 extends Object { // То же самое, просто указано явно } 🚩Методы, унаследованные от `Object` Класс Object содержит основные методы, доступные во всех классах: class Person { String name; Person(String name) { this.name = name; } @Override public String toString() { return "Person{name='" + name + "'}"; } } public class Main { public static void main(String[] args) { Person p = new Person("Alice"); System.out.println(p.toString()); // Person{name='Alice'} System.out.println(p.hashCode()); // Хеш-код объекта System.out.println(p.getClass()); // class Person } } Ставь 👍 и забирай 📚 Базу знаний
420
16
🤔 Инкапсуляция, наследование, полиморфизм, абстракция - Инкапсуляция — сокрытие внутренних деталей реализации и предоставление публичного API. - Наследование — возможность одному классу унаследовать свойства и методы другого. - Полиморфизм — способность объектов с одинаковым интерфейсом вести себя по-разному (например, метод draw() у Circle и Rectangle). - Абстракция — выделение только существенных характеристик объекта и сокрытие несущественных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
425
17
🤔 Можешь привести пример, когда android фреймворк использует паттерн Factory? Да, Android Framework активно использует паттерн Factory в различных API. Один из самых известных примеров — LayoutInflater. 🚩Пример: `LayoutInflater` (Фабричный метод) В Android для создания (инстанцирования) UI-компонентов из XML используется LayoutInflater, который реализует паттерн Factory Method. Вместо того чтобы вручную создавать объекты View, система предоставляет фабричный метод inflate(), который "производит" экземпляры View. 🚩Как работает? В XML описан интерфейс. LayoutInflater загружает XML и создает соответствующие объекты View. Это абстрагирует создание UI-компонентов от разработчика. val inflater = LayoutInflater.from(context) val view = inflater.inflate(R.layout.custom_layout, parent, false) 🚩Другие примеры использования Factory в Android 🟠`MediaPlayer.create()` Вместо MediaPlayer() напрямую используется MediaPlayer.create(context, R.raw.sound), который автоматически создаёт и настраивает объект. 🟠`PreferenceManager.getDefaultSharedPreferences()` Позволяет получить SharedPreferences без необходимости вручную создавать экземпляр. 🟠`Fragment.instantiate()` Фабричный метод для создания Fragment без явного вызова конструктора. Ставь 👍 и забирай 📚 Базу знаний
444
18
🤔 Какие проблемы решают разные виды тестов? Разные виды тестов фокусируются на разных уровнях приложения: - Unit-тесты — проверяют работу отдельных функций и методов. Решают проблему логических ошибок в бизнес-логике. - Integration-тесты — проверяют, как модули работают вместе. Решают проблему взаимодействия компонентов. - UI/Instrumented тесты — проверяют работу приложения в среде устройства. Решают проблему поведения интерфейса и взаимодействия с системой. - End-to-End тесты — тестируют весь пользовательский путь. Обеспечивают целостную проверку функционала. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
399
19
🤔 Как сохранить состояние скролла при пересоздании Activity? При пересоздании Activity (например, при повороте экрана) состояние ScrollView или RecyclerView сбрасывается. Чтобы этого избежать, можно сохранить и восстановить позицию скролла. 🟠Использование `onSaveInstanceState()` Android позволяет сохранять данные в Bundle перед уничтожением Activity, а затем восстанавливать их. class MainActivity : AppCompatActivity() { private lateinit var scrollView: ScrollView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) scrollView = findViewById(R.id.scrollView) // Восстанавливаем позицию скролла savedInstanceState?.let { val scrollY = it.getInt("scroll_position", 0) scrollView.post { scrollView.scrollTo(0, scrollY) } } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("scroll_position", scrollView.scrollY) } } 🟠Для `RecyclerView` У RecyclerView уже есть встроенный механизм сохранения состояния через LinearLayoutManager. class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var layoutManager: LinearLayoutManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) layoutManager = LinearLayoutManager(this) recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = layoutManager recyclerView.adapter = MyAdapter() // Восстанавливаем позицию скролла savedInstanceState?.let { val scrollPosition = it.getInt("recycler_position", 0) recyclerView.post { layoutManager.scrollToPosition(scrollPosition) } } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("recycler_position", layoutManager.findFirstVisibleItemPosition()) } } 🟠Использование `android:freezesText` для `EditText` Если EditText находится внутри ScrollView, можно включить android:freezesText="true", чтобы автоматически сохранять данные. <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:freezesText="true"/> Ставь 👍 и забирай 📚 Базу знаний
411
20
🤔 Как и когда начинает работать garbage collector в Kotlin? В Kotlin (на JVM) работает Java Garbage Collector. Он запускается: - по мере накопления мусора; - в моменты, когда система считает нужным освободить память; - можно косвенно вызвать через System.gc(), но решение принимает JVM. Сборщик находит неиспользуемые объекты и удаляет их. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
399