Что происходит внутри TreeMap.put()?
Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
TreeMap
требует либо задать порядок ключей вручную (передать в конструктор Comparator
), либо чтобы они имели собственный естественный порядок (были Comparable
).Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
compare
. Дойдя до конца, пара ключ-значение «повисает» новым узлом.2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
Перечислите стандартные функциональные интерфейсы
Стандартная библиотека содержит пакет
Функции
Обычная обобщенная функция – интерфейс
Бинарные функции – функции с двумя параметрами и возвращаемым значением.
Поставщики (Suppliers)
Интерфейсы
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T
Предикаты
Операторы
Унарный (
👉@BookJava
Стандартная библиотека содержит пакет
java.util.function
, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:Функции
Обычная обобщенная функция – интерфейс
Function<T, R>
. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction
. (Здесь и далее вместо X и Y подставляются названия примитивов).Бинарные функции – функции с двумя параметрами и возвращаемым значением.
BiFunction<T
, U
, R>
, ToXBiFunction<T, U>
.Поставщики (Suppliers)
Интерфейсы
Supplier<T>
, XSupplier
– не принимают ничего, возвращают (поставляют) значение.Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T
,
U> и XYConsumer, потребляет два параметра.Предикаты
Predicate<T>
, XPredicate
– принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.Операторы
Унарный (
UnaryOperator<T>
) и бинарный (BinaryOperator<T>
) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator
и XBinaryOperator
вдобавок содержат дефолтные реализации методов для композиции операторов.👉@BookJava
Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие отличия между @Component, @Service, @Repository и @Controller?
Остальные аннотации – это алиасы аннотации
Эти аннотации называют «Stereotype annotations». Их главное отличие – семантика, логическая роль компонентов:
•
•
•
Сторонние компоненты могут пользоваться этой семантикой. Например, трансляция исключений Persistence API работает именно на компонентах стереотипа
👉@BookJava
@Component
– простой способ сделать объявление класса объявлением Spring-бина. Из всех компонентов, которые попали в сканирование (о которых знает @ComponentScan
), будут созданы бин-дефинишны.Остальные аннотации – это алиасы аннотации
@Component
. Сами по себе они не добавляют поведения, и технически в рамках ядра Spring Framework работают так же.Эти аннотации называют «Stereotype annotations». Их главное отличие – семантика, логическая роль компонентов:
•
@Service
– реализация бизнес-логики;•
@Repository
– хранилище данных: «репозиторий» из Domain-Driven Design или классический DAO;•
@Controller
– обработка веб-запросов (методы @RequestMapping
)Сторонние компоненты могут пользоваться этой семантикой. Например, трансляция исключений Persistence API работает именно на компонентах стереотипа
@Repository
. Таким образом, в отдельных случаях кроме семантики может меняться и поведение кода библиотек.👉@BookJava
Создание пользовательской аннотации в Java. Дженерики и стирание типов в Java
Аннотация — это функция, которая служит механизмом добавления в код дополнительной информации, что способствует улучшению организации, документирования и автоматизации в рамках программных проектов. Если вы какое-то время программировали на Java, то, вероятно, вам знакома хотя бы пара аннотаций. Одним из примеров является
Хотя аннотации используют многие разработчики, не все из них понимают, насколько легко создавать собственные аннотации. При этом многие платформы часто используют свои собственные аннотации наряду со встроенными аннотациями Java.
https://medium.com/@gulsum.satic/creating-custom-annotation-in-java-942e44f3d870
👉@BookJava
Аннотация — это функция, которая служит механизмом добавления в код дополнительной информации, что способствует улучшению организации, документирования и автоматизации в рамках программных проектов. Если вы какое-то время программировали на Java, то, вероятно, вам знакома хотя бы пара аннотаций. Одним из примеров является
@Override
. Хотя аннотации используют многие разработчики, не все из них понимают, насколько легко создавать собственные аннотации. При этом многие платформы часто используют свои собственные аннотации наряду со встроенными аннотациями Java.
https://medium.com/@gulsum.satic/creating-custom-annotation-in-java-942e44f3d870
👉@BookJava
Как использовать ReadWriteLock?
Стандартный интерфейс
Оба типа блокировок одного экземпляра
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
👉@BookJava
Стандартный интерфейс
ReadWriteLock
предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock()
и writeLock()
. Они возвращают объекты под интерфейсом Lock.Оба типа блокировок одного экземпляра
ReadWriteLock
связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock
закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock
осуществляется модификация ресурса.Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
ReentrantReadWriteLock
, который во многом похож на обычный ReentrantLock.👉@BookJava
🎯 Исключения в разработке — что это и как с ними работать?
Узнайте на открытом практическом уроке «Исключения. От Java до Spring, от шестнадцати и старше» от OTUS.
На вебинаре опытный эксперт разберет:
- что такое исключения;
- как ими пользоваться;
- как на них реагировать и почему они тесно связаны с архитектурой приложения.
И, конечно, мы не забудем про Spring!
Спикер — Senior Software Engineer.
Встречаемся 15 мая в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!
👉 Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cwFN3f
Узнайте на открытом практическом уроке «Исключения. От Java до Spring, от шестнадцати и старше» от OTUS.
На вебинаре опытный эксперт разберет:
- что такое исключения;
- как ими пользоваться;
- как на них реагировать и почему они тесно связаны с архитектурой приложения.
И, конечно, мы не забудем про Spring!
Спикер — Senior Software Engineer.
Встречаемся 15 мая в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
GitHub
GitHub - nebel-abyssus/fibonacci: Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
Исходные файлы статьи о быстром нахождении чисел Фибоначчи. - nebel-abyssus/fibonacci
Что такое classpath?
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
Есть два основных способа установки classpath: в переменной окружения ОС
В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
Если приложение запускается из jar-файла (
👉@BookJava
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
java
), этот параметр применим и для других утилит JDK, таких как javac
, javadoc
и другие.Есть два основных способа установки classpath: в переменной окружения ОС
CLASSPATH
, и в аргументе командной строки -cp
(синоним -classpath
). Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория.В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
:
в параметре командной строки, или же ;
в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ *
.Если приложение запускается из jar-файла (
java -jar
), classpath должен быть указан в его манифесте.👉@BookJava
Подборка Telegram каналов для программистов
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Совет по Spring 💡
Протоколирование HTTP-запросов с помощью фильтра
Включите протоколирование запросов с помощью фильтра
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html
👉@BookJava
Протоколирование HTTP-запросов с помощью фильтра
CommonsRequestLoggingFilter
Включите протоколирование запросов с помощью фильтра
CommonsRequestLoggingFilter
, чтобы получать подробную информацию о входящих запросах. 🔥https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html
👉@BookJava
docs.spring.io
CommonsRequestLoggingFilter (Spring Framework 6.1.14 API)
declaration: package: org.springframework.web.filter, class: CommonsRequestLoggingFilter
Совет по Spring 💡
Вы можете преобразовать
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html
👉@BookJava
Вы можете преобразовать
String RequestParams
непосредственно в LocalDate
на уровне запроса с помощью @DateTimeFormat
. Вам необходимо указать шаблон. Это может быть ваш собственный шаблон или шаблон ISO. Нет необходимости преобразовывать его «вручную».https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html
👉@BookJava
Расскажем на открытом практическом уроке от OTUS.
Спикер занятия — Senior Software Engineer.
На вебинаре мы:
- разберем паттерн DTO (Data Transfer Object);
- обсудим проблемы, которые решает паттерн и его основные сценарии использования на примере небольшого приложения на Spring Boot;
- изучим инструмент MapStruct, чтобы сделать данное сочетание удобным и сократить количество boilerplate кода.
Встречаемся 23 мая в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Spring Boot 💡
Начиная с Spring Boot 3.1🍃, вы можете автоматически запускать внешние сервисы (например, базы данных) в режиме dev, используя Testcontainers и новую `
👉@BookJava
Начиная с Spring Boot 3.1🍃, вы можете автоматически запускать внешние сервисы (например, базы данных) в режиме dev, используя Testcontainers и новую `
spring-boot:test-run
`. Вот инструкция 👆👉@BookJava
Совет по Spring Boot 💡
Аннотация с возможностью кэширования
Обеспечьте быстрый доступ к данным и уменьшите нагрузку на базу данных. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html
👉@BookJava
Аннотация с возможностью кэширования
Обеспечьте быстрый доступ к данным и уменьшите нагрузку на базу данных. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html
👉@BookJava
Совет по Spring Boot 💡
Вы думаете о замене 🍃`RestTemplate` на новый Spring
👉@BookJava
Вы думаете о замене 🍃`RestTemplate` на новый Spring
RestClient
? Конфигурация SSL очень проста благодаря поддержке 🔐`SslBundles` через интерфейс RestClientSsl
👆👉@BookJava
Совет по Spring Boot 💡
Если вы используете DTO в Spring Data/JPA, вы можете автоматизировать отображение между сущностями и DTO с помощью библиотеки Blaze Persistence (https://persistence.blazebit.com). Тогда вы сможете воспользоваться преимуществами, например, паттерна Spring repository.
👉@BookJava
Если вы используете DTO в Spring Data/JPA, вы можете автоматизировать отображение между сущностями и DTO с помощью библиотеки Blaze Persistence (https://persistence.blazebit.com). Тогда вы сможете воспользоваться преимуществами, например, паттерна Spring repository.
👉@BookJava