Как вы проводите пользовательское исследование?
Исследование начинается с вопроса к продукту, а не с набора вопросов к пользователю.
Все вопросы из всех профессий в одном списке: краткая суть, развёрнутые ответы, примеры и практические задания.
Исследование начинается с вопроса к продукту, а не с набора вопросов к пользователю.
Сборщик мусора находит недостижимые объекты и освобождает занимаемую ими память, работая по поколениям.
Короткий ответ Самый простой и идиоматичный способ развернуть строку — срез с отрицательным шагом: s[::-1]. Альтернативы — ''.join(reversed(s)) или цикл, добавляющий каждый символ в начало. Число разворачивают через строку — int(str(n)[::-1]) — либо арифметически, без преобразования в строку. Как это работает подробнее У разворота строки несколько способов, и они различаются краткостью и тем, как именно читаются символы. Срез s[::-1]. Синтаксис означает «вся строка с шагом -1», то есть чтение справа налево; это самый короткий вариант. reversed и join. reversed(s) возвращает итератор по символам в обратном порядке, а join собирает их в новую строку. Цикл. Каждый следующий символ добавляется в начало строки: rev = ch + rev. Другие варианты. Можно идти индексами от конца к началу через range() или использовать стек, где pop() снимает последний элемент первым. Разворот числа. Арифметический способ: % 10 берёт последнюю цифру, rev * 10 + d накапливает результат, а //= 10 отбрасывает обработанную цифру. Пример кода
Event Loop обходит фазы таймеров, ожидающих колбэков, poll, check и close-колбэков.
Метрики выстраиваются по воронке: показы и клики отвечают за трафик, CPA и ROAS — за деньги.
При возникновении коллизий (когда два ключа возвращают одинаковый бакет-индекс), HashMap использует метод цепочек. Начиная с Java 8, если длина связного списка в бакете превышает 8 элементов, он преобразуется в сбалансированное красно-черное дерево...
Короткий ответ HashMap внутри — это массив бакетов: массив узлов Node[] table, где каждый узел хранит hash, key, value и ссылку next на следующий узел при коллизии. Индекс корзины вычисляется из hashCode() ключа, а коллизии разрешаются цепочками узлов. Как это работает подробнее По умолчанию создаётся 16 корзин, индекс вычисляется как (n - 1) & hash, где n — текущая длина массива. Когда число записей превышает ёмкость × load factor (по умолчанию 0,75), массив увеличивается примерно вдвое и записи перераспределяются по новым корзинам. Узел: хранит четыре поля — вычисленный хэш ключа, ключ, значение и ссылку next на следующий узел той же корзины. Коллизии: разные ключи с одним индексом выстраиваются в цепочку; с Java 8 цепочка длиннее 8 узлов превращается в красно-чёрное дерево, и худший случай поиска становится O(log n) вместо O(n). null: HashMap допускает один null-ключ — он попадает в корзину с индексом 0 без вызова hashCode — и сколько угодно null-значений. Потокобезопасность: класс не синхронизирован,
Короткий ответ Контракт Java: если два объекта равны по equals(), их hashCode() обязаны быть одинаковыми. Обратное не требуется: одинаковый хэш-код не гарантирует равенства — это коллизия. Связь критична для HashMap и HashSet: по hashCode определяется корзина, а точное совпадение внутри корзины проверяется через equals. Как это работает подробнее Если переопределить только equals и не тронуть hashCode, контракт нарушается: равные объекты разъедутся по разным корзинам, поиск не найдёт элемент, а в Set или Map появятся дубликаты. Поэтому методы переопределяют всегда вместе и на основе одного и того же набора значимых полей. Требования к equals: рефлексивность (объект равен себе), симметричность, транзитивность, консистентность и возврат false для null. Генерация: используйте средства IDE или Objects.equals и Objects.hash — это синхронизирует поля в обоих методах. Типичный баг: нарушение контракта — одна из самых частых причин неочевидных ошибок при работе с коллекциями. Пример кода Что использовать на практике
Короткий ответ list хранит упорядоченные элементы, допускает дубликаты и даёт доступ по индексу. set — коллекция только уникальных элементов с быстрой проверкой вхождения. dict — пары «ключ — значение» с уникальными ключами и быстрым доступом по ключу; с версии Python 3.7 он сохраняет порядок вставки. Как это работает подробнее Список. Упорядоченная индексируемая коллекция: порядок добавления сохраняется, дубликаты допустимы, доступ идёт по индексу. Множество. Неупорядоченная коллекция уникальных элементов, оптимизированная для проверки вхождения и математических операций: объединения, пересечения и разности. Словарь. Хранит пары «ключ — значение», ключи уникальны, значение по ключу находится очень быстро, а порядок вставки сохраняется начиная с версии 3.7. Что использовать на практике Порядок и дубликаты. Для последовательности шагов алгоритма, истории транзакций или списка комментариев выбирай список. Уникальность. Для хранения уникальных идентификаторов, поиска общих элементов у пользователей или удаления
Короткий ответ Строка в Java неизменяема, потому что после создания объекта String его содержимое изменить нельзя: методы, которые выглядят как изменение (concat, replace, substring, toUpperCase), возвращают новый объект, а исходный остаётся нетронутым. Технически это обеспечивают final-массив символов с инкапсуляцией и final-класс, запрещающий наследование. Как это работает подробнее Неизменяемость — продуманное решение разработчиков языка: она делает строки безопасными для кэширования, разделения между потоками и хранения чувствительных данных. Хэш-код вычисляется один раз и сохраняется, строки надёжно интернируются и переиспользуются в пуле, а ключ коллекции не меняется после вставки. Кэширование hashCode — значение вычисляется один раз и сохраняется в поле, вызовы при работе с HashMap и HashSet не пересчитывают его. Пул строк и интернирование — неизменяемые литералы безопасно переиспользовать: одна «испорченная» строка не повлияет на все места использования. Стабильные ключи — ключ не меняется после встав