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

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

前往频道在 Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

显示更多
2 471
订阅者
-124 小时
-117
-2730
吸引订阅者
七月 '26
七月 '26
+7
在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个频道中
日期
订阅者增长
提及
频道
10 七月+2
09 七月0
08 七月0
07 七月+1
06 七月+1
05 七月+1
04 七月0
03 七月+1
02 七月+1
01 七月0
频道帖子
🤔 Зачем нужны Intents? Intents нужны для взаимодействия компонентов приложения: запуска Activity, Service, передачи данных или отправки Broadcast. Они являются основным способом коммуникации между модулями и приложениями в Android. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

2
🤔 Отличие 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}") } } Ставь 👍 и забирай 📚 Базу знаний
221
3
🤔 Как создать notification? Для создания уведомления необходимо определить его содержимое — заголовок, текст, иконку и поведение при нажатии. Также важно создать канал уведомлений, если целевая версия Android — 8.0 и выше, чтобы управлять настройками уведомлений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
274
4
🤔 Как расшифровывается 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> Ставь 👍 и забирай 📚 Базу знаний
293
5
🤔 Как решать задачу оптимизации работы с помощью тулинга? 1. Использовать профайлеры, такие как Android Profiler или Perfetto, для анализа потребления памяти, CPU и времени выполнения. 2. Автоматизировать задачи с помощью инструментов, например, Gradle или CI/CD. 3. Оптимизировать код и архитектуру на основе результатов анализа производительности. 4. Постепенно внедрять улучшения, отслеживая влияние на производительность. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
283
6
🤔 Через какой класс вызываются методы 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} } Ставь 👍 и забирай 📚 Базу знаний
278
7
🤔 Не знаешь, как появились фрагменты и для чего их начали использовать? Фрагменты появились в Android для упрощения управления пользовательским интерфейсом на устройствах с разными размерами экранов. Они позволяют разделить активность на независимые модули, которые можно повторно использовать, заменять и комбинировать Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
262
8
🤔 Какие в базовом классе 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) } Ставь 👍 и забирай 📚 Базу знаний
273
9
🤔 Какие этапы проводятся для отрисовки текста? 1. Измерение: определение размеров текста с учётом шрифта и стиля (используя Paint.measureText или StaticLayout). 2. Размещение: расчёт позиции текста на экране. 3. Рендеринг: отрисовка текста на Canvas через методы drawText или StaticLayout.draw. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
306
10
🤔 От какого объекта наследуются все классы в 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 } } Ставь 👍 и забирай 📚 Базу знаний
344
11
🤔 Инкапсуляция, наследование, полиморфизм, абстракция - Инкапсуляция — сокрытие внутренних деталей реализации и предоставление публичного API. - Наследование — возможность одному классу унаследовать свойства и методы другого. - Полиморфизм — способность объектов с одинаковым интерфейсом вести себя по-разному (например, метод draw() у Circle и Rectangle). - Абстракция — выделение только существенных характеристик объекта и сокрытие несущественных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
363
12
🤔 Можешь привести пример, когда 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 без явного вызова конструктора. Ставь 👍 и забирай 📚 Базу знаний
369
13
🤔 Какие проблемы решают разные виды тестов? Разные виды тестов фокусируются на разных уровнях приложения: - Unit-тесты — проверяют работу отдельных функций и методов. Решают проблему логических ошибок в бизнес-логике. - Integration-тесты — проверяют, как модули работают вместе. Решают проблему взаимодействия компонентов. - UI/Instrumented тесты — проверяют работу приложения в среде устройства. Решают проблему поведения интерфейса и взаимодействия с системой. - End-to-End тесты — тестируют весь пользовательский путь. Обеспечивают целостную проверку функционала. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
326
14
🤔 Как сохранить состояние скролла при пересоздании 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"/> Ставь 👍 и забирай 📚 Базу знаний
378
15
🤔 Как и когда начинает работать garbage collector в Kotlin? В Kotlin (на JVM) работает Java Garbage Collector. Он запускается: - по мере накопления мусора; - в моменты, когда система считает нужным освободить память; - можно косвенно вызвать через System.gc(), но решение принимает JVM. Сборщик находит неиспользуемые объекты и удаляет их. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
382
16
🤔 Расскажи про ключевое слово Object в Kotlin? Ключевое слово object в Kotlin имеет несколько важных применений, и оно является одной из наиболее мощных и уникальных возможностей языка. 🟠Объявление объекта-одиночки (Singleton) Kotlin предоставляет встроенную поддержку для создания singleton-объектов. Это объект, который имеет единственный экземпляр в приложении. object Database { val name = "MainDatabase" fun connect() { println("Подключение к базе данных $name") } } fun main() { Database.connect() // Подключение к базе данных MainDatabase } 🟠Анонимные объекты Ключевое слово object может использоваться для создания анонимных объектов (объектов без имени). Это полезно, если нужно создать временный объект или реализовать интерфейс/абстрактный класс. fun main() { val listener = object : ClickListener { override fun onClick() { println("Кнопка нажата") } } listener.onClick() } interface ClickListener { fun onClick() } 🟠Компаньон-объекты (Companion Object) Ключевое слово object можно использовать внутри класса для объявления компаньон-объекта. Это позволяет создавать статические методы и переменные в классе. class User(val name: String) { companion object { fun createGuest() = User("Guest") } } fun main() { val guest = User.createGuest() println(guest.name) // Guest } 🟠Объект-выражение Ключевое слово object может использоваться для объявления объектов в коде прямо "на месте". val myObject = object { val x = 10 fun printX() { println(x) } } fun main() { myObject.printX() // 10 } 🚩Почему `object` так полезен? 🟠Лаконичность Вместо написания множества шаблонного кода для Singleton, анонимных объектов или статических методов, вы получаете готовую реализацию из коробки. 🟠Потокобезопасность В случае object, компилятор Kotlin автоматически гарантирует, что объект создаётся в потокобезопасном режиме. 🟠Гибкость object можно использовать практически везде: глобально, локально, внутри классов и функций. Ставь 👍 и забирай 📚 Базу знаний
408
17
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для т
АЙТИШНИКИ, ХВАТИТ сливать время на прилизанные новости и бесполезные курсы Проект «ИИнтеллигенция» стал главным каналом для тех, кто использует нейросети на уровне разработки, автоматизации и опенсорса, а не просто балуется в чатах. Здесь собирают только то, что реально экономит человеко-часы и работает в проде. 🎓 Готовые ИИ-сервисы, промпты и ИИ-агенты для автоматизации рутины 📚 Разборы полезных ИИ-инструментов, локальных LLM и опенсорс-репозиториев 🛠 Практические кейсы, гайды по деплою моделей и интеграции ИИ в пайплайны ⚡️ Технические ИТ-новости без маркетинговой воды и душных отчетов Обучение и прокачка в реальном времени: работа с API (Claude, GPT), локалки (Ollama, vLLM), автоматизация кода, опенсорс-утилиты, AI-агенты и др. Ценишь время и работаешь с ИИ, подпишись: @clucai
264
18
🤔 Что делает метод Object.finalize()? Метод finalize() вызывается перед удалением объекта сборщиком мусора (GC). Использовался для освобождения ресурсов, но: - Устарел с Java 9. - Может не вызываться гарантированно. - Заменён на try-with-resources и AutoCloseable. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
407
19
🤔 Как LeakCanary находит ссылку на уничтоженную Activity? Использует комбинацию слабых ссылок (WeakReference), анализ кучи и цепочек удержания, чтобы найти ссылки на уничтоженные Activity или другие объекты, которые должны были быть освобождены сборщиком мусора. Вот более подробное объяснение того, как это работает: 🚩Шаги 1⃣Создание слабой ссылки (WeakReference) Когда Activity (или другой компонент) уничтожается, LeakCanary создает слабую ссылку на этот объект. val weakReference = WeakReference(activity) 2⃣Ожидание сборки мусора (Garbage Collection) LeakCanary инициирует сборку мусора, чтобы попытаться освободить уничтоженный объект. System.gc() System.runFinalization() 3⃣Проверка слабой ссылки LeakCanary проверяет, освобождена ли слабая ссылка. Если объект не был освобожден, это указывает на возможную утечку памяти. if (weakReference.get() != null) { // Объект все еще удерживается в памяти, вероятна утечка } 4⃣Снимок кучи (Heap Dump) Если слабая ссылка не была освобождена, LeakCanary создает снимок кучи (heap dump) для дальнейшего анализа. val heapDumpFile = createHeapDump() 5⃣Анализ кучи с помощью Shark LeakCanary использует библиотеку Shark для анализа снимка кучи. Shark проверяет все объекты в куче и их удерживающие ссылки. val heapAnalyzer = HeapAnalyzer() val analysis = heapAnalyzer.analyze(heapDumpFile) Ставь 👍 и забирай 📚 Базу знаний
481
20
🤔 Что можно делать через Composer? Это внутренний компонент Compose, отвечающий за управление состоянием и рендерингом. Через него Compose отслеживает изменения в UI и обновляет только те элементы, которые изменились. Он также управляет процессом "recomposition". Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
448