Руты (GC Roots) — это объекты, которые сборщик мусора считает "живыми" и от которых начинается поиск достижимых объектов. Примеры GC Roots:
Если объект не достижим из GC Roots, он помечается для удаления.
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что такое мульти-декларации (destructuring declarations)?
Мульти-декларации — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.
🟠 При создании data класса Kotlin автоматически создает функции componentN() для каждого свойства класса, где N — номер позиции переменной в конструкторе. Функции componentN() возвращают значения свойств в порядке их объявления в конструкторе. Это позволяет использовать мульти-декларации для распаковки значений свойств и присваивания их отдельным переменным.
🚩 Пример
если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:
Мульти-декларации также могут быть использованы с массивами и другими коллекциями:
👉 Новости 👉 Платформа
Мульти-декларации — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.
если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:
data class Person(val name: String, val age: Int)
val person = Person("Alice", 29)
val (name, age) = person
println(name) // Alice
println(age) // 29
Также можно использовать мульти-декларации в циклах, чтобы итерироваться по спискам объектов и распаковывать значения свойств:
val people = listOf(Person("Alice", 30), Person("Bob", 40))
for ((name, age) in people) {
println("$name is $age years old")
}
// Alice is 30 years old
// Bob is 40 years oldМульти-декларации также могут быть использованы с массивами и другими коллекциями:
val list = listOf("apple", "banana", "orange")
val (first, second, third) = list
println(first) // apple
println(second) // banana
println(third) // orangePlease open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Разница между merge и rebase
👉 Новости 👉 Платформа
Merge и Rebase — это команды в Git для объединения веток, но работают они по-разному. Merge создает новый коммит слияния, сохраняя историю обеих веток, что может привести к разветвленной истории. Rebase переписывает историю, перенося коммиты текущей ветки на вершину другой, делая историю линейной и более чистой, но с потенциальными рисками для уже опубликованного кода.Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
20%
val numbers = List(10) { it + 1 }
50%
val numbers = listOf(1..10)
20%
val numbers = (1..10).toArray()
10%
val numbers = mutableListOf(1 until 11)
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 В чем преимущества выбора Android разработки?
Выбор Android-разработки предоставляет целый ряд преимуществ, как для разработчиков, так и для бизнеса.
🟠 Огромная пользовательская база
Является самой популярной мобильной операционной системой в мире, что обеспечивает доступ к широкой аудитории. Приложения могут достичь значительного числа пользователей по всему миру, увеличивая потенциальные рыночные возможности.
🟠 Гибкость и открытость платформы
Предоставляет больше гибкости в плане настройки приложений и интеграции с операционной системой. Это открытая платформа, что позволяет экспериментировать и внедрять новшества с меньшим количеством ограничений по сравнению с другими операционными системами.
🟠 Удобство разработки
Предоставляют разработчикам мощные инструменты для создания, тестирования и отладки приложений. Kotlin, который стал основным для Android-разработки, предлагает современные возможности и улучшает производительность и читаемость кода по сравнению с Java.
🟠 Поддержка многочисленных устройств
Работает на множестве устройств с различными размерами экрана и характеристиками, что дает возможность охватить более широкий спектр рынка. Однако это также создает вызовы, связанные с адаптацией приложений под разные устройства.
🟠 Интеграция с Google Services
Тесно интегрирован с Google Services, такими как Google Drive, Google Maps и другими. Это предоставляет легкий доступ к мощным инструментам и API, которые могут значительно расширить функциональность приложений.
🟠 Разнообразие распространения и монетизации
Приложения можно распространять не только через Google Play Market. Существуют альтернативные магазины приложений и платформы, что предоставляет больше вариантов монетизации и распространения своих продуктов.
🟠 Сообщество и поддержка
Имеет одно из самых больших сообществ разработчиков, что означает обширную поддержку, большое количество ресурсов, форумов, блогов и документации, которые могут помочь новым и опытным разработчикам.
👉 Новости 👉 Платформа
Выбор Android-разработки предоставляет целый ряд преимуществ, как для разработчиков, так и для бизнеса.
Является самой популярной мобильной операционной системой в мире, что обеспечивает доступ к широкой аудитории. Приложения могут достичь значительного числа пользователей по всему миру, увеличивая потенциальные рыночные возможности.
Предоставляет больше гибкости в плане настройки приложений и интеграции с операционной системой. Это открытая платформа, что позволяет экспериментировать и внедрять новшества с меньшим количеством ограничений по сравнению с другими операционными системами.
Предоставляют разработчикам мощные инструменты для создания, тестирования и отладки приложений. Kotlin, который стал основным для Android-разработки, предлагает современные возможности и улучшает производительность и читаемость кода по сравнению с Java.
Работает на множестве устройств с различными размерами экрана и характеристиками, что дает возможность охватить более широкий спектр рынка. Однако это также создает вызовы, связанные с адаптацией приложений под разные устройства.
Тесно интегрирован с Google Services, такими как Google Drive, Google Maps и другими. Это предоставляет легкий доступ к мощным инструментам и API, которые могут значительно расширить функциональность приложений.
Приложения можно распространять не только через Google Play Market. Существуют альтернативные магазины приложений и платформы, что предоставляет больше вариантов монетизации и распространения своих продуктов.
Имеет одно из самых больших сообществ разработчиков, что означает обширную поддержку, большое количество ресурсов, форумов, блогов и документации, которые могут помочь новым и опытным разработчикам.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨💻 Android developer (Middle+/ Senior)
Локация: Удаленно (команда в Польше и РБ)
Компания: ArtpolDev
ЗП: от 1 500 до 2 500 $
Занятость: Полная
Оформление: ИП, официально, инкубатор
Мы запускаем мобильный проект в сфере Parental Control (конкуренты Kids360, Kidslox). Наша цель — создать продукт, который сделает жизнь родителей проще, а детей — безопаснее. Ищем талантливого Android-разработчика, который станет ключевой частью нашей команды и будет отвечать за полный цикл разработки приложения, включая настройку Firebase для работы с бэкендом.
🚩 Что для нас важно в первую очередь
🔵 Опыт разработки приложений с нуля до релиза: выбор и настройка архитектуры, интеграция модулей, работа с Firebase (аутентификация, уведомления, хранение данных, аналитика), создание экранов и релиз приложения в Google Play.
🚩 Ожидания
🔵 Опыт разработки на Kotlin (Java приветствуется), Jetpack Compose, LiveData/Flow, Room/SQLite.
🔵 Знание архитектурных паттернов (MVVM, MVP, Clean Architecture).
🔵 Уверенная работа с Firebase (аутентификация, уведомления, хранение данных).
🔵 Интеграция сторонних сервисов и API (Adapty, Appsflyer).
🔵 Опыт создания пейволов и проведения A/B тестов для улучшения UX и монетизации.
🔵 Понимание принципов безопасной разработки и защиты данных пользователей.
🔵 Умение работать с ивентами и настраивать аналитику (Amplitude).
🔵 Опыт публикации в Google Play, работа с реджектами.
🔵 Поддержка приложения на различных версиях Android.
🚩 Будет плюсом
- Опыт работы с Accessibility API или инструментами для контроля использования устройства.
- Навыки работы и настройки CI/CD.
❗️Скидывайте ссылки на приложения в Google Play, которые вы делали с нуля, и ваше резюме.
💬 Резюме отправлять: @illarionov_egor
👉 Новости 👉 Платформа
Локация: Удаленно (команда в Польше и РБ)
Компания: ArtpolDev
ЗП: от 1 500 до 2 500 $
Занятость: Полная
Оформление: ИП, официально, инкубатор
Мы запускаем мобильный проект в сфере Parental Control (конкуренты Kids360, Kidslox). Наша цель — создать продукт, который сделает жизнь родителей проще, а детей — безопаснее. Ищем талантливого Android-разработчика, который станет ключевой частью нашей команды и будет отвечать за полный цикл разработки приложения, включая настройку Firebase для работы с бэкендом.
- Опыт работы с Accessibility API или инструментами для контроля использования устройства.
- Навыки работы и настройки CI/CD.
❗️Скидывайте ссылки на приложения в Google Play, которые вы делали с нуля, и ваше резюме.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Anonymous Quiz
45%
(Int) -> String
27%
Function<Int, String>
27%
{ Int -> String }
0%
Callable<Int, String>
#ЧеКак
🤔 Как передать данные с одной Activity на другую?
В Android передача данных между Activity осуществляется через механизм Intent. Intent — это объект, который позволяет передавать данные и запускать компоненты, такие как Activity, Service и BroadcastReceiver.
🚩 Передача данных с одной Activity на другую
🟠 Передача данных через Intent
1⃣ Создание Intent и добавление данных
В первой Activity создайте Intent и добавьте данные, которые хотите передать, используя методы
2⃣ Получение данных во второй Activity
Во второй Activity получите Intent, который запустил эту Activity, и извлеките данные из него.
🟠 Передача объектов (Parcelable)
Если вам нужно передать сложные объекты, вы можете использовать интерфейс
1⃣ Создание класса, реализующего Parcelable
2⃣ Передача объекта через Intent
3⃣ Получение объекта во второй Activity
👉 Новости 👉 Платформа
В Android передача данных между Activity осуществляется через механизм Intent. Intent — это объект, который позволяет передавать данные и запускать компоненты, такие как Activity, Service и BroadcastReceiver.
В первой Activity создайте Intent и добавьте данные, которые хотите передать, используя методы
putExtra.// MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // передаем строку
intent.putExtra("number", 123); // передаем целое число
startActivity(intent);
Во второй Activity получите Intent, который запустил эту Activity, и извлеките данные из него.
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// Получение Intent и извлечение данных
Intent intent = getIntent();
String value = intent.getStringExtra("key");
int number = intent.getIntExtra("number", 0); // 0 - значение по умолчанию
// Использование полученных данных
TextView textView = findViewById(R.id.textView);
textView.setText("String: " + value + ", Number: " + number);
}
Если вам нужно передать сложные объекты, вы можете использовать интерфейс
Parcelable. Этот интерфейс позволяет сериализовать объекты для передачи через Intent.import android.os.Parcel;
import android.os.Parcelable;
public class User implements Parcelable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}
// Getters and setters (если нужны)
}
// MainActivity.java
User user = new User("John", 30);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("user", user);
startActivity(intent);
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
User user = intent.getParcelableExtra("user");
// Использование полученного объекта
if (user != null) {
TextView textView = findViewById(R.id.textView);
textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как происходит составление хешмапы, если совпадает хеш-код?
Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
🟠 Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
🟠 Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
🟠 Метод equals используется для проверки уникальности ключей в случае совпадения хеша.
👉 Новости 👉 Платформа
Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
🤔 Задача: 672. Bulb Switcher II
Есть комната с n лампочками, пронумерованными от 1 до n, которые изначально все включены, и четыре кнопки на стене. Каждая из четырех кнопок имеет разную функциональность:
Кнопка 1: Переключает состояние всех лампочек.
Кнопка 2: Переключает состояние всех лампочек с четными номерами (т.е. 2, 4, ...).
Кнопка 3: Переключает состояние всех лампочек с нечетными номерами (т.е. 1, 3, ...).
Кнопка 4: Переключает состояние всех лампочек с номером j = 3k + 1, где k = 0, 1, 2, ... (т.е. 1, 4, 7, 10, ...).
Необходимо сделать ровно presses нажатий кнопок. Для каждого нажатия можно выбрать любую из четырех кнопок для нажатия.
Даны два целых числа n и presses, вернуть количество различных возможных состояний после выполнения всех presses нажатий кнопок.
Пример:
👨💻 Алгоритм:
1⃣ Рассчитаем возможные множества остатков: то есть какие множества c_i = f_i (mod 2) возможны.
2⃣ Так как c_i ≡ f_i и c_i ≤ f_i, если ∑f_i ≠ ∑c_i, или если ∑f_i < ∑c_i, это невозможно. В противном случае это возможно простым построением: выполните операции, указанные c_i, затем выполните операцию номер 1 с четным числом оставшихся операций.
3⃣ Для каждого возможного множества остатков симулируем и запоминаем, как будут выглядеть первые 6 лампочек, сохраняя это в структуре Set. В конце возвращаем размер этого множества.
😎 Решение:
👉 Новости 👉 Платформа
Есть комната с n лампочками, пронумерованными от 1 до n, которые изначально все включены, и четыре кнопки на стене. Каждая из четырех кнопок имеет разную функциональность:
Кнопка 1: Переключает состояние всех лампочек.
Кнопка 2: Переключает состояние всех лампочек с четными номерами (т.е. 2, 4, ...).
Кнопка 3: Переключает состояние всех лампочек с нечетными номерами (т.е. 1, 3, ...).
Кнопка 4: Переключает состояние всех лампочек с номером j = 3k + 1, где k = 0, 1, 2, ... (т.е. 1, 4, 7, 10, ...).
Необходимо сделать ровно presses нажатий кнопок. Для каждого нажатия можно выбрать любую из четырех кнопок для нажатия.
Даны два целых числа n и presses, вернуть количество различных возможных состояний после выполнения всех presses нажатий кнопок.
Пример:
Input: n = 1, presses = 1
Output: 2
Explanation: Status can be:
- [off] by pressing button 1
- [on] by pressing button 2
class Solution {
fun flipLights(n: Int, m: Int): Int {
val seen = mutableSetOf<Int>()
val n = minOf(n, 6)
val shift = maxOf(0, 6 - n)
for (cand in 0 until 16) {
val bcount = Integer.bitCount(cand)
if (bcount % 2 == m % 2 && bcount <= m) {
var lights = 0
if ((cand shr 0 and 1) > 0) lights = lights xor (0b111111 shr shift)
if ((cand shr 1 and 1) > 0) lights = lights xor (0b010101 shr shift)
if ((cand shr 2 and 1) > 0) lights = lights xor (0b101010 shr shift)
if ((cand shr 3 and 1) > 0) lights = lights xor (0b100100 shr shift)
seen.add(lights)
}
}
return seen.size
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
67%
Использовать vararg
22%
Использовать array
11%
Использовать list
0%
Использовать spread
#ЧеКак
🤔 Что такое мульти-декларации (destructuring declarations)?
Мульти-декларации (destructuring declarations или деструктуризирующее присваивание) — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.
🟠 При создании data класса Kotlin автоматически создает функции componentN() для каждого свойства класса, где N — номер позиции переменной в конструкторе. Функции componentN() возвращают значения свойств в порядке их объявления в конструкторе. Это позволяет использовать мульти-декларации для распаковки значений свойств и присваивания их отдельным переменным.
Например, если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:
Мульти-декларации также могут быть использованы с массивами и другими коллекциями:
👉 Новости 👉 Платформа
Мульти-декларации (destructuring declarations или деструктуризирующее присваивание) — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.
Например, если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:
data class Person(val name: String, val age: Int)
val person = Person("Alice", 29)
val (name, age) = person
println(name) // Alice
println(age) // 29
Также можно использовать мульти-декларации в циклах, чтобы итерироваться по спискам объектов и распаковывать значения свойств:
val people = listOf(Person("Alice", 30), Person("Bob", 40))
for ((name, age) in people) {
println("$name is $age years old")
}
// Alice is 30 years old
// Bob is 40 years oldМульти-декларации также могут быть использованы с массивами и другими коллекциями:
val list = listOf("apple", "banana", "orange")
val (first, second, third) = list
println(first) // apple
println(second) // banana
println(third) // orangePlease open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
69%
Для изменения контекста исполнения кода на указанный объект
15%
Для создания нового объекта
8%
Для выполнения операций синхронизации
8%
Для проверки условия в цикле
#ЧеКак
🤔 Как происходит составление хешмапы, если совпадает хеш-код?
Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
🟠 Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
🟠 Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
🟠 Метод equals используется для проверки уникальности ключей в случае совпадения хеша.
👉 Новости 👉 Платформа
Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
0%
Использовать listOf()
25%
Использовать mutableListOf()
67%
Использовать setOf()
8%
Использовать linkedSetOf()
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
18%
Возвращается значение по умолчанию
64%
Генерируется исключение UninitializedPropertyAccessException
9%
Программа завершается с ошибкой сегментации
9%
Компилятор выдаст предупреждение
#ЛитКод
Задача: 632. Smallest Range Covering Elements from K Lists
У вас есть k списков отсортированных целых чисел в неубывающем порядке. Найдите наименьший диапазон, в который входит хотя бы одно число из каждого из k списков. Мы определяем, что диапазон [a, b] меньше диапазона [c, d], если b - a < d - c или a < c, если b - a == d - c.
Пример:
👨💻 Алгоритм:
1⃣ Инициализация и сбор всех начальных элементов
Создайте массив для хранения текущих индексов каждого списка и используйте минимальную кучу для отслеживания текущих минимальных элементов из каждого списка.
2⃣ Нахождение минимального диапазона
Используйте кучу для извлечения минимального элемента и обновления текущего диапазона. Обновляйте максимальный элемент в текущем диапазоне при добавлении новых элементов.
3⃣ Проверка и обновление диапазона
Продолжайте обновлять кучу и диапазон, пока возможно. Завершите, когда один из списков исчерпан.
😎 Решение:
👉 Новости 👉 Платформа
Задача: 632. Smallest Range Covering Elements from K Lists
У вас есть k списков отсортированных целых чисел в неубывающем порядке. Найдите наименьший диапазон, в который входит хотя бы одно число из каждого из k списков. Мы определяем, что диапазон [a, b] меньше диапазона [c, d], если b - a < d - c или a < c, если b - a == d - c.
Пример:
Input: nums = [[4,10,15,24,26],[0,9,12,20],[5,18,22,30]]
Output: [20,24]
Создайте массив для хранения текущих индексов каждого списка и используйте минимальную кучу для отслеживания текущих минимальных элементов из каждого списка.
Используйте кучу для извлечения минимального элемента и обновления текущего диапазона. Обновляйте максимальный элемент в текущем диапазоне при добавлении новых элементов.
Продолжайте обновлять кучу и диапазон, пока возможно. Завершите, когда один из списков исчерпан.
import java.util.PriorityQueue
data class Element(val value: Int, val row: Int, val col: Int)
class Solution {
fun smallestRange(nums: List<List<Int>>): IntArray {
val minHeap = PriorityQueue<Element> { a, b -> a.value - b.value }
var maxValue = Int.MIN_VALUE
for (i in nums.indices) {
minHeap.add(Element(nums[i][0], i, 0))
maxValue = maxOf(maxValue, nums[i][0])
}
var rangeStart = 0
var rangeEnd = Int.MAX_VALUE
while (minHeap.size == nums.size) {
val minElement = minHeap.poll()
if (maxValue - minElement.value < rangeEnd - rangeStart) {
rangeStart = minElement.value
rangeEnd = maxValue
}
if (minElement.col + 1 < nums[minElement.row].size) {
val value = nums[minElement.row][minElement.col + 1]
minHeap.add(Element(value, minElement.row, minElement.col + 1))
maxValue = maxOf(maxValue, value)
}
}
return intArrayOf(rangeStart, rangeEnd)
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Anonymous Quiz
11%
Использовать and между условиями
39%
Разделить условия запятыми в одном case
28%
Перечислить условия в разных case
22%
Использовать || между условиями
❤2