Logo
TGCATALOG
Каталог Подборки Блог
Kotlin | Вопросы собесов

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

Вопросы для Kotlin-разработчиков с ответами.

Нет оценок
695
29.10.2026
695
29.10.2026
Нет оценок
695
29.10.2026
Безопасный переход через бот
О канале

Вопросы для Kotlin-разработчиков с ответами.

Подписчиков 2,449
Тематика Технологии
Язык Русский
Ссылка t.me/easy_kotlin

Также рекомендуем

Kekaton AI | Озвучка и клон голоса
Kekaton AI | Озвучка и клон голоса
Бот

AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.

Описание

Вопросы на Kotlin-собеседованиях: расширения, корутины, коллекции. С примерами кода и объяснениями для Android и backend.

Последние посты

Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Какие есть операторы Flow? Операторы в Flow бывают: - Создания: flow {}, flowOf(), asFlow(). - Трансформации: map(), flatMapConcat(), filter(), transform(). - Буферизации: buffer(), conflate(), collectLatest(). - Объединения: zip(), combine(). - Терминальные: collect(), toList(), first(). Эти операторы помогают эффективно обрабатывать, изменять и управлять потоками данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Как бороться с тем что из-за deeplink активити может открыться много раз? Когда используется deeplink, может возникнуть проблема, что одно и то же Activity может быть открыто несколько раз в стеке задач. Это происходит, если приложение запускается из внешнего источника (например, из браузера или другого приложения), и Android создает новую задачу или новую копию Activity вместо использования уже существующей. Чтобы справиться с этим, нужно правильно настроить launchMode, интенты и флаги. 🚩Причина проблемы При запуске приложения через deep link, система Android может: 1. Создать новый экземпляр вашего Activity (даже если оно уже существует в стеке задач). 2. Поместить новую задачу в стек задач. Если это не контролировать, пользователь может увидеть много дубликатов одного и того же Activity, что плохо для UX и может вызвать утечку памяти. 🚩Решения 🟠Использование launchMode в манифесте В файле AndroidManifest.xml можно настроить поведение Activity с помощью атрибута launchMode: singleTop: Если Activity уже находится на вершине стека, система не будет создавать новый экземпляр. singleTask: Убедитесь, что только один экземпляр Activity существует в задаче. Если Activity уже существует, система передаст интент в метод onNewIntent(). singleInstance: Подходит для случаев, когда Activity должно быть абсолютно уникальным (используется редко). 🟠Использование флагов в интенте Если вы используете deep link или запускаете Activity вручную, можно добавить флаги, чтобы управлять созданием экземпляров: val intent = Intent(this, MyActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP startActivity(intent) 🟠Обработка метода onNewIntent() Если используется singleTop или singleTask, система вызывает метод onNewIntent(Intent intent) вместо создания нового экземпляра Activity. Этот метод можно переопределить для обработки новых данных из интента override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // Обработка нового интента val data = intent?.data // Используйте данные deeplink } 🟠Использование taskAffinity Если требуется, чтобы разные deep link открывали одну и ту же задачу, можно настроить taskAffinity. Это нужно реже, но полезно, если нужно обрабатывать ссылки с разными контекстами. 🟠Проверка состояния Activity Дополнительно можно вручную проверять, существует ли нужное Activity в текущем состоянии приложения, например, используя LiveData или ViewModel. Файл AndroidManifest.xml Файл MyActivity.kt class MyActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // Обработка данных из нового интента (deeplink) val uri = intent?.data uri?.let { // Например, получить параметры из ссылки val param = it.getQueryParameter("id") Log.d("Deeplink", "Parameter id: $param") } } } Ставь 👍 и забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 В каких случаях используют atomic, в каких synchronized? В Kotlin для работы с многопоточностью можно использовать atomic переменные или synchronized блоки. Они помогают избежать гонок данных (race conditions), когда несколько потоков одновременно изменяют одну и ту же переменную. 🚩Когда использовать `atomic` переменные? Atomic переменные (AtomicInteger, AtomicLong, AtomicReference и др.) используются, когда нужно быстро и безопасно обновлять одно значение без блокировки потока. Высокая производительность – атомарные операции работают быстрее, чем synchronized. Потокобезопасность – операции выполняются без блокировок (lock-free). Удобство – простые методы incrementAndGet(), compareAndSet() и т. д. Работает только с одним значением – не подходит для сложных операций. Не подходит для зависимых изменений (например, если изменение одной переменной зависит от другой). import java.util.concurrent.atomic.AtomicInteger val counter = AtomicInteger(0) fun increment() { counter.incrementAndGet() // Увеличиваем значение безопасно } 🟠Когда использовать `synchronized`? Используется, когда нужно защитить сразу несколько связанных операций от одновременного выполнения в нескольких потоках. Подходит для сложных операций с несколькими переменными. Работает с любыми типами данных. Снижает производительность – потоки ждут, пока один поток закончит работу. Может вызывать deadlock (взаимную блокировку). val lock = Any() var count = 0 fun increment() { synchronized(lock) { count++ // Только один поток может изменять `count` одновременно } } Ставь 👍 и забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Зачем нужны Data Class и Sealed Classes? Data Class и Sealed Class решают разные задачи и обеспечивают улучшения в организации кода, управлении состоянием и безопасности типов. Они вносят значительные упрощения и повышают читаемость кода в Kotlin-проектах. 🚩Зачем они нужны Data Class предназначены для хранения данных и автоматически предоставляют ряд полезных методов, что упрощает разработку и уменьшает объем шаблонного кода. Основные причины использования Data Class: 🟠Сокращение кода Автоматически генерирует методы equals(), hashCode(), и toString(), а также copy() и компонентные функции для объектов данных. Это избавляет от необходимости ручной реализации этих методов, что уменьшает количество кода и возможность ошибок. 🟠Упрощение передачи данных Идеально подходят для передачи данных между различными частями приложения, например, между слоями в архитектуре MVVM или при передаче данных между активностями и фрагментами. 🟠Поддержка неизменяемости С помощью них легко создавать неизменяемые объекты, что способствует безопасной работе с данными, особенно в многопоточной среде. 🚩Зачем они нужны Sealed Class используются для определения закрытых иерархий классов, где все потомки известны и ограничены. Они полезны по следующим причинам: 🟠Полное покрытие случаев в `when` Гарантируют, что все возможные подтипы обработаны в выражениях when, что предотвращает ошибки во время выполнения из-за пропущенных случаев. Это упрощает управление состояниями и делает код более безопасным и предсказуемым. 🟠Ограниченное наследование Ограничивают возможность создания подклассов за пределами файла, в котором они объявлены. Это предотвращает неожиданное наследование и сохраняет иерархию классов контролируемой и понятной. 🟠Инкапсуляция Поскольку все расширения таких классов должны быть объявлены в том же файле, это способствует лучшей инкапсуляции и организации кода. data class User(val name: String, val age: Int) Пример Sealed Class sealed class Result { data class Success(val data: String) : Result() data class Failure(val error: Throwable) : Result() } fun handleResult(result: Result) { when (result) { is Result.Success -> println("Success with data: ${result.data}") is Result.Failure -> println("Failure with error: ${result.error.message}") } } Ставь 👍 и забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Как написать наследование между двумя классами в Kotlin? Через open и :. Родительский класс должен быть open, а дочерний объявляется с class B : A(). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Как сказать адаптеру перерисовать список, если какой-то элемент удалился? Если удалился элемент из списка, нужно: Удалить его из списка данных. Сообщить Adapter, чтобы он перерисовал только изменённые элементы. 🚩Используем `notifyItemRemoved()` (лучший вариант) Этот метод обновляет только удалённый элемент, сохраняя анимации. fun removeItem(position: Int) { itemList.removeAt(position) // Удаляем из списка данных notifyItemRemoved(position) // Сообщаем адаптеру notifyItemRangeChanged(position, itemList.size) // Обновляем индексы } 🚩Если изменился весь список – `DiffUtil` Если изменился несколько элементов, лучше использовать DiffUtil, чтобы обновить только нужные элементы. class MyAdapter : ListAdapter(DIFF_CALLBACK) { companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean { return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: Item, newItem: Item): Boolean { return oldItem == newItem } } } } Обновляем список через submitList() fun removeItem(item: Item) { val newList = currentList.toMutableList() newList.remove(item) submitList(newList) // `DiffUtil` сам вычислит, что обновить } 🚩Полное обновление списка (`notifyDataSetChanged()`) Использовать только если изменился весь список! fun removeItem(position: Int) { itemList.removeAt(position) notifyDataSetChanged() // Перерисовывает весь список (медленно) } Ставь 👍 и забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Какие особенности у DDP-протокола? DDP (Distributed Data Protocol) — используется в Meteor для реактивной передачи данных между клиентом и сервером. Поддерживает WebSocket и JSON-формат, обеспечивает автоматическую синхронизацию. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Почему могут пропадать пользовательские данные при повороте экрана? Пропадание пользовательских данных при повороте экрана в Android-приложениях является распространенной проблемой, связанной с тем, как Android управляет жизненным циклом активности. Когда устройство поворачивается, система уничтожает текущую активность и создает её заново, что приводит к потере данных, если они не были сохранены должным образом. 🚩Причины пропадания данных при повороте экрана 🟠Пересоздание активности 🟠Неправильное управление состоянием 🚩Способы предотвращения потери данных Сохранение состояния с помощью onSaveInstanceState и onRestoreInstanceState class MainActivity : AppCompatActivity() { private var userData: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState != null) { userData = savedInstanceState.getString("USER_DATA_KEY") // Восстановите данные в пользовательском интерфейсе } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("USER_DATA_KEY", userData) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) userData = savedInstanceState.getString("USER_DATA_KEY") // Восстановите данные в пользовательском интерфейсе } } Использование Retain Fragment. Этот метод сохраняет данные, используя фрагмент, который сохраняет своё состояние при пересоздании активности. class RetainFragment : Fragment() { var userData: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) retainInstance = true } } class MainActivity : AppCompatActivity() { private lateinit var retainFragment: RetainFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val fragmentManager = supportFragmentManager retainFragment = fragmentManager.findFragmentByTag("RETAIN_FRAGMENT") as RetainFragment? ?: RetainFragment().also { fragmentManager.beginTransaction().add(it, "RETAIN_FRAGMENT").commit() } // Используйте данные из RetainFragment val userData = retainFragment.userData } } Использование SavedStateHandle в ViewModel class UserViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { var userData: String? get() = savedStateHandle.get("USER_DATA_KEY") set(value) = savedStateHandle.set("USER_DATA_KEY", value) } class MainActivity : AppCompatActivity() { private lateinit var viewModel: UserViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(UserViewModel::class.java) // Используйте данные из ViewModel val userData = viewModel.userData } } Ставь 👍 и забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Kotlin | Вопросы собесов
🔒Открыть пост
и посмотреть медиа
🤔 Можно ли прервать выполнение `forEach`? Нет, forEach не поддерживает инструкции break или continue. Для прерывания используйте цикл for. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Kotlin | Вопросы собесов
Динамика подписчиков
+0.0% за 30 дней
Текущие
2,449
Месяц назад
2,450
Средний рост
+0 / день
Обновлено
3 дня назад

Отзывы о канале Kotlin | Вопросы собесов

Авторизуйтесь, чтобы оставить отзыв

Только зарегистрированные пользователи могут делиться своим мнением.

Пока нет отзывов

Станьте первым, кто поделится своим впечатлением об этом ресурсе!

Похожие ресурсы

Loading
Переход на светлую тему
Главная Каталог Подборки Блог Вход