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

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

前往频道在 Telegram

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

显示更多
2 480
订阅者
无数据24 小时
-107
-1530
吸引订阅者
六月 '26
六月 '26
+23
在0个频道中
五月 '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个频道中
日期
订阅者增长
提及
频道
30 六月0
29 六月+1
28 六月0
27 六月0
26 六月+1
25 六月+1
24 六月0
23 六月0
22 六月+3
21 六月+2
20 六月0
19 六月0
18 六月+1
17 六月0
16 六月0
15 六月+2
14 六月+1
13 六月+1
12 六月0
11 六月+1
10 六月0
09 六月0
08 六月+2
07 六月0
06 六月0
05 六月+2
04 六月0
03 六月+3
02 六月+2
01 六月0
频道帖子
🤔 Можно ли получить в runtime доступ к типу дженерика? По умолчанию нельзя, потому что дженерики стираются (Type Erasure) во время компиляции.
fun <T> printType(value: T) {
    println(T::class.simpleName) // ❌ Ошибка! Нельзя использовать `T::class`
}
🚩Как получить тип дженерика? (`reified`) Если используем inline fun, можно сделать дженерик "реальным" (reified).
inline fun <reified T> printType(value: T) {
    println(T::class.simpleName) // ✅ Работает!
}

fun main() {
    printType(123)       // Int
    printType("Hello")   // String
    printType(3.14)      // Double
}
🚩Как получить тип дженерика в классе? (`KType`) Если дженерик используется в классе, то reified не поможет.
class MyGenericClass<T>(private val type: KClass<T>) {
    fun printType() {
        println(type.simpleName) // ✅ Работает
    }
}

fun main() {
    val obj = MyGenericClass(String::class)
    obj.printType() // String
}
🚩Как получить тип списка (`List<T>`) в `runtime`? Для сложных дженериков (List<T>, Map<K, V>) используем typeOf<T>() (только с reified).
import kotlin.reflect.typeOf

inline fun <reified T> printGenericType() {
    val type = typeOf<T>()
    println(type) // ✅ List<Int>, Map<String, Boolean> и т. д.
}

fun main() {
    printGenericType<List<Int>>() // kotlin.collections.List<kotlin.Int>
}
Ставь 👍 и забирай 📚 Базу знаний

2
🤔 Зачем нужно разделять отображение и бизнес-логику? Разделение UI и бизнес-логики делает код понятнее, тестируемее и проще в поддержке. Это ключевой принцип чистой архитектуры (Clean Architecture) и паттернов MVP, MVVM, MVI. 🚩Что такое UI и бизнес-логика? Плохой код (UI + логика в Activity) class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById<Button>(R.id.button) button.setOnClickListener { val result = fetchData() // ❌ Логика в UI button.text = result } } fun fetchData(): String { return "Данные с сервера" // ❌ Тут должна быть ViewModel } } 🚩Как правильно разделять UI и логику? (MVVM) Разделим код на Activity + ViewModel MainActivity (только UI) class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById<Button>(R.id.button) viewModel.text.observe(this) { text -> button.text = text // ✅ UI обновляется из ViewModel } button.setOnClickListener { viewModel.loadData() // ✅ Вызываем бизнес-логику } } } MainViewModel (бизнес-логика) class MainViewModel : ViewModel() { private val _text = MutableLiveData<String>() val text: LiveData<String> = _text fun loadData() { _text.value = "Данные с сервера" // ✅ UI не знает, откуда данные } } Ставь 👍 и забирай 📚 Базу знаний
243
3
🤔 Что такое ключевое слово transient? transient используется в Java, чтобы исключить поле из сериализации. То есть при записи объекта в поток (например, в файл), поля, помеченные как transient, не будут сохранены. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
300
4
🤔 Что известно про паттерны проектирования? Паттерны решают часто встречающиеся архитектурные задачи. В Android популярны: - MVVM, MVP, MVC — разделение логики и UI. - Singleton — для глобального доступа к объекту. - Factory — для создания объектов. - Observer — для подписки на события (LiveData, Flow). - Builder — для пошаговой конфигурации сложных объектов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
330
5
🤔 Что нужно сделать, чтобы описать GET-запрос? Для описания GET-запроса нужно указать: - метод запроса — GET; - URL или эндпоинт; - заголовки (например, авторизация, тип ответа); - параметры запроса (в URL-строке); - ожидаемый ответ — его структура, формат (например, JSON). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
380
6
🤔 Какие способы навигации знаешь? В Android есть несколько способов навигации между экранами. Давай разберём основные. 🟠Activity-based навигация Каждый экран – это отдельная Activity, переход осуществляется с помощью Intent. val intent = Intent(this, SecondActivity::class.java) startActivity(intent) 🟠Fragment-based навигация Один Activity содержит несколько Fragment, навигация через FragmentManager. supportFragmentManager.beginTransaction() .replace(R.id.container, SecondFragment()) .addToBackStack(null) .commit() 🟠Navigation Component (Jetpack) Google рекомендует Navigation Component для удобной работы с Fragment. findNavController().navigate(R.id.action_firstFragment_to_secondFragment) 🟠Bottom Navigation / Tab Navigation Используется BottomNavigationView или TabLayout для переключения между экранами. bottomNavigationView.setOnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.home -> replaceFragment(HomeFragment()) R.id.profile -> replaceFragment(ProfileFragment()) } true } 🟠Drawer Navigation (Navigation Drawer) Боковое меню (DrawerLayout) с пунктами навигации. drawerLayout.openDrawer(GravityCompat.START) 🟠Deep Links и App Links Навигация через ссылки (например, myapp://profile/123). <intent-filter> <action android:name="android.intent.action.VIEW"/> <data android:scheme="myapp" android:host="profile"/> </intent-filter> 🟠Navigation в Jetpack Compose Используется NavHost и NavController. NavHost(navController, startDestination = "home") { composable("home") { HomeScreen(navController) } composable("profile") { ProfileScreen(navController) } } Ставь 👍 и забирай 📚 Базу знаний
378
7
🤔 Что означает принцип Барбары Лисков? Принцип подстановки Лисков (из SOLID): если класс B наследуется от класса A, то объекты класса A могут быть заменены на объекты класса B без нарушения корректности программы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
362
8
🤔 Что такое модификаторы доступа? Модификаторы доступа (Access Modifiers) — это ключевые слова, которые определяют, кто может видеть и использовать класс, переменную или метод. Они помогают инкапсулировать данные и защищать код от неправильного использования. 🚩Модификаторы доступа в Java Пример Java public class Example { private int a = 10; // ❌ Только внутри класса int b = 20; // ✅ Видно внутри пакета (package-private) protected int c = 30; // ✅ Видно в пакете и наследниках public int d = 40; // ✅ Доступно везде } 🚩Модификаторы доступа в Kotlin В Kotlin есть почти такие же модификаторы, но package-private заменён на internal. Пример Kotlin class Example { private val a = 10 // ❌ Только в этом классе internal val b = 20 // ✅ Видно в модуле protected val c = 30 // ✅ Видно в наследниках public val d = 40 // ✅ Видно везде (по умолчанию) } 🚩Где используются модификаторы доступа? Для полей (переменных класса) public class User { private String name; // ❌ Скрыто от других классов public User(String name) { this.name = name; } public String getName() { // ✅ Доступ через метод return name; } } Для методов class Animal { protected void makeSound() { // ✅ Доступен только в наследниках System.out.println("Животное издаёт звук"); } } class Dog extends Animal { public void bark() { makeSound(); // ✅ Разрешено, потому что `protected` System.out.println("Гав-гав!"); } } Для классов public class Car { } // ✅ Доступен везде class Engine { } // ❌ Только в этом пакете В Kotlin можно делать private class, но только внутри другого класса. class Car { private class Engine // ❌ Только в этом классе } Ставь 👍 и забирай 📚 Базу знаний
354
9
🤔 Все наследники какого класса unchecked? Все unchecked исключения — это подклассы RuntimeException. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
370
10
Осталось 3 часа до конца акции: «Пожизненный PRO тариф — по цене 1 года» Поиск работы отнимает силы, время и веру в себя, но
Осталось 3 часа до конца акции: «Пожизненный PRO тариф — по цене 1 года» Поиск работы отнимает силы, время и веру в себя, но не у тех кто использует easyoffer PRO. Успей сделать самую выгодную инвестицию в развитие своей карьеры. Акция закончится уже сегодня 23 июня 23:59 по мск: 👉 https://easyoffer.ru/pro
92
11
🤔 Разница PriorityQueue, Deque? - PriorityQueue — структура, где элементы обрабатываются по приоритету, а не по порядку добавления. - Deque (двусторонняя очередь) — позволяет добавлять/удалять элементы с обеих сторон. Поддерживает поведение как стека, так и очереди. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
405
12
Последний день акции: «Пожизненный PRO тариф — по цене 1 года» 🚀 PRO включает: – Полный доступ ко всем грейдам и профессиям
Последний день акции: «Пожизненный PRO тариф — по цене 1 года» 🚀 PRO включает: – Полный доступ ко всем грейдам и профессиям – База live-coding задач и вопросов из технических собеседований с вероятностью их встречи – Примеры лучших ответов от Senior разработчиков – 1100+ записи реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) – База 400+ тестовых заданий от компаний. – Автоотклики на вакансии в хедхантер – Аналитика ТОП-требований из вакансий для лучшего написания резюме и прохождения ATS систем рекрутеров – Генератор уникального резюме и CV под каждую вакансию – Тренажеры подготовки к собеседованию: «Реальное собеседование» и «Проработка вопросов» по методике интервальных повторений (как Anki) – (скоро) Агрегатор вакансий – (скоро) Сообщество Акция закончится уже сегодня 23 июня 23:59 по мск: 👉 https://easyoffer.ru/pro
233
13
🤔 Как сохранять и применять настройки темы? – Хранить выбранную тему в SharedPreferences, – При старте приложения (или Activity) применять тему до setContentView, – В случае использования DayNight — можно использовать AppCompatDelegate.setDefaultNightMode(). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
459
14
Пожизненный PRO тариф — по цене 1 года. Покупаешь один раз — пользуешься всю жизнь: 👉 https://easyoffer.ru/pro 🚀 PRO-доступ
Пожизненный PRO тариф — по цене 1 года. Покупаешь один раз — пользуешься всю жизнь: 👉 https://easyoffer.ru/pro 🚀 PRO-доступ закроет 99% проблем на пути к офферу: 1. Полный доступ ко всем грейдам и профессиям. Не важно, Junior вы или Senior, Тестировщик, Разработчик, Проджект — вы получите материалы под ваш текущий уровень и цели, без ограничений. 2. База live-coding задач и вопросов с реальных собесов с уникальной системой вероятности их встречи. Вы будете готовиться не вслепую, а точечно по тем темам, которые спрашивают чаще всего. 3. Эталонные ответы от Senior-разработчиков. Никакой воды и догадок — только четкие, структурированные решения, за которые дают «зеленый свет» к офферу 4. 1100+ записей реальных собеседований (включая топы: Сбер, Авито, Яндекс, WB, OZON, МТС). Вы увидите всё изнутри: как спрашивают, как отвечают сильные кандидаты и на каких ошибках проваливаются 80% проходящих. 5. База 400+ тестовых заданий. Если вы еще студент, то практикуйтесь на решении задач, которые помогут попасть на собес 6. Автоотклики на Хедхантере — пока вы спите, ваше резюме летит к рекрутерам автоматически. Это экономия сотен часов ручного кликанья. 7. Аналитика ТОП-требований из вакансий. Мы парсим рынок и показываем, какие скиллы сейчас в цене. Это позволит вам точечно апгрейдить резюме и проходить суровые ATS-фильтры (которые отсеивают до 75% резюме еще до просмотра рекрутером). 8. Генератор уникального резюме и CV под каждую вакансию. Забудьте про «универсальное» резюме — нейросеть адаптирует ваш опыт под конкретную позицию за минуту, повышая шансы на приглашение в разы. 9. Тренажеры подготовки к собеседованию: «Реальное собеседование» — сценарий вопросов из реальных интервью «Проработка вопросов» — флеш карточки с вопросами/ответами по методике интервальных повторений (как Anki) 10. (Скоро) Агрегатор вакансий — все вакансии из HH, Telegram, LinkedIn и других площадок в одной ленте. 11. (Скоро) Закрытое комьюнити — нетворкинг и помощь в сложных вопросах от таких же целеустремленных айтишников. Завтра последний день акции: 👉 https://easyoffer.ru/pro
281
15
🤔 Что такое px, dp, sp? - px (pixels) — абсолютные пиксели экрана. - dp (density-independent pixels) — масштабируемые пиксели, зависят от плотности экрана. - sp (scale-independent pixels) — как dp, но учитывают пользовательские настройки размера шрифта. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
502
16
🤔 Из каких основных элементов состоит Dagger? Dagger – это фреймворк для внедрения зависимостей (DI), который помогает управлять созданием и передачей объектов в приложении. В основе Dagger лежат граф зависимостей, который состоит из следующих ключевых элементов: 🚩`@Module` и `@Provides` – создание зависимостей @Module – это класс, который предоставляет зависимости. @Provides – аннотация, указывающая, что метод создаёт объект для графа Dagger. @Module class NetworkModule { @Provides fun provideRetrofit(): Retrofit { return Retrofit.Builder() .baseUrl("https://api.example.com") .build() } } 🟠`@Inject` – внедрение зависимостей @Inject в конструкторе – позволяет Dagger автоматически создавать объект без @Module. class ApiService @Inject constructor(private val retrofit: Retrofit) { fun fetchData() { /*...*/ } } 🟠`@Component` – связывание модулей и мест внедрения @Component – это интерфейс, который соединяет модули и классы, где нужны зависимости. @Component(modules = [NetworkModule::class]) interface AppComponent { fun inject(activity: MainActivity) // Указываем, куда внедрять зависимости } 🟠`@Singleton` – область жизни объекта Используется для создания одного экземпляра объекта на всё приложение. @Singleton @Component(modules = [NetworkModule::class]) interface AppComponent 🟠`@Binds` – привязка интерфейса к реализации Если у нас есть интерфейс и его реализация, лучше использовать @Binds вместо @Provides. interface Repository { fun getData(): String } class RepositoryImpl @Inject constructor() : Repository { override fun getData() = "Data from repository" } @Module abstract class RepositoryModule { @Binds abstract fun bindRepository(repo: RepositoryImpl): Repository } 🟠`Subcomponent` – вложенные компоненты Если нужно создать зависимости с разными областями жизни (например, Activity, Fragment), используют @Subcomponent. @Subcomponent interface ActivityComponent { fun inject(activity: MainActivity) } Ставь 👍 и забирай 📚 Базу знаний
497
17
🤔 В чём различия между уровнями доступа: public, private, protected? - public — доступен везде, из любого класса и пакета. - private — доступен только внутри текущего класса или файла. - protected — доступен внутри класса и его подклассах. В Kotlin — также в том же файле. Они управляют инкапсуляцией, защищают данные от некорректного использования и определяют границы модулей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
473
18
Привет, ребята! У нас для вас отличные новости — на easyoffer вышло сразу несколько крупных обновлений: 1. Автоотклики на HeadHunter Снова работают в полную силу — можно смело возвращаться к активному поиску. 2. Новый раздел «Резюмейкер» Теперь вы можете быстро создавать уникальные резюме, адаптированные под каждую вакансию, и сразу добавлять сопроводительное письмо. Это заметно повышает шансы получить приглашение на собеседование. 3. База вопросов стала чище Мы навели порядок и удалили около 30% дубликатов. Ориентироваться стало проще. –––––––––––––––––– 🔥 Акция в честь обновления Пожизненный тариф easyoffer PRO — по цене одного года. Успейте до 23 июня: 👉 https://easyoffer.ru/pro –––––––––––––––––– Что дальше? В ближайшие пару недель добавим ещё два раздела: 1. Сообщество с чатами по всем профессиональным направлениям. 2. Агрегатор вакансий, чтобы поиск работы стал ещё удобнее.
277
19
🤔 Зачем нужен класс Nothing? Класс `Nothing` в Kotlin представляет тип, который не имеет значения и используется для обозначения невозможного кода, например, в функциях, которые всегда выбрасывают исключение или никогда не завершаются. Это полезно для обозначения точек кода, которые не должны быть достигнуты. `Nothing` позволяет более точно описывать типы функций и улучшает читаемость и безопасность кода. Он используется как "конечный" тип, который не возвращает значений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
495
20
🤔 Как запросить, чтобы система выделила больше ОЗУ на приложение? Нельзя напрямую "попросить" больше памяти, но: - Указать в manifest: - Это увеличит лимит на heap, но злоупотреблять нельзя — система может завершить процесс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
499