Kotlin | Вопросы собесов
2.57K subscribers
28 photos
962 links
Download Telegram
🤔 Что такое лямбды с точки зрения синтаксиса в Java и Kotlin?

В Java лямбды — это упрощённый синтаксис для анонимных классов, реализующих функциональный интерфейс. Синтаксис: (параметры) -> { тело }. В Kotlin лямбды представляют собой выражения, передаваемые как функции, с синтаксисом { параметры -> тело }. Kotlin более лаконичен, позволяя опускать параметры, если их можно вывести из контекста.

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

Это мощный инструмент для обнаружения утечек памяти в Android-приложениях. Он работает, отслеживая жизненный цикл объектов и анализируя пути их удержания, чтобы определить, существуют ли объекты, которые не могут быть освобождены сборщиком мусора (Garbage Collector).

1⃣Интеграция с жизненным циклом компонентов
LeakCanary интегрируется с жизненным циклом Activity и Fragment с помощью своих наблюдателей (ActivityRefWatcher и FragmentRefWatcher). Эти наблюдатели отслеживают, когда Activity или Fragment был уничтожен и должен быть собран сборщиком мусора.

2⃣Создание слабых ссылок (WeakReference)
Когда Activity или Fragment должен быть уничтожен, LeakCanary создает слабую ссылку (WeakReference) на этот объект. Слабые ссылки позволяют сборщику мусора освободить объект, даже если на него есть слабые ссылки.
val weakReference = WeakReference(activity)


3⃣Ожидание сборки мусора (Garbage Collection)
LeakCanary инициирует сборку мусора и ждет, чтобы проверить, была ли освобождена слабая ссылка. Он вызывает метод System.gc() несколько раз, чтобы попытаться заставить сборщик мусора освободить память.
System.gc()


4⃣Проверка слабой ссылки
После вызова сборки мусора LeakCanary проверяет, является ли слабая ссылка null. Если слабая ссылка не равна null, это означает, что объект все еще удерживается в памяти и, вероятно, существует утечка памяти.
if (weakReference.get() != null) {
// Утечка памяти обнаружена
}


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

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

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

🚩Шаги анализа дампа памяти

1⃣Создание дампа памяти
Если объект не был освобожден после попыток вызвать сборку мусора, LeakCanary создает дамп памяти.

2⃣Анализ дампа
LeakCanary использует библиотеку Shark для анализа дампа памяти. Он проверяет все объекты в куче и их ссылки.

3⃣Проверка цепочки удержания
Shark проверяет, какие ссылки удерживают объект в памяти. Если объект должен был быть собран, но удерживается цепочкой ссылок, это указывает на утечку. Цепочка удержания показывает, какие объекты и ссылки не позволяют сборщику мусора освободить память.

🚩Пример цепочки удержания

1⃣Activity удерживается статическим полем
Например, если Activity удерживается статическим полем или через долгоживущий объект (например, Singleton), который не был правильно освобожден.

2⃣Анализ удерживающих ссылок
Shark анализирует пути от корневых объектов (root objects), таких как статические поля или глобальные переменные, к удерживаемому объекту.
RootObject -> Singleton -> Activity


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

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

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

Сильная ссылка - это ссылка, которая напрямую указывает на объект и предотвращает его сборку сборщиком мусора.

🚩Основные подходы

🟠WeakReference
Использование слабых ссылок (WeakReference) позволяет определить, был ли объект освобожден сборщиком мусора.
🟠ObjectWatcher (в LeakCanary)
LeakCanary использует ObjectWatcher для отслеживания объектов. Если объект не освобожден, ObjectWatcher уведомляет об утечке.

import java.lang.ref.WeakReference;

public class MemoryLeakExample {

public static void main(String[] args) {
// Создание объекта
MyObject myObject = new MyObject();

// Создание слабой ссылки на объект
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);

// Удаление сильной ссылки
myObject = null;

// Вызов сборщика мусора
System.gc();

// Проверка, была ли слабая ссылка освобождена
if (weakRef.get() == null) {
System.out.println("Object has been garbage collected");
} else {
System.out.println("Object is still alive");
}
}

static class MyObject {
// Некоторая логика класса
}
}


🚩Понимание, что объект не используется

🟠Нет сильных ссылок
Убедитесь, что на объект нет сильных ссылок. Только слабые, мягкие или фантомные ссылки не предотвращают сборку объекта.
🟠Сборка мусора
Если объект становится недоступным через сильные ссылки, сборщик мусора может его освободить.
🟠Проверка с помощью WeakReference
Слабые ссылки могут быть использованы для проверки того, был ли объект освобожден.

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

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

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

Использует комбинацию слабых ссылок (WeakReference), анализ кучи и цепочек удержания, чтобы найти ссылки на уничтоженные Activity или другие объекты, которые должны были быть освобождены сборщиком мусора. Вот более подробное объяснение того, как это работает:

🚩Шаги

1⃣Создание слабой ссылки (WeakReference)
Когда Activity (или другой компонент) уничтожается, LeakCanary создает слабую ссылку на этот объект.
val weakReference = WeakReference(activity)


2⃣Ожидание сборки мусора (Garbage Collection)
LeakCanary инициирует сборку мусора, чтобы попытаться освободить уничтоженный объект.
System.gc()
System.runFinalization()


3⃣Проверка слабой ссылки
LeakCanary проверяет, освобождена ли слабая ссылка. Если объект не был освобожден, это указывает на возможную утечку памяти.
if (weakReference.get() != null) {
// Объект все еще удерживается в памяти, вероятна утечка
}


4⃣Снимок кучи (Heap Dump)
Если слабая ссылка не была освобождена, LeakCanary создает снимок кучи (heap dump) для дальнейшего анализа.
val heapDumpFile = createHeapDump()


5⃣Анализ кучи с помощью Shark
LeakCanary использует библиотеку Shark для анализа снимка кучи. Shark проверяет все объекты в куче и их удерживающие ссылки.
val heapAnalyzer = HeapAnalyzer()
val analysis = heapAnalyzer.analyze(heapDumpFile)


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

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

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

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

🚩Шаги

1⃣Создание дампа памяти
В Android Studio можно создать дамп памяти, выбрав опцию "Dump Java heap" в профайлере.
2⃣Анализ дампа памяти
Используйте инструменты, такие как MAT (Memory Analyzer Tool) или встроенные инструменты Android Studio, чтобы проанализировать дамп памяти. Найдите объекты, которые не должны быть в памяти. Смотрите на "Unreachable objects" или "Dominators".

🚩Пример

1⃣Создание дампа памяти в Android Studio:
Откройте профайлер Android Studio и подключитесь к запущенному приложению. Нажмите "Heap Dump" для создания дампа памяти.

2⃣Анализ с помощью MAT
Откройте дамп памяти в MAT. Используйте запросы, такие как "Find Leaks" или "Top Consumers", чтобы найти объекты, которые не освобождаются.

3⃣Использование WeakReferencе
Слабые ссылки позволяют отслеживать объекты и определять, были ли они освобождены сборщиком мусора.
import java.lang.ref.WeakReference;

public class WeakReferenceExample {
public static void main(String[] args) {
MyObject myObject = new MyObject();
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);

// Удаление сильной ссылки
myObject = null;

// Вызов сборщика мусора
System.gc();

// Проверка, была ли слабая ссылка освобождена
if (weakRef.get() == null) {
System.out.println("Object has been garbage collected");
} else {
System.out.println("Object is still alive");
}
}

static class MyObject {
// Некоторая логика класса
}
}


4⃣Использование инструментов для отладки памяти
Используйте специализированные инструменты для обнаружения утечек памяти и анализа использования памяти.

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

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

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

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

🟠Использование `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