Kotlin | Вопросы собесов
الذهاب إلى القناة على Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
إظهار المزيد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 |
