Java библиотека
31.6K subscribers
2.32K photos
77 videos
8 files
2.05K links
Книги, статьи, мемы и многое другое для Java программиста!

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
⌨️ Управление доступом к членам класса

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

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

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

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

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

public
Указывает, что доступ возможен отовсюду.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍176🔥5
Где можно использовать префиксные деревья?
При реализации множеств и ассоциативных массивов.

А где можно посмотреть, как выполняется алгоритм ассоциативного массива на основе префиксного дерева?
На нашем открытом онлайн-уроке!

Мы выполним визуальное тестирование загрузкой 2000 слов в массив англо-русского словаря

Вебинар «Префиксное дерево» проведёт Евгений Волосатов, программист БД с 25-летним опытом

👨‍💻🛠👨🏻‍💻 Будет интересно: junior-разработчикам на любых языках программирования

🗓 7 октября, 20:00 МСК
Бесплатно в рамках старта курса «Алгоритмы и структуры данных»

➡️ Записаться на открытый урок: https://vk.cc/cBQEyx

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
7👍6🔥2
Forwarded from Java Guru 🤓
Что такое абстрактные классы?

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

@javatasks #java
👍1911🔥5
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> и результат выводится на экран.
👍137🔥4🎅1
Priority Queue

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

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

PriorityQueue не поддерживает изменение приоритета элемента после добавления.
👍148🔥6
🚫 Ключевые проблемы многопоточности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍235🔥3
Механизм try-with-resources

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

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

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

В этом примере в блоке try создаются объекты FileReader и BufferedReader для чтения данных из файла.
После завершения блока try оба ресурса будут автоматически закрыты, даже если произойдет исключение.
219👍8🔥3
👩‍💻 «Знакомство со Spring Cloud».

Приглашаем на открытый урок, где мы разберем:

✔️ что такое Spring Cloud и для чего он нужен;
✔️ из каких основных компонентов состоит Spring Cloud;
✔️ как использовать ключевые функции Spring Cloud для разработки.

🗓 10 октября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional»

🔗 Ссылка на регистрацию : https://vk.cc/cCcwaC

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3🔥2
Сравнение через equals() и ==

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

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

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

@javalib #java
👍225🔥2
🔼 Топ-5 способов улучшить производительность API:

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

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

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

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

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

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

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥4
Всем, кто связан с разработкой, архитектурой или управлением IT-проектами!
Хотите создавать решения, которые выдерживают сотни тысяч RPS?


14 октября специалист по высоконагруженным сервисам в крупном банке расскажет про обучение на онлайн-курсе «Архитектор высоких нагрузок» в OTUS.

Вы узнаете:
- о программе обучения на курсе «Архитектор высоких нагрузок»
- о том, какой уровень знаний необходим для поступления на курс
- о перспективах самой профессии
- о ваших перспективах в качестве архитектора высоких нагрузок

Также вы увидите проектные работы выпускников курса.

🗓 14 октября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Highload Architect»

🔴 Записаться на открытый урок: https://vk.cc/cCdk0N

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍43🔥2
shutdown hook

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

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

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


@javalib #java
👍16🔥74
🤫 Секреты эффективной работы с 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.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥65
Forwarded from Java Guru 🤓
Какой будет результат?
🔥114👍4
unmodifiableMap

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

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


@javalib #java
👍146🔥3
Forwarded from Axiom JDK
​​Сенсация для разработчиков! Axiom JDK теперь доступен для свободной загрузки 🎉

Мы услышали вас и сделали это реальностью. Теперь каждый Java-разработчик в России может легко загрузить Axiom JDK, чтобы создавать свои проекты и домашние разработки, тестировать идеи и проводить эксперименты на отечественном инструменте мирового уровня.

Для разработки и демо доступны все LTS-версии Java (8, 11, 17, 21) и актуальная JDK 23, поддерживаются Windows, macOS и Linux. С регулярными обновлениями и полной документацией.
Загружайте прямо сейчас в личном кабинете разработчика:

lk.axiomjdk.ru

#Обновление_AxiomJDK
👍235🔥4
charBuffer

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

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

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


@javalib #java
👍155🔥4
Хотите узнать, как превратить массив в пирамиду и ускорить сортировку данных?

Ждем вас на бесплатном вебинаре 14 октября в 20:00 мск, где мы разберем:

- как реализовать алгоритм сортировки выбором с линейной сложностью;
- как превратить массив в пирамиду (кучу) для быстрого доступа к максимальному элементу;
- как создать алгоритм пирамидальной сортировки с квазилинейной сложностью — О(N log N);
- визуальные примеры работы алгоритма на конкретных числах.

🚀 Спикер Евгений Волосатов — программист баз данных и преподаватель с огромным и разнообразным опытом, автор статей и учебных программ по C#, Java, PHP.

Встречаемся в преддверии старта курса «Алгоритмы и структуры данных». Все участники вебинара получат специальную цену на обучение!

Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cCxj28

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍53🔥2
🕯 Паттерн Factory Method (Фабричный метод)

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

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

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

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

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

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

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

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

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍185🔥3