Зачем используется Serial Version UID? Что если не определить его?
Сериализуемый класс явно или неявно, но всегда имеет
Для совпадающих версий работает мощная поддержка эволюции класса – совместимые изменения, такие как добавление или удаление полей, не приводят к
Неявное значение вычисляется автоматически в рантайме, и включает в себя информацию о имени типа, списке родителей и полей (с точностью до коллизии). По смыслу это похоже на хэш-сумму класса. Соответственно, при любом изменении класса значение изменится, и поддержка эволюции окажется бесполезной.
Всегда лучше явно указывать любое значение
Явное значение устанавливается в переменную
👉@BookJava
Сериализуемый класс явно или неявно, но всегда имеет
serialVersionUID
. Это число типа long
, которое представляет собой «версию» сериализационной формы класса. Если при сериализации/десериализации значения serialVersionUID
не совпадают – будет выброшено InvalidClassException
.Для совпадающих версий работает мощная поддержка эволюции класса – совместимые изменения, такие как добавление или удаление полей, не приводят к
InvalidClassException
. Неявное значение вычисляется автоматически в рантайме, и включает в себя информацию о имени типа, списке родителей и полей (с точностью до коллизии). По смыслу это похоже на хэш-сумму класса. Соответственно, при любом изменении класса значение изменится, и поддержка эволюции окажется бесполезной.
Всегда лучше явно указывать любое значение
serialVersionUID
, и изменять только в тех редких случаях, когда требуется сломать совместимость с предыдущими версиями. Стандартная утилита JDK serialver
умеет «угадывать» авто-генерированное значение. Она используется чтобы зафиксировать значение для включения поддержки эволюции созданного ранее класса.Явное значение устанавливается в переменную
static final long serialVersionUID
. 👉@BookJava
👍4
Media is too big
VIEW IN TELEGRAM
Разрешаем фронту подписаться на бэкенд. Server Sent Events на Java Spring Boot.
Простой способ избежать постоянного опроса сервера. Событийный способ работы.
источник
👉@BookJava
Простой способ избежать постоянного опроса сервера. Событийный способ работы.
источник
👉@BookJava
👍12
🎉4👍2
Ultimate Java Developer Roadmap 2024
https://www.rameshfadatare.com/learn-java-programming/
👉@BookJava
https://www.rameshfadatare.com/learn-java-programming/
👉@BookJava
👍4🔥1
Опыт отладки хитрой утечки прямой памяти
Pinterest поддерживает формирование отчётов по метрикам рекламных объявлений внешних рекламодателей и расчёт рекламных бюджетов в реальном времени. Всё это основано на потоковых конвейерах обработки данных, созданных с помощью на Apache Flink. Доступность заданий (job) Flink для пользователей находится на уровне 99-го перцентиля. Но время от времени некоторые задачи (task) «валятся» под ударами неприятных ошибок, вызванных утечками прямой памяти (Out-Of-Memory, OOM), возникающими сразу в нескольких операторах.
https://habr.com/ru/companies/wunderfund/articles/843618/
👉@BookJava
Pinterest поддерживает формирование отчётов по метрикам рекламных объявлений внешних рекламодателей и расчёт рекламных бюджетов в реальном времени. Всё это основано на потоковых конвейерах обработки данных, созданных с помощью на Apache Flink. Доступность заданий (job) Flink для пользователей находится на уровне 99-го перцентиля. Но время от времени некоторые задачи (task) «валятся» под ударами неприятных ошибок, вызванных утечками прямой памяти (Out-Of-Memory, OOM), возникающими сразу в нескольких операторах.
https://habr.com/ru/companies/wunderfund/articles/843618/
👉@BookJava
👍1
Принципы SOLID в Java с примерами
Принципы SOLID - это набор из пяти принципов проектирования в объектно-ориентированном программировании, которые помогают разработчикам создавать более удобное, понятное и гибкое программное обеспечение. Эти принципы были введены Робертом К. Мартином, также известным как Дядя Боб. SOLID означает:
1 - Single Responsibility Principle (SRP)
2 - Open/Closed Principle (OCP)
3 - Liskov Substitution Principle (LSP)
4 - Interface Segregation Principle (ISP)
5 - Dependency Inversion Principle (DIP)
https://www.javaguides.net/2020/01/solid-principles-in-java-with-examples.html
👉@BookJava
Принципы SOLID - это набор из пяти принципов проектирования в объектно-ориентированном программировании, которые помогают разработчикам создавать более удобное, понятное и гибкое программное обеспечение. Эти принципы были введены Робертом К. Мартином, также известным как Дядя Боб. SOLID означает:
1 - Single Responsibility Principle (SRP)
2 - Open/Closed Principle (OCP)
3 - Liskov Substitution Principle (LSP)
4 - Interface Segregation Principle (ISP)
5 - Dependency Inversion Principle (DIP)
https://www.javaguides.net/2020/01/solid-principles-in-java-with-examples.html
👉@BookJava
👍12❤1
Используйте Lombok осознанно
Использование Lombok значительно упрощает код, однако, не смотря на то, что мы используем аннотации вместо того, чтобы писать код вручную, генерируемый код также будет являться частью нашего приложения и его нужно сопровождать, а значит, используя аннотацию, мы должны четко понимать, какой именно код будет сгенерирован.
Например, используя аннотацию
👉@BookJava
Использование Lombok значительно упрощает код, однако, не смотря на то, что мы используем аннотации вместо того, чтобы писать код вручную, генерируемый код также будет являться частью нашего приложения и его нужно сопровождать, а значит, используя аннотацию, мы должны четко понимать, какой именно код будет сгенерирован.
Например, используя аннотацию
@Data
мы должны помнить, что она включает в себя аннотацию @EqualsAndHashCode
, которая по умолчанию использует в методе hashCode все атрибуты класса. А если какой-то из атрибутов ссылается на наш класс, это может привести к бесконечной рекурсии. 👉@BookJava
👍12
Подборка Telegram каналов для программистов
Системное администрирование 📌
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
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
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/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 Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
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 Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Системное администрирование 📌
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
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
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/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 Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
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 Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Telegram
DevOps Star (Звезда Девопса)
Devops, Linux, SRE, Kubernetes, Сисадмин, Девопс, Python, JS, Java, Git, IT канал, программирование, безопасность, ИТ, Sysadmin
По всем вопросам @evgenycarter
По всем вопросам @evgenycarter
Разница orElse() vs orElseGet()
Многим программистам, которые только начинают работать с Optional или Java 8, разница между orElse() и
А) Вариант с
Б) При использовании
Таким образом, в первом случае мы просто создали один лишний объект, который никогда не используется, что может оказать влияние на производительность.
👉@BookJava
Многим программистам, которые только начинают работать с Optional или Java 8, разница между orElse() и
orElseGet()
непонятна. Однако между ними есть тонкое, но важное различие:А) Вариант с
orElse()
. При выполнении метода в консоль выведется 'Getting Default Value', несмотря на то, что объект в Optional присутствует.Б) При использовании
orElseGet()
для извлечения обернутого значения метод getDefaultValue()
не вызывается, поскольку содержащееся значение присутствует.Таким образом, в первом случае мы просто создали один лишний объект, который никогда не используется, что может оказать влияние на производительность.
👉@BookJava
👍12
Делайте все переменные final
По умолчанию делайте все локальные переменные
То же правило можно отнести и к атрибутам класса — по умолчанию их также лучше делать
Разумеется, если по логике предполагается изменение состояния класса, изменяемые атрибуты не должны быть финальными.
👉@BookJava
По умолчанию делайте все локальные переменные
final
. Исключение — если по логике эта переменная должна изменяться в последующем коде. Однако, переменных, которые мы инициализируем один раз и далее не изменяем, как правило, большинство.То же правило можно отнести и к атрибутам класса — по умолчанию их также лучше делать
final
, если мы хотим сделать состояние класса неизменяемым и потокобезопасным.Разумеется, если по логике предполагается изменение состояния класса, изменяемые атрибуты не должны быть финальными.
👉@BookJava
👍11👎1👏1😁1
Разница создания списка при помощи List.of() Arrays.asList()
Понимание различий между List.of() и Arrays.asList() важно для любого Java-разработчика. List.of() — это фабричный метод, впервые представленный в Java 9, который создает неизменяемый список, содержащий указанные элементы.
— Неизменяемость: список, созданный List.of(), имеет фиксированный размер и не поддерживает добавление или удаление элементов. При попытке добавить или удалить элемент будет выброшено UnsupportedOperationException.
— Null значения: List.of() не допускает null элементов. Если вы попытаетесь добавить null, появится исключение NullPointerException.
Пример использования:
Для создания изменяемого списка следует использовать Arrays.asList()
В отличие от List.of(), Arrays.asList() допускает нулевые элементы.
👉@BookJava
Понимание различий между List.of() и Arrays.asList() важно для любого Java-разработчика. List.of() — это фабричный метод, впервые представленный в Java 9, который создает неизменяемый список, содержащий указанные элементы.
— Неизменяемость: список, созданный List.of(), имеет фиксированный размер и не поддерживает добавление или удаление элементов. При попытке добавить или удалить элемент будет выброшено UnsupportedOperationException.
— Null значения: List.of() не допускает null элементов. Если вы попытаетесь добавить null, появится исключение NullPointerException.
Пример использования:
1 List<String› immutableList = List.of("apple", "banana", "orange");
Для создания изменяемого списка следует использовать Arrays.asList()
1 List<String> mutableList = Arrays.asList("red", "green", "blue");
В отличие от List.of(), Arrays.asList() допускает нулевые элементы.
👉@BookJava
👍18
Используйте параметризованные тесты
Использование тестов с параметрами позволяет значительно увеличить качество и процент покрытия тестов без разрастания объема кода. Для того чтобы протестировать метод с различными параметрами, теперь не нужно писать несколько разных тестов — достаточно написать один, и передать ему все необходимые параметры на вход.
👉@BookJava
Использование тестов с параметрами позволяет значительно увеличить качество и процент покрытия тестов без разрастания объема кода. Для того чтобы протестировать метод с различными параметрами, теперь не нужно писать несколько разных тестов — достаточно написать один, и передать ему все необходимые параметры на вход.
👉@BookJava
👍10
Используйте плагин checkstyle
Подключить его очень легко и в Gradle, и в Maven.
Плагин проверяет форматирование, неиспользуемые импорты и когнитивную сложность ваших методов при каждой сборке приложения, что помогает поддерживать ваш код удобочитаемым, а следовательно, лучше сопровождаемым.
👉@BookJava
Подключить его очень легко и в Gradle, и в Maven.
plugins {
id 'checkstyle'
Плагин проверяет форматирование, неиспользуемые импорты и когнитивную сложность ваших методов при каждой сборке приложения, что помогает поддерживать ваш код удобочитаемым, а следовательно, лучше сопровождаемым.
👉@BookJava
👍6
Преобразование коллекций
Новичкам зачастую трудно представить выгоду от использования Stream API вместо обычных циклов. Приведем несколько примеров, которые позволят вам сделать код лаконичнее.
👉@BookJava
Новичкам зачастую трудно представить выгоду от использования Stream API вместо обычных циклов. Приведем несколько примеров, которые позволят вам сделать код лаконичнее.
👉@BookJava
👍8🎉3
Оптимизация строк в Java
В Java строки (`String`) являются объектами, представляющими последовательность символов. Они имеют особое значение в языке, и оптимизация работы со строками важна для эффективного использования памяти и производительности приложения. Вот ключевые аспекты и методы оптимизации работы со строками в Java:
1. Пул строк (String Pool)
- Java использует специальную область памяти, называемую String Pool (или **интернированный пул строк**), для хранения строковых литералов.
- Когда строка создается как литерал, например,
- Если строка создается с помощью
Оптимизация:
- Используйте строковые литералы вместо явного создания новых объектов
Пример:
2. Метод `intern()`
- Метод
- Это полезно, когда вы хотите уменьшить количество дубликатов строк.
Пример:
3. Избегайте конкатенации строк в циклах
- Операция конкатенации строк через оператор
- Внутри циклов это особенно дорого, поскольку каждый раз создается новая строка.
Оптимизация:
- Используйте
Пример:
4. Используйте `StringBuilder` вместо `StringBuffer` для однопоточных операций
-
5. Использование методов `char[]` и `toCharArray()`
- Если необходимо часто модифицировать строку или выполнять операции с отдельными символами, то преобразование строки в массив символов (`char[]`) может быть более эффективно.
Пример:
6. Уменьшение использования временных строк
- Старайтесь избегать создания временных строк, которые сразу выбрасываются сборщиком мусора. Например, при разбиении строки (split) или других операциях, которые могут создать ненужные объекты.
Оптимизация:
- Используйте потоки или регулярные выражения для более эффективной обработки строк.
7. Использование `String.join()` или `Collectors.joining()` для объединения строк
- Если необходимо объединить множество строк (например, из массива или коллекции), лучше использовать
Пример:
👉@BookJava
В Java строки (`String`) являются объектами, представляющими последовательность символов. Они имеют особое значение в языке, и оптимизация работы со строками важна для эффективного использования памяти и производительности приложения. Вот ключевые аспекты и методы оптимизации работы со строками в Java:
1. Пул строк (String Pool)
- Java использует специальную область памяти, называемую String Pool (или **интернированный пул строк**), для хранения строковых литералов.
- Когда строка создается как литерал, например,
String str = "hello";
, JVM сначала проверяет, есть ли уже такая строка в пуле. Если есть, то возвращается ссылка на существующую строку, а не создается новый объект.- Если строка создается с помощью
new
, например, String str = new String("hello");
, новый объект строки создается в куче, даже если такая строка уже есть в пуле.Оптимизация:
- Используйте строковые литералы вместо явного создания новых объектов
String
через new
, чтобы JVM могла переиспользовать строки из пула.Пример:
String s1 = "hello"; // переиспользует строку из пула
String s2 = new String("hello"); // создает новую строку в куче
2. Метод `intern()`
- Метод
intern()
добавляет строку в пул строк, если ее там еще нет, и возвращает ссылку на строку из пула.- Это полезно, когда вы хотите уменьшить количество дубликатов строк.
Пример:
String s1 = new String("hello").intern(); // добавляет строку в пул и возвращает ссылку из пула
String s2 = "hello"; // использует строку из пула
System.out.println(s1 == s2); // true
3. Избегайте конкатенации строк в циклах
- Операция конкатенации строк через оператор
+
в Java создает новые объекты String
, поскольку строки неизменяемы. Это может привести к большому количеству временных объектов и снижению производительности.- Внутри циклов это особенно дорого, поскольку каждый раз создается новая строка.
Оптимизация:
- Используйте
StringBuilder
или StringBuffer
для конкатенации строк, если вы собираете строки в цикле.Пример:
// Плохой подход:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // каждый раз создается новая строка
}
// Оптимизированный подход:
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
builder.append(i); // строка накапливается без создания временных объектов
}
String result = builder.toString();
4. Используйте `StringBuilder` вместо `StringBuffer` для однопоточных операций
-
StringBuffer
синхронизирован, и это делает его потокобезопасным, но добавляет накладные расходы. Для однопоточных операций лучше использовать несинхронизированный StringBuilder
, который работает быстрее.5. Использование методов `char[]` и `toCharArray()`
- Если необходимо часто модифицировать строку или выполнять операции с отдельными символами, то преобразование строки в массив символов (`char[]`) может быть более эффективно.
Пример:
String str = "hello";
char[] charArray = str.toCharArray();
charArray[0] = 'H'; // изменяем символ
String modifiedStr = new String(charArray); // создаем новую строку
6. Уменьшение использования временных строк
- Старайтесь избегать создания временных строк, которые сразу выбрасываются сборщиком мусора. Например, при разбиении строки (split) или других операциях, которые могут создать ненужные объекты.
Оптимизация:
- Используйте потоки или регулярные выражения для более эффективной обработки строк.
7. Использование `String.join()` или `Collectors.joining()` для объединения строк
- Если необходимо объединить множество строк (например, из массива или коллекции), лучше использовать
String.join()
или Collectors.joining()
для оптимизации вместо ручной конкатенации.Пример:
List<String> list = Arrays.asList("one", "two", "three");
String result = String.join(", ", list); // более эффективное объединение строк
👉@BookJava
👍23👏2😁2
Какие бывают строковые классы?
В Java строковые классы — это классы, которые используются для работы со строками, то есть последовательностями символов. Основные строковые классы в Java:
1. String
- Неизменяемый класс (immutable): После создания объекта
- Использование: Широко используется для представления строковых значений.
- Особенности:
- Строки могут быть созданы с использованием строковых литералов или через конструктор.
- Для сравнения строк рекомендуется использовать метод
- Пример:
2. StringBuilder
- Изменяемый класс (mutable): Этот класс позволяет изменять строки без создания нового объекта.
- Основное применение: Используется, когда требуется частое изменение строк, например при конкатенации.
- Не синхронизирован: Этот класс не потокобезопасен, что делает его быстрее при работе в однопоточных приложениях.
- Пример:
3. StringBuffer
- Изменяемый класс (mutable): Как и
- Синхронизирован: Потокобезопасный, что делает его более медленным по сравнению с
- Основное применение: Рекомендуется использовать в многопоточных приложениях.
- Пример:
Различия между
- Неизменяемость:
- Потокобезопасность:
- Производительность:
👉@BookJava
В Java строковые классы — это классы, которые используются для работы со строками, то есть последовательностями символов. Основные строковые классы в Java:
1. String
- Неизменяемый класс (immutable): После создания объекта
String
его нельзя изменить.- Использование: Широко используется для представления строковых значений.
- Особенности:
- Строки могут быть созданы с использованием строковых литералов или через конструктор.
- Для сравнения строк рекомендуется использовать метод
equals()
, а не оператор ==
.- Пример:
String str = "Hello, World!";
2. StringBuilder
- Изменяемый класс (mutable): Этот класс позволяет изменять строки без создания нового объекта.
- Основное применение: Используется, когда требуется частое изменение строк, например при конкатенации.
- Не синхронизирован: Этот класс не потокобезопасен, что делает его быстрее при работе в однопоточных приложениях.
- Пример:
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!");
3. StringBuffer
- Изменяемый класс (mutable): Как и
StringBuilder
, позволяет изменять строки.- Синхронизирован: Потокобезопасный, что делает его более медленным по сравнению с
StringBuilder
.- Основное применение: Рекомендуется использовать в многопоточных приложениях.
- Пример:
StringBuffer sb = new StringBuffer("Hello");
sb.append(", World!");
Различия между
String
, StringBuilder
и StringBuffer
:- Неизменяемость:
String
неизменяемый, тогда как StringBuilder
и StringBuffer
изменяемы.- Потокобезопасность:
StringBuffer
синхронизирован, в отличие от StringBuilder
.- Производительность:
StringBuilder
быстрее, чем StringBuffer
при работе в однопоточных средах.👉@BookJava
👍9😁3
🚀 Совет по Java - Comparator 🚀
Принимает Comparator в качестве аргумента, который отвечает за сравнение ненулевых элементов. В случае, если переданный компаратор равен null, ненулевые значения считаются равными. 🔥
https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/Comparator.html#nullsLast(java.util.Comparator)
👉@BookJava
Comparator.nullsLast
Принимает Comparator в качестве аргумента, который отвечает за сравнение ненулевых элементов. В случае, если переданный компаратор равен null, ненулевые значения считаются равными. 🔥
https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/Comparator.html#nullsLast(java.util.Comparator)
👉@BookJava
👍4👏2
Spring Boot 3 🍃 включает несколько улучшений в области SSL 🔐
🔹3.1 - SSL Bundles
🔹3.2 - SSL Hot Reload
🔹3.4 - SSL certs info in the 'info' and 'health' Actuator endpoints
Чтобы включить SSL в '
👉@BookJava
🔹3.1 - SSL Bundles
🔹3.2 - SSL Hot Reload
🔹3.4 - SSL certs info in the 'info' and 'health' Actuator endpoints
Чтобы включить SSL в '
info
' endpoint, установите свойство "http://management.info.ssl.enabled=true
"👉@BookJava
👍5
Как заставить code coverage работать на вас
Недавно я снова услышал тезис, что code coverage не нужен и совсем не обязательно за ним следить, а нужно просто делать black-box тесты и считать количество тест-кейсов. Я не согласен с подобного рода категоричными утверждениями. В этой статье постараюсь изложить свою точку зрения и развеять некоторые мифы, опираясь на свой опыт в разработке и идеи, которые почерпнул из книг и статей других инженеров.
https://habr.com/ru/articles/836366/
👉@BookJava
Недавно я снова услышал тезис, что code coverage не нужен и совсем не обязательно за ним следить, а нужно просто делать black-box тесты и считать количество тест-кейсов. Я не согласен с подобного рода категоричными утверждениями. В этой статье постараюсь изложить свою точку зрения и развеять некоторые мифы, опираясь на свой опыт в разработке и идеи, которые почерпнул из книг и статей других инженеров.
https://habr.com/ru/articles/836366/
👉@BookJava
👍5
Media is too big
VIEW IN TELEGRAM
Создание REST API с использованием Spring WebFlux и Security
00:00:00 Введение
00:00:20 Создание проекта
00:11:36 Создание миграций БД
00:15:40 Создание базовых классов
00:23:20 Реализация логики генерации JWT токена
00:46:30 Реализация логики валидации JWT токена
00:53:05 Построения цепочки аутентификации
01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
01:12:11 Реализация REST контроллеров
01:23:15 Проверка REST API средствами Postman
01:24:21 Добавление и конфигурация обработчика ошибок
01:25:40 Заключение
Ссылка на Github репозиторий https://github.com/proselytear/webfluxsecurity
источник
👉@BookJava
00:00:00 Введение
00:00:20 Создание проекта
00:11:36 Создание миграций БД
00:15:40 Создание базовых классов
00:23:20 Реализация логики генерации JWT токена
00:46:30 Реализация логики валидации JWT токена
00:53:05 Построения цепочки аутентификации
01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
01:12:11 Реализация REST контроллеров
01:23:15 Проверка REST API средствами Postman
01:24:21 Добавление и конфигурация обработчика ошибок
01:25:40 Заключение
Ссылка на Github репозиторий https://github.com/proselytear/webfluxsecurity
источник
👉@BookJava
👍7❤3🔥3