Что происходит внутри TreeMap.put()?
Недавно мы в деталях рассматривали, какие процессы происходят при добавлении элемента в HashMap. Теперь поговорим о TreeMap. Здесь не так много тонкостей, как в хэш-таблице.
TreeMap требует либо задать порядок ключей вручную (передать в конструктор Comparator), либо чтобы они имели собственный естественный порядок (были Comparable).
Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода compare. Дойдя до конца, пара ключ-значение «повисает» новым узлом.
2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
Java Guru🤓 #java
Недавно мы в деталях рассматривали, какие процессы происходят при добавлении элемента в HashMap. Теперь поговорим о TreeMap. Здесь не так много тонкостей, как в хэш-таблице.
TreeMap требует либо задать порядок ключей вручную (передать в конструктор Comparator), либо чтобы они имели собственный естественный порядок (были Comparable).
Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода compare. Дойдя до конца, пара ключ-значение «повисает» новым узлом.
2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
Java Guru🤓 #java
👍11🔥6❤3
  🏗 Курс “Software Architect” от OTUS — набор заканчивается. Успейте пройти вступительный тест и занять место в группе!
Почему стоит присоединиться прямо сейчас:
• 100% практики на реальных проектах
• Проектирование гибких архитектур
• Микросервисы, интеграции, Big Data
• Современные паттерны: CQRS, Event Sourcing и др.
💡 Кому подойдёт:
• Разработчикам, готовым выйти на новый уровень
• Архитекторам, углубляющим экспертизу
• Тимлидам и менеджерам
✅ После курса вы сможете:
• Проектировать масштабируемые архитектуры
• Оптимизировать взаимодействие сервисов
• Повышать качество и устойчивость систем
Места в группе ограничены — пройдите вступительное тестирование сегодня, чтобы успеть!
https://vk.cc/cPCgvE
Почему стоит присоединиться прямо сейчас:
• 100% практики на реальных проектах
• Проектирование гибких архитектур
• Микросервисы, интеграции, Big Data
• Современные паттерны: CQRS, Event Sourcing и др.
💡 Кому подойдёт:
• Разработчикам, готовым выйти на новый уровень
• Архитекторам, углубляющим экспертизу
• Тимлидам и менеджерам
✅ После курса вы сможете:
• Проектировать масштабируемые архитектуры
• Оптимизировать взаимодействие сервисов
• Повышать качество и устойчивость систем
Места в группе ограничены — пройдите вступительное тестирование сегодня, чтобы успеть!
https://vk.cc/cPCgvE
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576❤2👍2🔥2
  Можно ли хранить null в стандартных коллекциях?
Все интерфейсы Collections Framework позволяют своим реализациям самостоятельно решать, поддерживать ли null-значения. Если реализация не может принять null, она выбрасывает NullPointerException или ClassCastException.
Большинство списков (LinkedList, ArrayList) принимают null без проблем. Большинство очередей (Queue и Deque) не хранят null – возвращая из читающего метода null они сообщают пользователю о пустоте коллекции.
Unmodifiable Maps не допускают null-ов совсем. Обычные изменяемые мапы обычно не испытывают трудности со значениями null. А вот с ключами дело обстоит интереснее.
HashMap не может посчитать hash-сумму от null. Но вместо этого для таких ключей просто используется бакет номер 0.
Иногда этот вопрос дается как задача с подвохом про TreeMap. Nullability её ключей зависит от готовности к этому компаратора. Натуральный порядок (который работает для Comparable ключей) не поддерживает null. Раньше в реализации был баг, который позволял положить значение по ключу null в корень дерева без выброса исключения.
Для значений Set-ов действуют те же правила, что для ключей лежащих в основе их Map-ов.
Java Guru🤓 #java
Все интерфейсы Collections Framework позволяют своим реализациям самостоятельно решать, поддерживать ли null-значения. Если реализация не может принять null, она выбрасывает NullPointerException или ClassCastException.
Большинство списков (LinkedList, ArrayList) принимают null без проблем. Большинство очередей (Queue и Deque) не хранят null – возвращая из читающего метода null они сообщают пользователю о пустоте коллекции.
Unmodifiable Maps не допускают null-ов совсем. Обычные изменяемые мапы обычно не испытывают трудности со значениями null. А вот с ключами дело обстоит интереснее.
HashMap не может посчитать hash-сумму от null. Но вместо этого для таких ключей просто используется бакет номер 0.
Иногда этот вопрос дается как задача с подвохом про TreeMap. Nullability её ключей зависит от готовности к этому компаратора. Натуральный порядок (который работает для Comparable ключей) не поддерживает null. Раньше в реализации был баг, который позволял положить значение по ключу null в корень дерева без выброса исключения.
Для значений Set-ов действуют те же правила, что для ключей лежащих в основе их Map-ов.
Java Guru🤓 #java
👍11🔥5❤2
  Какой сценарий может привести к утечке памяти?
  Anonymous Quiz
    6%
    Использование try-with-resources для работы с потоками ввода/вывода
      
    19%
    Применение WeakReference для кэширования объектов
      
    65%
    Хранение объектов в static коллекции без явного удаления
      
    4%
    Использование Optional вместо null для обработки отсутствующих значений
      
    6%
    Автоматическое закрытие соединений с БД с помощью HikariCP
      
    👍7❤3🔥2
  Какой потенциальный риск присутствует?
  Anonymous Quiz
    23%
    Код работает корректно, проблем нет
      
    26%
    future.get() может зависнуть навсегда
      
    9%
    Высокая нагрузка на потокобезопасные ресурсы, нужен synchronized
      
    18%
    CompletableFuture.supplyAsync() блокирует основной поток
      
    24%
    future.get() может выбросить NullPointerException
      
    👍8🤔7🤨2😐2
  Podlodka Crew 29 сентября запускает новую конференцию — Podlodka AI Crew 🥳
Если вы ищете практические знания без воды — это оно. Подлодка собрала экспертов, которые покажут, что реально работает в коде, пайплайнах и командных процессах.
В программе:
📊«AI, ML, DS, нейросети: без хайпа в терминах» — разберём границы применимости подходов, чтобы отличать пользу от шума (Алексей Шаграев, ex-Google, ex-Yandex).
👥 Круглый стол «AI-культура в команде» — инструменты и практики, сопротивление/принятие, влияние на эффективность и безопасность (Макс Сальников / Microsoft, Владимир Иванов / Supplied, Михаил Левченко / Яндекс Вертикали, Павел Герасимов / Wrike).
💻 Мастер-класс «Project-aware ассистенты: RAG + MCP» — живая документация, контекст кода для LLM и интерфейс запросов в мессенджере; как это ускоряет онбординг и разработку (Григорий Сухоруков, Яндекс).
⚡«Эффективный промптинг» — техники, которые убирают типовые страхи и реально ускоряют разработку (Евгений Сатуров, Surf).
Почему это важно: AI уже часть рабочего стека — от IDE до CI/CD. Здесь — практики с измеримым эффектом: меньше рутины, быстрее процессы.
Кому будет полезно: разработчикам, архитекторам и техлидам, платформенным/DevOps-инженерам - всем, кто внедряет AI-процессы и ждёт измеримого результата.
🗓 29 сентября - 3 октября
🔗 Подробности и регистрация: https://podlodka.io/aicrew
Если вы ищете практические знания без воды — это оно. Подлодка собрала экспертов, которые покажут, что реально работает в коде, пайплайнах и командных процессах.
В программе:
📊«AI, ML, DS, нейросети: без хайпа в терминах» — разберём границы применимости подходов, чтобы отличать пользу от шума (Алексей Шаграев, ex-Google, ex-Yandex).
👥 Круглый стол «AI-культура в команде» — инструменты и практики, сопротивление/принятие, влияние на эффективность и безопасность (Макс Сальников / Microsoft, Владимир Иванов / Supplied, Михаил Левченко / Яндекс Вертикали, Павел Герасимов / Wrike).
💻 Мастер-класс «Project-aware ассистенты: RAG + MCP» — живая документация, контекст кода для LLM и интерфейс запросов в мессенджере; как это ускоряет онбординг и разработку (Григорий Сухоруков, Яндекс).
⚡«Эффективный промптинг» — техники, которые убирают типовые страхи и реально ускоряют разработку (Евгений Сатуров, Surf).
Почему это важно: AI уже часть рабочего стека — от IDE до CI/CD. Здесь — практики с измеримым эффектом: меньше рутины, быстрее процессы.
Кому будет полезно: разработчикам, архитекторам и техлидам, платформенным/DevOps-инженерам - всем, кто внедряет AI-процессы и ждёт измеримого результата.
🗓 29 сентября - 3 октября
🔗 Подробности и регистрация: https://podlodka.io/aicrew
👍3❤2🔥2
  Какие есть преимущества у массива перед коллекцией?
Для хранения ссылочных типов массив подходит хуже чем ArrayList. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.
Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.
1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных, Object занимает дополнительную память под метаинформацию;
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.
С другой стороны, для массива всё так же нужно написать больше кода, он сложнее. Поэтому замена листов на массивы обычно считается излишней микрооптимизацией.
Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть HashMap с целочисленными ключами – SparseArray.
Java Guru🤓 #java
Для хранения ссылочных типов массив подходит хуже чем ArrayList. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.
Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.
1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных, Object занимает дополнительную память под метаинформацию;
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.
С другой стороны, для массива всё так же нужно написать больше кода, он сложнее. Поэтому замена листов на массивы обычно считается излишней микрооптимизацией.
Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть HashMap с целочисленными ключами – SparseArray.
Java Guru🤓 #java
👍11🔥4❤2
  🏗 Курс “Архитектура и шаблоны проектирования” от OTUS — набор заканчивается. Успейте занять место в группе обучения!
Почему стоит записаться сейчас:
• 50% практики: вебинары, задания, проекты
• Онлайн-занятия 2 раза в неделю + записи навсегда
• Поддержка опытных менторов
💡 Кому подойдёт:
• Fullstack/Backend разработчикам
• DevOps-инженерам
• Desktop-разработчикам
✅ После курса вы сможете:
• Применять архитектурные шаблоны и SOLID
• Рефакторить и писать чистый код
• Выбирать оптимальные решения
⏳ Места ограничены. Пройдите вступительный тест
👉 Пройти тест и записаться:
https://vk.cc/cPLfpQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Почему стоит записаться сейчас:
• 50% практики: вебинары, задания, проекты
• Онлайн-занятия 2 раза в неделю + записи навсегда
• Поддержка опытных менторов
💡 Кому подойдёт:
• Fullstack/Backend разработчикам
• DevOps-инженерам
• Desktop-разработчикам
✅ После курса вы сможете:
• Применять архитектурные шаблоны и SOLID
• Рефакторить и писать чистый код
• Выбирать оптимальные решения
⏳ Места ограничены. Пройдите вступительный тест
👉 Пройти тест и записаться:
https://vk.cc/cPLfpQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2🔥2❤1
  Что будет результатом кода?
  Anonymous Quiz
    70%
    5
      
    22%
    10
      
    6%
    Ошибка компиляции
      
    1%
    null
      
    2%
    UnsupportedOperationException
      
    👍8🔥3❤1
  Лучший способ вырасти — это персональный план развития от Senior-инженера из БигТеха.
Вот как все работает:
Мы в ШОРТКАТ провели уже почти 1000 таких мок-интервью и получили оценку 4.9/5, поэтому знаем о чем говорим.
Мы хотим, чтобы у каждого была возможность проверить в деле наш сервис, а потом уже доверить нам свое развитие.
Переходи в нашего бота и забирай свой мок за 900 рублей → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7🔥2❤1🤔1🤣1
  Что такое fail-fast и fail-safe итераторы?
Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса Iterator. Они определяют, как поведет себя итератор при изменении перебираемой последовательности.
Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса ArrayList, при изменении он выбрасывает ConcurrentModificationException. Рекомендуется не основывать логику программы на fail-fast отказах, и использовать их только как признак ошибки реализации.
Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса ConcurrentHashMap работает с копией данных, он не выбросит исключение при изменении коллекции, но может не увидеть часть свежих изменений. Плата за отсутствие ошибок других fail-safe итераторов может отличаться, детали всегда можно найти в документации коллекций.
Подписывайся на наш канал в Max🟪 
Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса Iterator. Они определяют, как поведет себя итератор при изменении перебираемой последовательности.
Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса ArrayList, при изменении он выбрасывает ConcurrentModificationException. Рекомендуется не основывать логику программы на fail-fast отказах, и использовать их только как признак ошибки реализации.
Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса ConcurrentHashMap работает с копией данных, он не выбросит исключение при изменении коллекции, но может не увидеть часть свежих изменений. Плата за отсутствие ошибок других fail-safe итераторов может отличаться, детали всегда можно найти в документации коллекций.
Подписывайся на наш канал в Max
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9🔥6❤4
  Женя Янченко, java-dev и руководитель разработки, cделала конспекты самой популярной книги по архитектуре систем — «Высоконагруженные приложения» Мартина Клеппмана (книга с кабанчиком).
Где главы обзорные — даёт суть.
Про репликацию, шардирование, транзакции — разбирает подробно, со схемами и примерами.
В канале Женя разбирает и другие технические темы, которые могут пригодиться на собесе:
А как же алгоритмы? Они тоже есть!
Женя объявила челлендж — решить 300 задач за год 😱
Каждый месяц делает отчеты и разборы популярных задач:
Истории из опыта, рекомендации и ответы на вопросы:
📝 и ещё 100+ полезных технических и жизненных постов.
Подписывайтесь, чтобы не потерять полезный канал
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🔥3❤2🤣1
  👍8🔥6❤2🌭1
  1 октября (уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍3🔥1