Kotlin | Вопросы собесов
2.57K subscribers
28 photos
962 links
Download Telegram
🤔 Как будут вести себя 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()
🤔 Какие знаешь особенности системы типов в Kotlin ?

🟠Null Safety (Безопасность null)
Переменные по умолчанию не могут быть null, что предотвращает NullPointerException.
var a: String = "abc"
var b: String? = "abc"
b = null // Допустимо


🟠Коллекции (Collections)
Разделение на изменяемые и неизменяемые коллекции.
val list: List<String> = listOf("a", "b", "c")  // Неизменяемый список
val mutableList: MutableList<String> = mutableListOf("a", "b", "c") // Изменяемый список


🟠Data Classes (Классы данных)
Автоматическое создание методов equals(), hashCode(), и toString().
data class User(val name: String, val age: Int)   


🟠Smart Casts (Умные приведения типов)
Автоматическое приведение типа после проверки с помощью is.
fun demo(x: Any) {
if (x is String) {
println(x.length)
}
}


🟠Sealed Classes (Запечатанные классы)
Упрощают обработку ограниченных иерархий классов.
sealed class Expr
data class Const(val number: Double) : Expr()


🟠Выведение типов (Type Inference)
Kotlin автоматически определяет тип переменной.
val x = 10  // Int   


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

1. ViewModel: данные сохраняются в памяти до разрушения связанной Activity.
2. Bundle: сохранение состояния через onSaveInstanceState() и восстановление в onCreate() или onViewStateRestored().
3. SharedPreferences: для сохранения небольших данных между запусками приложения.
4. Базы данных или файлы: для долгосрочного хранения больших объёмов данных.


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

🟠Безопасность null (Null Safety)
Java: Все объекты могут быть null, что приводит к NullPointerException.
String s = null;
int length = s.length(); // NullPointerException


Kotlin: По умолчанию переменные не могут быть null. Для допуска null используется ?.
var s: String? = null
val length = s?.length // Вернет null, если s равно null


🟠Коллекции (Collections)
Java: Нет различия между изменяемыми и неизменяемыми коллекциями.
List<String> list = new ArrayList<>();
list.add("a");


Kotlin: Четкое разделение на изменяемые (MutableList) и неизменяемые (List) коллекции.
val immutableList: List<String> = listOf("a", "b", "c")
val mutableList: MutableList<String> = mutableListOf("a", "b", "c")


🟠Классы данных (Data Classes)
Java: Нужно вручную переопределять equals(), hashCode(), и toString().
public class User {
private String name;
private int age;
// Конструктор, геттеры, сеттеры, equals(), hashCode(), toString()
}


Kotlin: Автоматическая генерация этих методов.
data class User(val name: String, val age: Int)


🟠Выведение типов (Type Inference)
Java: Необходимость явного указания типов.
int x = 10;
String s = "Hello";


Kotlin: Автоматическое выведение типов.
val x = 10  // Int
val s = "Hello" // String


🟠Умные приведения типов (Smart Casts)
Java: Необходимость явного приведения после проверки instanceof.
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}


Kotlin: Автоматическое приведение типа после проверки is.
if (obj is String) {
println(obj.length) // obj приводится к String
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 До какого момента ViewModel гарантирует сохранение состояния?

ViewModel сохраняет данные до тех пор, пока связанная Activity или Fragment не будут уничтожены навсегда. Например, данные сохраняются при изменении конфигурации (например, поворот экрана), но удаляются, если приложение закрывается или выгружается из памяти.

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

🟠Data Classes (Классы данных)
Автоматически генерируют методы equals(), hashCode(), toString(), copy().
data class User(val name: String, val age: Int)


🟠Sealed Classes (Запечатанные классы)
Ограничивают иерархию классов, обеспечивая безопасность при работе с альтернативами.
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()


🟠Enum Classes (Перечисления)
Создают ограниченные множества констант.
enum class Direction {
NORTH, SOUTH, EAST, WEST
}


🟠Singleton (Объект-одиночка)
Используют object для создания единственного экземпляра.
object Database {
fun connect() { /*...*/ }
}


🟠Companion Object (Спутниковый объект)
Позволяют определять члены, доступные без экземпляра класса.
class MyClass {
companion object {
fun create(): MyClass = MyClass()
}
}


🟠Inline Classes (Встроенные классы)
Обеспечивают легковесные типы без накладных расходов на уровень объекта.
inline class Password(val value: String)


🟠Function Types (Типы функций)
Поддерживают передачу функций как параметров и их возврат.
fun performOperation(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
return operation(x, y)
}


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

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

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

Для сохранения данных за пределами фрагмента в Android можно использовать несколько методов. Основные способы включают SharedPreferences, базы данных SQLite, Room, файлы и ViewModel с ViewModelFactory.

🟠SharedPreferences
Используется для хранения небольших порций данных в виде пар "ключ-значение". Это удобно для хранения настроек пользователя или состояния приложения.
// Сохранение данных
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("key", "value");
editor.apply();

// Чтение данных
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
String value = sharedPref.getString("key", "default_value");


🟠SQLite
Это встроенная реляционная база данных, которая позволяет хранить структурированные данные. Для работы с ней используются SQL-запросы.
// Создание базы данных
SQLiteDatabase db = getActivity().openOrCreateDatabase("MyDatabase", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS myTable (id INTEGER PRIMARY KEY, name TEXT)");

// Вставка данных
ContentValues values = new ContentValues();
values.put("name", "value");
db.insert("myTable", null, values);

// Чтение данных
Cursor cursor = db.rawQuery("SELECT * FROM myTable", null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();


🟠Room
Это библиотека, которая упрощает работу с SQLite, предоставляя абстракцию в виде аннотаций и DAO (Data Access Objects).
// Entity
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}

// DAO
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user")
List<User> getAll();
}

// Database
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}

// Использование
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
UserDao userDao = db.userDao();
User user = new User();
user.uid = 1;
user.firstName = "John";
user.lastName = "Doe";
userDao.insert(user);
List<User> users = userDao.getAll();


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

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1