Kotlin | Вопросы собесов
2.57K subscribers
28 photos
962 links
Download Telegram
🤔 Как мы можем сохранить объект на какое-то время?

Может быть достигнуто с использованием различных подходов в зависимости от ваших требований.

🟠Использование `Handler` и `Runnable`
Вы можете использовать Handler и Runnable для отложенного выполнения задач и сохранения объекта на определенное время в памяти.

🟠Использование `CountDownTimer`
CountDownTimer может быть использован для выполнения задачи через определенное время, что может быть полезно для освобождения объекта.

🟠Использование `ScheduledExecutorService`
ScheduledExecutorService предоставляет методы для планирования задач с задержкой или периодическим выполнением.

🟠Использование `WeakReference`
Использование слабых ссылок (WeakReference) позволяет вам контролировать срок жизни объекта в памяти, но при этом объект может быть собран сборщиком мусора, если на него больше нет сильных ссылок.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как будут вести себя LinkedList и ArrayList, если вставить в них элемент?

В LinkedList вставка в начало или середину имеет сложность O(1), так как требуется только обновление ссылок, но доступ к элементу занимает O(n). В ArrayList вставка занимает O(n) из-за необходимости сдвига элементов, но доступ по индексу — O(1).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
🤔 Как система понимает, что WeakReference можно очистит?

Система определяет, что объект, на который ссылается WeakReference, можно очистить, используя механизм сборщика мусора (Garbage Collector, GC).

🚩Механизм работы WeakReference и GC

🟠Сильные ссылки и слабые ссылки
Сильные ссылки (Strong Reference): Объекты, на которые имеются сильные ссылки, не подлежат сборке мусора.
Слабые ссылки (Weak Reference): Объекты, на которые имеются только слабые ссылки, могут быть собраны сборщиком мусора.

🟠Создание слабой ссылки
Когда создается WeakReference, она содержит слабую ссылку на объект, позволяя GC собирать объект, даже если WeakReference все еще существует.
   MyObject myObject = new MyObject();
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);


🟠Работа сборщика мусора
Определение доступности объекта: GC проверяет объекты в памяти и их ссылки. Если на объект нет сильных ссылок (только слабые), он считается недоступным и подлежит сборке.
Сборка мусора: GC освобождает память, занимаемую объектом, и удаляет записи о слабых ссылках.
Очистка WeakReference: Когда объект собирается, WeakReference автоматически очищается, и метод get() начинает возвращать null.

🟠Пример работы
После создания слабой ссылки и удаления сильной ссылки, объект становится кандидатом на сборку мусора. После вызова System.gc(), если на объект больше нет сильных ссылок, он будет собран, а WeakReference будет очищена.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Для чего нужны inline функции?

Inline-функции в Kotlin позволяют встроить тело функции непосредственно в место её вызова, что уменьшает накладные расходы на вызовы функций и повышает производительность. Это особенно полезно при работе с лямбда-выражениями, так как позволяет избежать создания объектов для лямбд и снижает нагрузку на сборщик мусора. Inline-функции полезны для простых функций, которые часто вызываются в циклах или асинхронных операциях. Они позволяют писать оптимизированный и эффективный код.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 Как автоматически находить, что отрисовка не успевает отрабатывать?

Автоматическое обнаружение проблем с отрисовкой в Android-приложениях может быть выполнено с использованием различных инструментов и техник.

🟠Использование Choreographer
Choreographer - это класс, который позволяет получить информацию о времени отрисовки кадра. Вы можете использовать его для отслеживания задержек в отрисовке.
🟠Использование инструмента Android Profiler
Android Studio предоставляет встроенные инструменты профилирования, которые могут помочь обнаружить проблемы с производительностью, включая задержки в отрисовке.

🚩Шаги

1⃣Открытие Android Profiler
Откройте Android Studio и запустите свое приложение. Перейдите в раздел View -> Tool Windows -> Profiler.
2⃣Запуск профилирования
Выберите ваше устройство и процесс. Нажмите на вкладку CPU для профилирования использования процессора. Нажмите на вкладку Graphics для мониторинга отрисовки и обновления экрана.
3⃣Анализ данных
Просмотрите данные, чтобы определить, какие части вашего кода вызывают задержки в отрисовке. Обратите внимание на длинные фреймы (кадры), которые могут указывать на проблемы.
4⃣Использование adb команды для проверки кадров
Вы можете использовать adb shell dumpsys gfxinfo для получения информации о времени отрисовки кадров.

🚩Шаги

1⃣Запуск команды
adb shell dumpsys gfxinfo <your-package-name> framestats


2⃣Анализ вывода
Команда предоставляет информацию о каждом кадре, включая время его отрисовки. Вы можете анализировать вывод, чтобы найти кадры, которые заняли больше времени, чем ожидается (больше 16.67 мс).

3⃣Использование FrameMetrics API
Начиная с API 24 (Android 7.0), вы можете использовать FrameMetrics API для получения подробной информации о производительности отрисовки.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что такое dp?

dp (Density-independent Pixels) — это единица измерения в Android, используемая для создания адаптивных интерфейсов. Она масштабируется в зависимости от плотности экрана устройства, обеспечивая одинаковый визуальный размер элементов на разных экранах.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
🤔 Как выглядит алгоритм запроса данных из двух таблиц и какая у него сложность?

Запрос данных из двух таблиц обычно выполняется с помощью операции объединения (JOIN) в SQL. Алгоритм и его сложность зависят от типа объединения, структуры данных и используемой базы данных.

🚩Пример запроса

Предположим, у нас есть две таблицы: employees и departments. Мы хотим получить список сотрудников вместе с их отделами.
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;


🚩Алгоритмы выполнения JOIN

1⃣Nested Loop Join (Вложенные циклы)
Для каждой строки из первой таблицы выполняется поиск соответствующих строк во второй таблице.
for each row in employees:
for each row in departments:
if row.employees.department_id == row.departments.id:
yield (row.employees.name, row.departments.name)


2⃣Hash Join (Хеш-объединение)
Создается хеш-таблица для одной из таблиц на основе ключа соединения. Для каждой строки из другой таблицы проверяется наличие соответствующего ключа в хеш-таблице.
hash_table = {}
for each row in departments:
hash_table[row.id] = row.name
for each row in employees:
if row.department_id in hash_table:
yield (row.name, hash_table[row.department_id])


3⃣Sort-Merge Join (Сортировка и слияние)
Обе таблицы сортируются по ключу соединения, затем выполняется слияние отсортированных списков.
sorted_employees = sort(employees, key=lambda x: x.department_id)
sorted_departments = sort(departments, key=lambda x: x.id)
i, j = 0, 0
while i < len(sorted_employees) and j < len(sorted_departments):
if sorted_employees[i].department_id == sorted_departments[j].id:
yield (sorted_employees[i].name, sorted_departments[j].name)
i += 1
j += 1
elif sorted_employees[i].department_id < sorted_departments[j].id:
i += 1
else:
j += 1


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1💊1
🤔 Какое главное отличие между Java и Kotlin касательно абстрактных классов и методов?

В Kotlin абстрактные классы и методы по умолчанию open, что позволяет их переопределять без явного указания модификатора open. В Java абстрактные методы всегда подразумевают переопределение, а обычные методы должны быть явно помечены abstract или final.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🤔 В какой структуре данных можно оптимизировать запросы?

Для оптимизации запросов к базам данных можно использовать различные структуры данных и индексы, которые ускоряют операции поиска и соединения.

🟠B-деревья (B-Trees) и B+-деревья (B+ Trees)
B-деревья и их модификация, B+-деревья, являются сбалансированными деревьями поиска, которые широко используются для построения индексов в базах данных.
Быстрый поиск, вставка и удаление: Операции поиска, вставки и удаления выполняются за O(log n).
Эффективное использование дискового пространства: B-деревья хорошо подходят для хранения на диске, так как минимизируют количество операций ввода-вывода.

🟠Хеш-таблицы
Хеш-таблицы используются для быстрого доступа к данным по ключу. В базах данных часто используются хеш-индексы.
Мгновенный доступ: Операции поиска, вставки и удаления выполняются в среднем за O(1).
Подходят для равенств: Эффективны для запросов с условием равенства (например, WHERE id = 123).Неэффективны для диапазонов: Хеш-индексы не подходят для запросов с диапазонами (например, WHERE age BETWEEN 20 AND 30).

🟠Bitmap индексы
Bitmap индексы используют битовые карты для представления данных и часто используются для столбцов с низкой кардинальностью (небольшое количество уникальных значений).
Эффективное хранение: Особенно эффективны для столбцов с низкой кардинальностью.
Быстрые логические операции: Позволяют быстро выполнять логические
Неэффективны для частых обновлений: Не подходят для таблиц с частыми операциями вставки и обновления.

🟠Реверсные индексы (Inverted Indexes)
Реверсные индексы используются для полнотекстового поиска. Они хранят сопоставления терминов и документов, в которых эти термины встречаются.
Быстрый полнотекстовый поиск: Позволяют эффективно выполнять поиск по текстовым данным.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤯1
🤔 Как будут вести себя LinkedList и ArrayList, если вставить в них элемент?

В LinkedList вставка в начало или середину имеет сложность O(1), так как требуется только обновление ссылок, но доступ к элементу занимает O(n). В ArrayList вставка занимает O(n) из-за необходимости сдвига элементов, но доступ по индексу — O(1).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3🤯1👀1👾1
🤔 Как в реляционной таблице сохранить уникальную для каждого элемента информацию?

Для сохранения уникальной информации для каждого элемента в реляционной таблице используются уникальные ключи и различные типы ограничений. В реляционных базах данных уникальные ключи обеспечивают уникальность данных в столбцах, предотвращая дублирование.

🟠Первичный ключ (Primary Key)
Первичный ключ уникально идентифицирует каждую строку в таблице. Таблица может иметь только один первичный ключ, состоящий из одного или нескольких столбцов.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);


🟠Уникальные ограничения (Unique Constraints)
Уникальные ограничения гарантируют, что значения в одном или нескольких столбцах будут уникальными.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
name VARCHAR(100),
department_id INT
);


🟠Автоматическое инкрементирование (Auto-Increment)
Автоинкрементирование используется для автоматической генерации уникальных значений для столбца. Обычно используется для первичных ключей.
CREATE TABLE employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);


🟠Индексы
Индексы помогают ускорить поиск и обеспечивают уникальность данных в столбцах, когда используется уникальный индекс.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);

CREATE UNIQUE INDEX idx_email ON employees(email);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой минус есть у виртуальных таблиц?

Виртуальные таблицы, такие как те, что используются в SQLite с помощью CREATE VIRTUAL TABLE, предлагают мощные возможности для работы с данными. Однако они также имеют некоторые недостатки.

🟠Ограниченная поддержка стандартных функций SQL
Виртуальные таблицы могут не поддерживать все стандартные функции и возможности SQL, такие как ограничения (constraints), триггеры и определенные типы индексов. Это связано с тем, что их функциональность определяется модулем, который реализует виртуальную таблицу.
CREATE VIRTUAL TABLE my_virtual_table USING fts4(content TEXT);


🟠Производительность
Виртуальные таблицы могут иметь производительность ниже, чем обычные таблицы, особенно если они не оптимизированы должным образом. Производительность может пострадать из-за дополнительных накладных расходов, связанных с обработкой виртуальных таблиц на уровне приложения или расширений.

🟠Сложность реализации и обслуживания
Использование виртуальных таблиц требует дополнительных знаний и опыта в разработке и обслуживании. Например, вам может потребоваться написать и поддерживать специализированные модули или расширения для реализации виртуальных таблиц, что увеличивает сложность кода и потенциальные затраты на поддержку.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем отличие между job и supervisor job?

Job управляет выполнением корутины и завершает её при возникновении ошибки. SupervisorJob позволяет дочерним корутинам продолжать выполнение, даже если одна из них завершилась с ошибкой. Это полезно для создания устойчивых структур, где сбой одной задачи не влияет на другие.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4
🤔 Сколько на текущем месте работы было в команде разработчиков вашего уровня?

На текущем месте работы количество разработчиков моего уровня может варьироваться в зависимости от конкретной организации и структуры команды. Обычно команды разработчиков включают специалистов разных уровней, таких как Junior, Middle и Senior, чтобы обеспечить эффективное распределение задач и наставничество.

Если говорить о типичных сценариях, то в среднем команда разработки может включать от 2 до 5 разработчиков одного уровня, особенно в крупных проектах или компаниях с большим штатом сотрудников. В небольших компаниях или стартапах это число может быть меньше, а иногда и только один разработчик каждого уровня.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁1
🤔 Что является сущностью корутин контекста?

Основными сущностями корутинного контекста являются Job (управляет жизненным циклом), CoroutineDispatcher (определяет, на каком потоке выполняется корутина) и пользовательские элементы. Контекст передаёт данные и управляющие инструкции между корутинами. Это позволяет эффективно координировать выполнение задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 Как бы создал утилиту для библиотеки в Java?

Создание утилиты для библиотеки в Java включает несколько шагов: проектирование, реализацию, тестирование и документирование. Рассмотрим процесс создания утилиты на примере простой библиотеки для работы со строками.

🚩Шаги

1⃣Проектирование
Перед началом реализации необходимо определить функциональность, которую будет предоставлять утилита. Допустим, мы создаем библиотеку для работы со строками, включающую следующие функции:
Проверка, является ли строка палиндромом.
Обратный порядок символов в строке.
Подсчет количества слов в строке.

2⃣Реализация
Создадим проект с простой структурой.

3⃣Тестирование
Создадим тесты для проверки функциональности утилиты.

4⃣Документирование
Документирование кода помогает другим разработчикам понять, как использовать вашу библиотеку.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1
🤔 Чем отличаются единицы измерения, например, dp от sp?

dp зависит только от плотности экрана и используется для размеров интерфейса. sp (Scale-independent Pixels) дополнительно учитывает пользовательские настройки размера шрифта, что делает его предпочтительным для текстовых элементов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
🤔 Можно ли в Kotlin получить Null Pointer?

Да, в Kotlin возможно получить NullPointerException (NPE), несмотря на его сильную систему типов, которая стремится избежать null-значений. Kotlin делает много для предотвращения NullPointerException, но есть определенные случаи, когда NPE все еще может возникнуть.

🚩Основные случаи

🟠Взаимодействие с Java-кодом
При вызове методов из Java, которые могут возвращать null без соответствующей аннотации, Kotlin не может гарантировать отсутствие null.
val list = java.util.ArrayList<String>()
list.add("Hello")
val size = list.size // Java-код, возвращающий потенциальный null


🟠Использование `!!` оператора (not-null assertion)
Оператор !! явно указывает компилятору, что переменная не может быть null, но если она все же null, будет выброшено NullPointerException.
val name: String? = null
val length = name!!.length // NPE если name == null


🟠Поздняя инициализация (lateinit)
Переменные, помеченные как lateinit, должны быть инициализированы перед использованием. Если переменная не была инициализирована и используется, будет выброшено UninitializedPropertyAccessException, что является подтипом RuntimeException.
lateinit var name: String
fun initializeName() {
name = "Kotlin"
}
fun useName() {
println(name.length) // NPE если name не инициализирован
}


🟠Статические инициализаторы
Статические инициализаторы могут быть источником NullPointerException в случае неправильного порядка инициализации.
object Example {
val name: String? = null
val length = name!!.length // NPE при инициализации объекта
}


🟠Необработанные исключения в потоках
Kotlin-коррутины и потоки могут привести к NPE, если происходят необработанные исключения, особенно при работе с ThreadLocal переменными.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔1
🤔 В чем особенность делегатов свойств?

Делегаты в Kotlin позволяют делегировать логику управления свойствами другим объектам, что упрощает их использование. Например, lazy делегирует создание значения до первого обращения, а observable отслеживает изменения значения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2
🤔 Как обеспечить безопасность при работе с Java кодом в Kotlin?

Для обеспечения безопасности при работе с Java-кодом в Kotlin можно применять несколько стратегий и подходов, которые помогут избежать NullPointerException (NPE) и других потенциальных проблем.

🟠Аннотации для нулевой безопасности
Использование аннотаций в Java-коде помогает Kotlin понять, какие значения могут быть null, а какие — нет. Наиболее распространенные аннотации включают @Nullable и @NotNull.
Java-код
import org.jetbrains.annotations.Nullable;
public class JavaExample {
@Nullable
public static String getNullableString() {
return null;
}
}


Kotlin-код
val result: String? = JavaExample.getNullableString()
result?.let {
println(it.length)
}


🟠Использование безопасного вызова (`?.`) и оператора Элвиса (`?:`)
Безопасный вызов и оператор Элвиса помогают обрабатывать потенциально null значения безопасно.
val result: String? = JavaExample.getNullableString()
val length = result?.length ?: 0
println("Length: $length")


🟠Проверка на null
Перед использованием значений, полученных из Java-кода, можно проверять их на null.
val result: String? = JavaExample.getNullableString()
if (result != null) {
println(result.length)
} else {
println("Result is null")
}


🟠Обработка исключений
Обработка исключений помогает избежать непредвиденных ситуаций, когда Java-код может бросить исключение.
try {
val result = JavaExample.getNullableString()
println(result!!.length)
} catch (e: NullPointerException) {
println("Caught a NullPointerException")
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🤔 Какой метод используется для выполнения HTTP-запросов в Kotlin с помощью библиотеки Ktor?
Anonymous Quiz
25%
httpClient.get()
9%
httpRequest.send()
46%
httpClient.request()
20%
httpRequest.execute()