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 года»
Поиск работы отнимает силы, время и веру в себя, но не у тех кто использует easyoffer PRO. Успей сделать самую выгодную инвестицию в развитие своей карьеры.
Акция закончится уже сегодня 23 июня 23:59 по мск:
👉 https://easyoffer.ru/pro | 92 |
| 11 | 🤔 Разница PriorityQueue, Deque?
- PriorityQueue — структура, где элементы обрабатываются по приоритету, а не по порядку добавления.
- Deque (двусторонняя очередь) — позволяет добавлять/удалять элементы с обеих сторон. Поддерживает поведение как стека, так и очереди.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний | 405 |
| 12 | Последний день акции:
«Пожизненный 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-доступ закроет 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 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
