и посмотреть медиа
Kotlin Preguntas de Entrevista
и посмотреть медиа
Preguntas de entrevista para desarrolladores de Kotlin con respuestas.
Preguntas de entrevista para desarrolladores de Kotlin con respuestas.
bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.
Preguntas de entrevista Kotlin: extensiones, coroutenos, colecciones. Con ejemplos de código y explicaciones para Android y backend.
🤔 Какие знаешь особенности системы типов в Kotlin ? 🟠Null Safety (Безопасность null) Переменные по умолчанию не могут быть null, что предотвращает NullPointerException. var a: String = "abc" var b: String? = "abc" b = null // Допустимо 🟠Коллекции (Collections) Разделение на изменяемые и неизменяемые коллекции. val list: List = listOf("a", "b", "c") // Неизменяемый список val mutableList: MutableList = mutableListOf("a", "b", "c") // Изменяемый список 🟠Data Classes (Классы данных) Автоматическое создание методов equals(), hashCode(), и toString(). data class User(val name: String, val age: Int) 🟠Smart Casts (Умные приведения типов) Автоматическое приведение типа после проверки с помощью is. fun demo(x: Any) { if (x is String) { println(x.length) } } 🟠Sealed Classes (Запечатанные классы) Упрощают обработку ограниченных иерархий классов. sealed class Expr data class Const(val number: Double) : Expr() 🟠Выведение типов (Type Inference) Kotlin автоматически определяет тип переменной. val x = 10 // Int Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какая особенность у Data Class относительно других Kotlin Classes? Data Class автоматически генерирует equals, hashCode, toString, copy, и componentN функции. Они удобны для хранения данных и значительно упрощают работу с неизменяемыми структурами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Расскажи о контрактах equals и hashCode Методы equals() и hashCode() используются для сравнения объектов и их корректной работы в коллекциях (Set, Map). 🚩Контракт `equals()` Метод equals() должен: Рефлексивность: a.equals(a) → true (объект равен самому себе). Симметричность: a.equals(b) == b.equals(a). Транзитивность: если a == b и b == c, то a == c. Согласованность: если a == b, то a.equals(b) всегда возвращает одно и то же, пока объект не изменится. Сравнение с null всегда даёт false: a.equals(null) == false. class User(val name: String, val age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true // Проверка на ссылочное равенство if (other !is User) return false // Проверка типа return name == other.name && age == other.age // Сравнение полей } } val user1 = User("Alice", 25) val user2 = User("Alice", 25) println(user1 == user2) // true (потому что переопределён equals) 🚩Контракт `hashCode()` Метод hashCode() должен: Согласованность с equals(): если a == b, то a.hashCode() == b.hashCode(). Но обратное не обязательно: два разных объекта могут иметь одинаковый hashCode(). Хеш-код не должен меняться, если объект не изменился. class User(val name: String, val age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is User) return false return name == other.name && age == other.age } override fun hashCode(): Int { return name.hashCode() * 31 + age // 31 - стандартный коэффициент } } val userSet = HashSet() userSet.add(User("Alice", 25)) println(userSet.contains(User("Alice", 25))) // true 🚩Автоматическая генерация в Kotlin Чтобы не писать equals() и hashCode() вручную, можно использовать data class: data class User(val name: String, val age: Int) data class автоматически создаёт equals(), hashCode(), а также copy() и toString(). val user1 = User("Alice", 25) val user2 = User("Alice", 25) println(user1 == user2) // true (equals) println(user1.hashCode() == user2.hashCode()) // true Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как работает async/await? async запускает асинхронную корутину, возвращающую Deferred, аналог Future. await приостанавливает выполнение до получения результата. Это позволяет параллельно выполнять задачи и синхронно работать с результатом. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 View Model vs OnSavedInstanceState? ViewModel и onSaveInstanceState служат для сохранения данных при изменении конфигурации активности или фрагмента (например, при повороте экрана). Однако они решают эту задачу по-разному и имеют разные области применения. 🟠ViewModel ViewModel используется для хранения и управления данными, связанных с UI, таким образом, чтобы они сохранялись при изменении конфигурации (например, при повороте экрана). 🚩Как это работает? Когда система уничтожает и пересоздаёт Activity или Fragment, ViewModel остаётся в памяти до полного уничтожения владельца (например, выхода из Activity). class MyViewModel : ViewModel() { var counter: Int = 0 // Переменная, которая сохраняется при повороте экрана } Использование в Activity class MainActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Теперь viewModel.counter сохранится при повороте экрана } } 🚩Плюсы ➕Хранит данные в памяти до полного уничтожения Activity или Fragment. ➕Удобно для хранения сложных объектов списки, модели, API-данные ➕Позволяет разделять логику и UI улучшая архитектуру. 🚩Минусы ➖Данные исчезают при уничтожении Activity например, при закрытии приложения ➖Не сохраняет данные при завершении процесса например, при нехватке памяти 🚩onSaveInstanceState() Метод onSaveInstanceState() используется для сохранения данных в Bundle, который система автоматически передаёт при пересоздании Activity или Fragment. 🚩Как это работает? Когда Activity уничтожается (например, при повороте экрана), система вызывает onSaveInstanceState(), в котором можно сохранить небольшие данные (строки, числа и т. д.). После пересоздания Activity эти данные можно восстановить из savedInstanceState. class MainActivity : AppCompatActivity() { private var counter: Int = 0 // Значение, которое мы хотим сохранить override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Восстанавливаем данные, если они есть counter = savedInstanceState?.getInt("counter_key") ?: 0 } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("counter_key", counter) // Сохраняем значение перед уничтожением Activity } } 🚩Плюсы ➕Сохраняет данные даже при завершении процесса (например, при нехватке памяти). ➕Позволяет быстро восстановить состояние UI (например, текст в EditText). 🚩Минусы ➖Подходит только для небольших данных (числа, строки). ➖Не подходит для хранения сложных объектов (списки, большие модели, API-данные). ➖Требует кодирования и декодирования данных в Bundle Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Из каких более важных компонентов состоит Compose? Compose состоит из компонентов: - Composable функции: описывают UI. - State: управляет состоянием компонентов. - Modifiers: применяются для настройки внешнего вида и поведения. - Layouts: определяют структуру расположения элементов на экране. - Recomposition: механизм обновления интерфейса при изменении состояния. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какой класс можно использовать что бы ловить разные жесты? Чтобы обрабатывать жесты в Android, используйте класс GestureDetector. Он помогает отслеживать стандартные жесты: одиночные нажатия, свайпы, долгие нажатия, двойные касания и т.д. 🚩Как использовать GestureDetector? Создайте экземпляр GestureDetector, передав Context и слушателя (GestureDetector.OnGestureListener). Передавайте события касания в gestureDetector.onTouchEvent(event) из метода onTouchEvent(). class GestureActivity : AppCompatActivity(), GestureDetector.OnGestureListener { private lateinit var gestureDetector: GestureDetector override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) gestureDetector = GestureDetector(this, this) } override fun onTouchEvent(event: MotionEvent): Boolean { return gestureDetector.onTouchEvent(event) || super.onTouchEvent(event) } override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { val deltaX = e2!!.x - e1!!.x if (deltaX > 0) Log.d("Gesture", "Swipe Right") else Log.d("Gesture", "Swipe Left") return true } override fun onDown(e: MotionEvent?) = true override fun onShowPress(e: MotionEvent?) {} override fun onSingleTapUp(e: MotionEvent?) = false override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float) = false override fun onLongPress(e: MotionEvent?) {} } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие преимущества Android перед другими ОС? Android предлагает открытую экосистему, гибкость в разработке, большое количество поддерживаемых устройств и мощный инструментарий. Также Android предоставляет свободу кастомизации UI и взаимодействие с низкоуровневыми возможностями системы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что делает библиотека LifeCycle ? Библиотека Lifecycle в Android Jetpack помогает управлять и контролировать жизненный цикл компонентов Android, таких как Activities и Fragments. Она упрощает создание компонентов, которые осведомлены о своем жизненном цикле и могут корректно реагировать на изменения в нем. Это позволяет избегать утечек памяти и некорректной работы компонентов при изменении конфигураций или переходах между состояниями. 🚩Основные компоненты библиотеки Lifecycle 🟠LifecycleOwner Это интерфейс, который определяет класс как владеющий жизненным циклом. Activity и Fragment уже реализуют этот интерфейс. class MyActivity : AppCompatActivity(), LifecycleOwner { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 🟠LifecycleObserver Это интерфейс, который позволяет классу наблюдать за изменениями в жизненном цикле компонента. Методы, аннотированные @OnLifecycleEvent, будут вызываться при соответствующих событиях жизненного цикла. class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onStart() { // Код, который выполняется при старте жизненного цикла Log.d("MyObserver", "onStart called") } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onStop() { // Код, который выполняется при остановке жизненного цикла Log.d("MyObserver", "onStop called") } } 🟠Lifecycle Это класс, который содержит информацию о текущем состоянии и позволяет другим объектам наблюдать за изменениями в жизненном цикле. class MyActivity : AppCompatActivity() { private lateinit var myObserver: MyObserver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myObserver = MyObserver() lifecycle.addObserver(myObserver) } } 🚩Применение библиотеки Lifecycle 1⃣ Добавьте зависимости в ваш build.gradle dependencies { implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" } 2⃣Создайте класс, реализующий LifecycleObserver class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver", "Activity resumed") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver", "Activity paused") } } 3⃣Добавьте LifecycleObserver в LifecycleOwner (например, Activity) class MyActivity : AppCompatActivity() { private lateinit var myObserver: MyObserver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myObserver = MyObserver() lifecycle.addObserver(myObserver) } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!