Java библиотека – Telegram
Java библиотека
31.5K subscribers
2.37K photos
89 videos
9 files
2.17K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Media is too big
VIEW IN TELEGRAM
Знакомство с Armeria

На примере приложения с TINKOFF INVEST API познакомимся с фреймворком Armeria.

🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥2
🗑 Понимание различных сборщиков мусора в Java:

🟢Serial Garbage Collector: Лучший вариант для однопоточных приложений с небольшими кучами. Он использует один поток для выполнения как малых, так и больших сборок мусора, что приводит к значительным паузам, но минимальной нагрузке на систему.

🟢Parallel Garbage Collector: Подходит для приложений с высокими требованиями к пропускной способности. Использует несколько потоков для выполнения как малых, так и больших сборок мусора, уменьшая время пауз, но при этом увеличивая использование CPU.

🟢Concurrent Mark-Sweep (CMS) Garbage Collector: Разработан для минимизации пауз за счёт выполнения основной части работы по сборке мусора параллельно с выполнением приложений. Подходит для приложений, где критически важна низкая задержка.

🟢G1 Garbage Collector: Сбалансированный сборщик мусора, который стремится обеспечить предсказуемое время пауз, разделяя кучу на регионы и выполняя сборку мусора поэтапно. Является хорошим выбором по умолчанию для большинства приложений.

🟢Z Garbage Collector и Shenandoah: Сборщики мусора с ультранизкой задержкой, разработанные для работы с большими кучами. Основная часть работы по сборке мусора выполняется параллельно, что позволяет минимизировать время пауз даже при очень больших кучах.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍9🔥3
🖥 Что такое ElasticSearch

Elasticsearch — открытая распределенная система управления данными и поиска по ним, основанная на поисковом движке Apache Lucene.

Он предоставляет мощные возможности по индексированию, хранению, поиску и анализу больших объемов информации в реальном времени.

Он идеально подходит для приложений, требующих гибкости в поиске и высокой скорости обработки запросов. Благодаря интеграции с Kibana и Logstash, ElasticSearch становится мощным инструментом для мониторинга и анализа данных в реальном времени.

📌 Функции:

🔘Мгновенный поиск по большим объемам данных
🔘Гибкая схема индексации и поиска
🔘Легкость в масштабировании и интеграции

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5🔥3
Вам наверняка понравится этот инструмент, если работаете с JSON 👇

Вложенные JSON-файлы часто сложно читать.
𝐉𝐬𝐨𝐧𝐂𝐫𝐚𝐜𝐤 создает графические диаграммы из JSON-файлов и делает их легко читаемыми.
Кроме того, созданные диаграммы можно скачать в виде изображений.
Также поддерживает YAML и XML.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥63❤‍🔥1
Kotlin. Паттерны проектирования и лучшие практики, 3-е изд. (2025) PDF, ePUB

Руководство позволит разработчикам, интересующимся паттернами проектирования в Kotlin, применить свои знания на практике. В книге рассматриваются классические и современные паттерны проектирования, демонстрируются практические подходы к их реализации и соответствующие методологии.

Третье издание содержит актуальные обновления Kotlin, начиная с версии 1.6, и предлагает углубленное обсуждение таких тем, как структурированная конкурентность и контекстные приемники. Книга начинается с описания базового синтаксиса Kotlin и важности паттернов проектирования, в том числе классических порождающих, структурных и поведенческих паттернов. Затем она переходит к представлению средств функционального программирования и паттернов реактивной и конкурентной обработки, включая корутины и структурированную конкурентность. Знакомясь с этими продвинутыми концепциями, вы будете совершенствовать навыки программирования на Kotlin.
👍15🔥63
Метод dropWhile был введен в интерфейсе Stream в JDK 9. Этот метод позволяет пропускать элементы в начале потока данных, пока они удовлетворяют определенному условию, и возвращает новый поток, начиная с первого элемента, который не соответствует условию.

В примере метод dropWhile используется для пропуска элементов в потоке до тех пор, пока они меньше 0. После первого элемента, не соответствующего условию, оставшиеся элементы добавляются в новый поток.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥43
⌨️ Управление доступом к членам класса

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

Существует 4 уровня доступа:

🟢private
Указывает, что доступ возможен только в его собственном классе.

🟢package-private (нет явного модификатора)
Указывает, что доступ только внутри своего собственного пакета.

🟢protected
Указывает, что доступ возможен только внутри его собственного пакета (как в случае с package-private) и, кроме того, для подкласса его класса в другом пакете.

🟢public
Указывает, что доступ возможен отовсюду.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍176🔥3
Что такое абстрактные классы?

Абстрактные классы — это классы, которые не могут быть инстанциированы напрямую, то есть нельзя создать объект абстрактного класса при помощи оператора new. Они предназначены для обеспечения базовой структуры и функциональности для других классов, которые наследуются от них. Абстрактные классы представляют собой в некотором роде «заготовки» для подклассов, указывая на общие атрибуты и методы, которые они должны реализовать.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127🔥6
Cartesian product

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

Например, если у нас есть две коллекции: A = {1, 2, 3} и B = {a, b}, то произведение A и B будет выглядеть следующим образом:

{(1, a), (1, b), (2, a), (2, b), (3, a), (3, b)}

Таким образом, мы получаем шесть возможных пар элементов из коллекций A и B.

В этом примере мы создаем две коллекции и используем два вложенных цикла для создания cartesian product. Созданное произведение сохраняется в коллекцию cartesianProduct типа List> и результат выводится на экран.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥4
Priority Queue

PriorityQueue — это коллекция, которая хранит элементы в соответствии с их приоритетом.
Реализует очередь на базе кучи (heap) и используется в ситуациях, когда необходимо обрабатывать или получать элементы в определенном порядке.

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

PriorityQueue не поддерживает изменение приоритета элемента после добавления.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127🔥5
🚫 Ключевые проблемы многопоточности

🔵 Состояние гонки (Race Conditions):

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

🔵 Взаимные блокировки (Deadlocks):

Ситуация, когда два или более потока застревают в ожидании друг друга для освобождения ресурсов, что приводит к тупиковой ситуации.
Пример: Два человека держат предметы, которые нужны друг другу, и оба ждут, пока другой первый отдаст свой предмет.

🔵 Ошибки конкуренции (Concurrency Bugs):

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

🔵 Прерывание потока (Thread Interruption):

Основная проблема заключается в том, что сигнал на прерывание лишь уведомляет поток о необходимости остановки, но сам поток должен обработать этот сигнал и завершить свою работу самостоятельно.
Пример: Если вам нужно, чтобы рабочий остановился, вы посылаете ему сигнал "стоп". Но нет гарантий, что это случится.

🔵 Ошибки согласованности памяти (Memory Consistency Errors):

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

🔵 Соперничество за ресурсы (Resource Contention):

Ситуация, когда несколько потоков конкурируют за один и тот же ограниченный ресурс, что приводит к задержкам.
Пример: Если несколько работников одновременно пытаются воспользоваться одним принтером, им приходится ждать своей очереди.

🔵 Голодание (Starvation):

Ситуация, когда потоку постоянно отказывают в доступе к ресурсам из-за приоритета других потоков.
Пример: Если одного работника постоянно обходят вниманием в пользу других, он никогда не сможет выполнить свою работу.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
19👍10🔥6
Механизм try-with-resources

Механизм try-with-resources — это способ автоматического закрытия ресурсов после их использования. Появился этот механизм в Java 7.
Он работает для классов, реализующих интерфейс AutoCloseable (например, потоки), уменьшает количество кода и упрощает обработку исключений.

Ресурсы объявляются в скобках после try и закрываются автоматически по завершении этого блока. Ресурсы закрываются в обратном порядке создания при нормальном или аварийном завершении.

По сравнению с блоком try-catch-finally этот механизм позволяет лаконичнее писать код с автозакрытием ресурсов.

В этом примере в блоке try создаются объекты FileReader и BufferedReader для чтения данных из файла.
После завершения блока try оба ресурса будут автоматически закрыты, даже если произойдет исключение.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍95🔥3
Сравнение через equals() и ==

🟢"==" используется для сравнения примитивных типов данных (например, int, char, boolean), проверяя, равны ли их значения. Однако, когда речь идет об объектах, "==" сравнивает их ссылки, то есть проверяет, указывают ли обе переменные на один и тот же объект в памяти.

🟢Метод equals(), в свою очередь, предназначен для сравнения содержимого объектов. Это значит, что equals() проверяет, эквивалентны ли сами данные, хранящиеся в двух объектах, а не то, ссылаются ли они на одно и то же место в памяти.

Используйте == для сравнения примитивов и ссылок на объекты, когда вам важно знать, являются ли они одной и той же сущностью. Для сравнения содержимого объектов всегда применяйте equals().

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍176🔥3
🔼 Топ-5 способов улучшить производительность API:

1️⃣ Пагинация результатов:
Этот метод используется для оптимизации больших наборов данных путем их постраничной передачи клиенту, что повышает отзывчивость сервиса и улучшает пользовательский опыт.

2️⃣ Асинхронное логирование:
Этот подход предполагает отправку логов в буфер без блокировки и немедленное возвращение управления, вместо того чтобы записывать данные на диск при каждом вызове. Логи периодически сбрасываются на диск, что значительно снижает нагрузку на систему ввода-вывода.

3️⃣ Кэширование данных:
Часто запрашиваемые данные могут храниться в кэше для ускорения их извлечения. Клиенты сначала проверяют кэш перед обращением к базе данных, а такие решения для хранения данных, как Redis, обеспечивают более быстрый доступ благодаря хранению в оперативной памяти.

4️⃣ Сжатие payload:
Чтобы сократить время передачи данных, запросы и ответы можно сжимать, что ускоряет процессы загрузки и выгрузки.

5️⃣ Пул соединений:
Эта техника включает использование пула открытых соединений для управления взаимодействием с базой данных, что снижает накладные расходы, связанные с открытием и закрытием соединений каждый раз, когда требуется загрузить данные. Пул управляет жизненным циклом соединений для эффективного использования ресурсов.

💬 А как вы улучшаете перфоманс API?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍87🔥2💯1
shutdown hook

Shutdown hook позволяет приложению выполнить некоторый код перед завершением приложения.

Для создания hook нужно создать объект класса Thread и передать его в метод addShutdownHook() класса Runtime.
Когда приложение завершается, все заданные hook выполнятся последовательно.

Shutdown hook работает в случае нормального или аварийного завершения приложения и часто используется для освобождения ресурсов, закрытия соединений, сохранения данных.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥95
🤫 Секреты эффективной работы с ArrayList

ArrayList — это один из самых популярных классов для работы с динамическими массивами в Java. Но чтобы использовать его по максимуму, стоит учесть несколько важных моментов:

1️⃣ Уменьшайте количество расширений: Каждый раз, когда ArrayList превышает свою текущую емкость, он создает новый массив большего размера. Это может замедлить работу, особенно при больших объемах данных. Чтобы избежать этого, инициализируйте ArrayList с заранее рассчитанной емкостью, если примерно знаете объем данных.

2️⃣ Избегайте частых вставок и удалений в середине списка: Операции вставки и удаления элементов в середине ArrayList требуют сдвига всех последующих элементов. Если такие операции критичны, рассмотрите использование LinkedList.

3️⃣ Используйте метод trimToSize(): Если ваш ArrayList больше не будет изменяться, вызов метода trimToSize() освободит неиспользуемую память, оптимизируя использование ресурсов.

4️⃣ Итерации важны: Используйте цикл for-each или метод forEach() для итерации по ArrayList. Они обеспечивают более читаемый и безопасный код. Но если нужен доступ по индексу, стандартный цикл for — ваш выбор.

5️⃣ Будьте осторожны с автобоксингом: При работе с примитивными типами, такими как int, ArrayList автоматически упаковывает их в Integer. Это может привести к лишним затратам памяти. Если производительность критична, используйте специализированные классы, такие как IntArrayList из библиотеки fastutil.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1310🔥6
unmodifiableMap

UnmodifiableMap используется для создания неизменяемого представления отображения, это позволяет предоставить доступ к отображению, не давая возможности изменить его.

Как видно из примера, при попытке изменить неизменяемое отображение unmodifiableMap выбрасывается исключение UnsupportedOperationException. Это гарантирует, что исходное отображение не будет случайно изменено.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥3
charBuffer

Метод charBuffer() используется для получения буфера символов из строки. Он принадлежит классу String.

Этот метод возвращает объект CharBuffer, который представляет последовательность символов строки.
CharBuffer позволяет эффективно читать и манипулировать символами строки без создания копий.

В этом примере создается строка «Hello». Затем из этой строки получаем буфер символов методом charBuffer().
В цикле посимвольно читаем из буфера символы и выводим их на экран.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥2
🕯 Паттерн Factory Method (Фабричный метод)

Factory Method — это порождающий паттерн, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.

Использование:

🔹 Когда создание объекта зависит от контекста.
🔹 Для увеличения расширяемости кода, позволяя создавать новые типы продуктов.

Преимущества:

1️⃣ Ослабление связи между кодом и конкретными классами.
Когда вы создаете объект напрямую с помощью new, ваш код жестко привязан к конкретному классу. Если вам нужно будет заменить этот класс другим, придется изменить все места, где он используется. С фабрикой вы работаете через абстракции (интерфейсы или абстрактные классы), а конкретные реализации могут меняться без изменения основного кода.

2️⃣ Упрощение и централизованное управление созданием объектов
Фабрики могут включать сложную логику по созданию объектов, такую как:
▪️ Выбор нужного класса в зависимости от условий.
▪️ Управление жизненным циклом объекта.
▪️ Использование паттернов Singleton или Pooling внутри фабрики.

3️⃣ Поддержка расширяемости и масштабируемости
Используя фабрику, вы легко можете добавлять новые типы продуктов или изменять существующие без необходимости изменять основной код. Это упрощает расширение системы.

4️⃣ Поддержка тестирования
Фабрики облегчают тестирование кода. Вы можете использовать mock-объекты или подменять реализации фабрик для тестов, что упрощает создание тестируемых объектов и проверку кода.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍129🔥5
Реверс массива

Реверс массива в Java означает изменение порядка элементов массива на противоположный. То есть, элементы, которые изначально были в начале массива, становятся в конце, и наоборот.

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


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍97🔥3