Библиотека Java разработчика
10.8K subscribers
1.14K photos
564 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
14 советов по высокопроизводительной персистентности в Java

В этой статье я расскажу вам о различных советах по оптимизации высокопроизводительной Java Persistence, которые помогут вам получить максимальную отдачу от уровня доступа к данным.

Для создания высокопроизводительного уровня доступа к данным требуется много знаний о внутреннем устройстве баз данных, JDBC, JPA, Hibernate, и в этой статье обобщены некоторые из наиболее важных приемов, которые можно использовать для оптимизации корпоративного приложения.

https://vladmihalcea.com/14-high-performance-java-persistence-tips/

👉@BookJava
👍4
Как легко перейти с Java на Rust: Особенности и советы

После работы над двумя коммерческими проектами на Rust я получил хороший практический опыт в этом языке. Это были backend сервисы для веб-приложений, где Rust использовался для основной бизнес-логики и работы с базами данных.

Кроме того, я создал три open source библиотеки на Rust, которые публиковал на GitHub. Это позволило мне лучше изучить идиоматичный Rust, работу с асинхронностью и т. д.

В целом, после работы над этими проектами у меня как Java-разработчика накопился интересный опыт, которым хотелось бы поделиться для тех, кто только начинает изучать Rust, приходя из мира Java. Далее я привожу несколько полезных советов, которые помогут в переходе на Rust.

https://habr.com/ru/articles/756984/

👉@BookJava
💩8👍5
Media is too big
VIEW IN TELEGRAM
Java. Проблема с null. Null safety

В этом видео я рассказываю о проблеме с null в языке программирования Java, из-за которой возникает печально известное NullPointerExeption. Даю некоторые рекомендации по организации кода для борьбы с этой проблемой и повышения надежности работы программ.

источник

👉@BookJava
👍6
Media is too big
VIEW IN TELEGRAM
Точки соприкосновения: Java & GC
Дмитрий Силин

Разберемся, как вместе уживаются Java-приложение и garbage collector (GC). Какие механизмы позволяют организовать Stop-the-World (STW) режим. Рассмотрим, что такое safepoint и checkpoint. Какие потоки останавливаются, а какие могут продолжить работу. Как GC находит объекты, и как поток приложения обнаруживает изменения, сделанные сборщиком мусора.

Далее перейдем к базовому механизму concurrent режима — барьерам. Что это такое, какие бывают. Рассмотрим, как они попадают в код, на примере интерпретатора. Разберем 2 примера барьеров — read и pre-write, на которых построен concurrent marking в реальных сборщиках мусора. Изучим опыт разработчиков JVM по оптимизации барьеров — colored pointers, self-healing. В заключение сравним STW и concurrent подходы.

источник

👉@BookJava
👍41
Совет по Java Time

Обратите внимание на equals() и isEqual() в классах работы с датой и временем! ZonedDateTime, OffsetDateTime и OffsetTime ведут себя по-разному:

- equals(): Сравнивает все поля (включая зону/смещение)
- isEqual(): Сравнивает только момент времени (игнорируя зону/смещение)

Один и тот же момент времени может дать разные результаты.


👉@BookJava
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Знали ли вы, что вы можете перетащить класс или запись #Java в @vaadin Copilot, чтобы автоматически сгенерировать для него форму? Теперь вы знаете

👉@BookJava
👍7
Как работает механизм CyclicBarrier и когда его следует использовать?

CyclicBarrier — это синхронизирующий механизм из библиотеки
java.util.concurrent в Java, который позволяет нескольким потокам остановиться в определенной точке выполнения до тех пор, пока все потоки не достигнут этой точки. После того, как все потоки достигают барьера, они могут продолжить выполнение. Этот механизм часто используется, когда нужно координировать действия группы потоков, чтобы они начинали выполнение следующего этапа одновременно.

Основные характеристики и работа:
1. Количество потоков: CyclicBarrier создается с числом потоков (или "участников"), которые должны достичь барьера. Пока не все участники достигнут барьера, они будут ожидать.

2. Метод `await()`: Каждый поток вызывает метод await() на объекте CyclicBarrier. Это указывает, что данный поток достиг барьера и должен ждать остальных. Как только все потоки вызовут этот метод, барьер "открывается", и все потоки продолжают выполнение.

3. Повторное использование (цикличность): После того, как все потоки проходят через барьер, он может быть использован повторно, поэтому и называется "циклическим". Это удобно для сценариев, где есть многократные синхронизации потоков на разных этапах выполнения программы.

4. Фаза действия: CyclicBarrier может быть настроен так, чтобы выполнять определенное действие (заданный `Runnable`) один раз, когда все потоки достигают барьера. Это полезно для выполнения дополнительной работы после завершения синхронизации.

Пример использования:


import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
public static void main(String[] args) {
int numThreads = 3;
CyclicBarrier barrier = new CyclicBarrier(numThreads, new Runnable() {
@Override
public void run() {
System.out.println("Все потоки достигли барьера. Выполняем действие.");
}
});

for (int i = 0; i < numThreads; i++) {
new Thread(new Task(barrier)).start();
}
}
}

class Task implements Runnable {
private CyclicBarrier barrier;

public Task(CyclicBarrier barrier) {
this.barrier = barrier;
}

@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " выполняет работу.");
Thread.sleep(1000); // Симуляция работы
System.out.println(Thread.currentThread().getName() + " достиг барьера.");
barrier.await(); // Ожидание остальных потоков
System.out.println(Thread.currentThread().getName() + " продолжает выполнение.");
} catch (Exception e) {
e.printStackTrace();
}
}
}


Когда использовать CyclicBarrier:
1. Координация этапов: Если нужно, чтобы несколько потоков выполнили этап работы и затем продолжили к следующему этапу только после того, как все потоки завершат текущий.

2. Параллельные вычисления: В задачах, где нужно разделить большую работу на части, которые обрабатываются параллельно, а затем необходимо синхронизировать результаты перед следующей фазой.

3. Многократные барьеры: Если требуется многократная синхронизация в течение выполнения задачи (например, при итерациях параллельного алгоритма).

Отличие от CountDownLatch:
- CyclicBarrier можно использовать многократно, в то время как CountDownLatch работает один раз.
- CyclicBarrier ожидает определенного числа потоков, тогда как CountDownLatch уменьшается каждый раз при вызове countDown(), независимо от того, каким потоком это было вызвано.

👉@BookJava
👍75
Запуск однофайловых программ с исходным кодом

В JDK 11 Java представила возможность запускать программу из одного файла исходного кода с помощью команды java, без необходимости сначала явно компилировать исходный код. Это работает за счёт того, что команда java автоматически вызывает компилятор и сохраняет скомпилированный код в памяти. Это может быть отличным способом изучать Java или исследовать новые возможности в API Java, не проходя через процесс компиляции и последующего выполнения кода. Существует несколько способов использования этой функции, а также некоторые ограничения, которые нужно иметь в виду.

https://dev.java/learn/single-file-program/

👉@BookJava
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Если у вас есть конфликты при мерже, не волнуйтесь!

Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips

👉@BookJava
👍6
Шпаргалка по паттернам проектирования

👉@BookJava
👍82
This media is not supported in your browser
VIEW IN TELEGRAM
Бесплатное IT-образование в 2024

Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления

Выбирайте нужное и подписывайтесь:

👩‍💻 Java: @Java_Iibrary
👩‍💻 Моб. разработка: @MobDev
👩‍💻 Frontend: @FrontendPortal
⚙️ Backend: @BackendPortal
📱 GitHub: @git_developer
🤓 Книги айти: @portalToIT
👩‍💻 Python: @PythonPortal
👩‍💻 C#: @KodBlog
👩‍💻 С/С++: @Cpportal
🖥 Базы Данных & SQL: @SQL
👩‍💻 Golang: @juniorGolang
👩‍💻 PHP: @PHPortal
👩‍💻 Разработка игр: @GameDevgx
👩‍💻 DevOps: @loose_code
🖥 Data Science: @DataSciencegx
🤔 Хакинг & ИБ: @cybersecinform
🐞 Тестирование: @QAPortal
📱 Маркетинг: @MarketingPortal
🖥 Дизайн: @PortalToDesign

➡️ Сохраняйте себе, чтобы не потерять
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
🚀 Советы по Java 🚀

Компактный конструктор в записях (Records)

Компактная форма помогает разработчикам сосредоточиться на проверке и нормализации параметров, без утомительной работы по присваиванию параметров полям. 🔥

👉@BookJava
👍6🤔2
Полнотекстовый поиск в java приложениях с помощью Elasticsearch

Рассмотрим, как использовать Elasticsearch в качестве поискового движка в приложениях на Spring Boot. Поговорим о стратегии реализации полнотекстового поиска, эффективной индексации сущностей JPA и их связей. Уделим внимание использованию аннотаций полей, настройке релевантности с помощью весовых коэффициентов и реализации нечёткого поиска для обработки вариаций запросов. Также обсудим методы
настройки синонимических связей, многоуровневых фильтров и ранжирования результатов по релевантности для повышения качества поиска.

https://habr.com/ru/companies/rostelecom/articles/851658/

👉@BookJava
👍5🔥3
Виртуальные потоки: революционное решение для параллелизма

Несмотря на то, что платформе Java почти 30 лет, она стабильно остаётся одной из трёх самых популярных языков программирования. Эта продолжающаяся популярность обусловлена виртуальной машиной Java (JVM), которая абстрагирует такие сложности, как управление памятью, и компилирует код во время выполнения, обеспечивая непревзойдённую масштабируемость на уровне интернета.

Долговременная актуальность Java также объясняется быстрым развитием языка, его библиотек и JVM. Виртуальные потоки Java, представленные в проекте Loom, инициативе сообщества OpenJDK, знаменуют собой революционное изменение в том, как Java справляется с параллелизмом.


Запускает 10 000 platform threads


public class PlatformThreadCreationTimeAnalyzer {

private static class Task implements Runnable {

@Override
public void run() {
System.out.println("Hello! I am a Platform Thread");
}
}

public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
for (int counter = 0; counter < 10_000; ++counter) {
new Thread(new Task()).start();
}
System.out.print("Platform Thread Creation Time: " + (System.currentTimeMillis() - startTime));
}
}


https://dzone.com/articles/deep-dive-into-java-virtual-threads-a-game-changer

👉@BookJava
👍52
Улучшенный цикл for

Этот цикл кратко выполняет итерацию по коллекциям.


int[] numbers = {1, 2, 3, 4, 5};

for (int number : numbers) {

System.out.println(number);
}


👉@BookJava
👍7💩1
Манипуляции со строками с помощью StringBuilder

Используйте StringBuilder для частых изменений, чтобы избежать создания новых объектов String.


StringBuilder message = new StringBuilder(“Hello”);

message.append(“ World!”);

System.out.println(message); // Output: Hello World!


👉@BookJava
6👏4🫡2
Как жить без IntelliJ IDEA? Часть №1. Собери сам

На российском рынке сложилась сложная ситуация с IDE для Java-разработчиков. Новости, связанные с ограничением скачивания IntelliJ IDEA Ultimate, недоступностью JetBrains маркетплейса и блокировкой лицензий, которые использовались на территории РФ порождают огромное количество вопросов, на которые не у всех есть ответы.

Команда Spring АйО подготовила цикл статей, в которых постарается ответить на все вопросы, связанные с уходом IntelliJ IDEA из России.

https://habr.com/ru/companies/spring_aio/articles/852526/

👉@BookJava
👍3😁21🔥1
Проверка на null с помощью Optional

Optional помогает избежать NullPointerExceptions.


String name = "Alice";
Optional<String> maybeName = Optional.ofNullable(name);
System.out.println(maybeName.orElse("Nobody")); // Output: Alice


👉@BookJava
👍10🤨1
Подчеркивания в числовых литералах (Java SE 7+):

Улучшите читаемость с помощью подчеркиваний в числах.


long largeNumber = 123_456_789L;
System.out.println(largeNumber); // Output: 123456789


👉@BookJava
👍5