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

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
🕯 Паттерн Iterator (Итератор)

Iterator — это поведенческий паттерн, который позволяет последовательно обходить элементы коллекции, не раскрывая ее внутреннюю структуру. Он обеспечивает единый интерфейс для работы с различными типами коллекций.

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

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

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

1️⃣ Упрощает работу с коллекциями, позволяя обходить их элементы через единый интерфейс, независимо от внутренней структуры.
2️⃣ Реализует принцип единственной ответственности, отделяя логику обхода от структуры данных.
3️⃣ Упрощает добавление новых способов обхода коллекции без изменения её кода.

Недостатки:

1️⃣ Могут возникать сложности при синхронизации, если коллекция изменяется в процессе итерации.
2️⃣ Может потребоваться создание множества различных классов итераторов для каждого типа коллекции, что увеличивает сложность системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍6🔥4
System.nanoTime

System.nanoTime() возвращает текущее время в наносекундах.

Этот метод используется для измерения продолжительности выполнения небольших фрагментов кода.

В отличие от System.currentTimeMillis(), который возвращает время в миллисекундах, nanoTime() имеет более высокое разрешение и позволяет измерять очень короткие промежутки времени.

nanoTime() часто используется для:

— Замеров производительности.
— Измерения задержек в мультитрединге.
— Микробенчмаркинга.
— Определения интервалов между событиями в реальном времени.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🔥3
🔑 Encoding vs Encryption vs Tokenization: основные отличия

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

🟢Кодирование
Кодирование переводит данные в другой формат по легко обратимой схеме. Например, Base64 кодирует бинарные данные в текстовый формат для упрощения передачи через текстовые каналы. Кодирование не обеспечивает защиту данных, так оно легко обратимо без ключа.

🟢Шифрование
Шифрование преобразует данные с помощью алгоритмов и ключей. Бывает симметричным (один ключ) и асимметричным (разные ключи). Оно защищает данные, превращая их в нечитаемый формат, который можно расшифровать только с правильным ключом.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥54
Метод Math.random()

Используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.

Выше приведен пример выбора случайного числа в диапазоне от 0 до 10.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥3😁2
🕯 Паттерн Observer (Наблюдатель)

Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на изменения состояния других объектов. Наблюдатель предоставляет гибкую систему взаимодействия между объектами, исключая жесткую связанность.

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

🟢Когда нужно оповещать несколько объектов об изменениях состояния другого объекта.
🟢Когда важно обеспечить слабую связанность между компонентами системы.
🟢При разработке систем, где одни объекты должны реагировать на изменения в других, без жёсткой привязки.

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

1️⃣ Обеспечивает слабую связанность между объектами.
2️⃣ Упрощает динамическое добавление новых наблюдателей без изменения кода субъекта.
3️⃣ Позволяет множеству объектов реагировать на события.

Недостатки:

1️⃣ Может приводить к большим накладным расходам при большом количестве наблюдателей.
2️⃣ Потенциальная сложность отладки из-за непредсказуемого порядка оповещения.
3️⃣ Может возникнуть ситуация, когда наблюдатели получают неконсистентное состояние.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5🔥5
🤯 Зачем велосипеду Kafka?

Команда Яндекс Еды опубликовала мощный лонгрид о разработке своего умного электровелосипеда. Главная фишка — можно прямо в браузере покрутить детализированную 3D-модель и кликнуть на любой узел, от IoT-модуля до батареи, чтобы прочитать, как он устроен.

Что интересного в самой статье:

Как справляются с потоком в 10 000 сообщений в секунду от тысяч велосипедов, используя связку MQTT и Kafka.
Как байк определяет свою геолокацию без GPS и как курьер может разблокировать его по Bluetooth, если пропал интернет.
Как устроен весь пайплайн: от IoT-модуля на самом велосипеде до облачных сервисов и интеграции с приложением Яндекс Про.

Отличный кейс для всех, кто работает с IoT и высоконагруженными системами.
9🔥6👍2
Тип Optional

Тип Optional используется для представления возможности отсутствия значения. Он обертывает другой тип данных и может содержать либо значение этого типа, либо быть пустым (null).

Этот код создает Optional объект, который может содержать строку. Если строка доступна, она будет возвращена; в противном случае будет возвращено значение «Default Value».

Использование Optional способствует более чистому и безопасному коду при работе с возможно отсутствующими значениями.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍5🔥3
Media is too big
VIEW IN TELEGRAM
Java. Исключение ConcurrentModificationException.

В видео рассматривается, что из себя представляет исключение ConcurrentModificationException, и в каких случаях оно выбрасывается.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍134🔥3
Введение в CompletableFuture

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

CompletableFuture — это расширение интерфейса Future, которое упрощает работу с асинхронными вычислениями. В отличие от стандартного Future, он позволяет:

▪️ Запускать задачи асинхронно;
▪️ Комбинировать несколько задач;
▪️ Обрабатывать ошибки без try-catch;
▪️ Строить цепочки зависимостей.

Пример создания асинхронной задачи:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// Эмуляция долгой задачи
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Задача завершена!";
});

System.out.println(future.join()); // Ожидание завершения и получение результата


Здесь задача выполняется в фоновом потоке, а основной поток продолжает свою работу.

🎮 Комбинирование нескольких задач

Часто нужно дождаться завершения нескольких задач и собрать их результаты. С помощью thenCombine() можно комбинировать результаты нескольких асинхронных вычислений:

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 50);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);

CompletableFuture<Integer> result = future1.thenCombine(future2, Integer::sum);

System.out.println(result.join()); // 70


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

Обработка ошибок

Одним из главных преимуществ CompletableFuture является возможность обрабатывать ошибки без try-catch через метод exceptionally():

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Ошибка!");
return 42;
}).exceptionally(ex -> {
System.out.println("Произошла ошибка: " + ex.getMessage());
return 0; // Возвращаем дефолтное значение в случае ошибки
});

System.out.println(future.join()); // 0


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

📎 Композиция цепочек

Вы можете строить целые цепочки задач с помощью методов thenApply(), thenAccept() и т.д. Пример использования:

CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + " World")
.thenAccept(finalResult -> System.out.println(finalResult)); // Hello World


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

🛠 Применение на практике

CompletableFuture идеально подходит для задач, требующих асинхронности: запросы к API, обработка данных в фоне и т.д. Пример с вызовом нескольких API параллельно:

CompletableFuture<String> api1 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса к первому API
return "Response from API 1";
});

CompletableFuture<String> api2 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса ко второму API
return "Response from API 2";
});

CompletableFuture<Void> allOf = CompletableFuture.allOf(api1, api2);

allOf.thenRun(() -> {
try {
System.out.println(api1.get() + " & " + api2.get());
} catch (Exception e) {
e.printStackTrace();
}
});

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
19👍11🔥5
Интерфейс BlockingQueue

Интерфейс BlockingQueue используется для реализации очередей с блокировками.
Он позволяет безопасно работать с очередью из нескольких потоков.

Основные методы:
add(E e) — добавляет элемент в очередь, может выбросить исключение если очередь переполнена.
offer(E e) — добавляет элемент в очередь, возвращает false если очередь переполнена.
put(E e) — добавляет элемент в очередь, блокирует поток если очередь переполнена.
take() — извлекает и удаляет элемент из очереди, блокирует поток если очередь пуста.
poll() — извлекает и удаляет элемент из очереди, возвращает null если очередь пуста.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍9🔥3
Media is too big
VIEW IN TELEGRAM
Java Reflection - Ваш ключ к пониманию Java-разработки.

В этом видео автор расскажет про рефлексию в Java — мощный инструмент для работы с кодом во время выполнения программы. Мы рассмотрим, как с помощью рефлексии можно управлять полями, методами и конструкторами классов, не зная их заранее. Он покажет примеры того, как получить доступ к приватным полям и методам, а также как использовать рефлексию для вызова методов и изменения значений полей на лету.
Если вы хотите узнать, как рефлексия используется в популярных фреймворках, таких как Spring, и как она помогает создавать гибкие и расширяемые приложения, то это видео для вас!


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥7👍6
👀 Задачи с собеседований: Сортировка пузырьком (jun)

- Расскажите про сортировку пузырьком и реализуйте её.

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

💡 Ключевые моменты:

▪️ Худший случай: O(n^2)
▪️ Используется строго для небольших наборов данных.

Реализация на картинке 👆

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍85😁1
Блокирующий метод

Блокирующий метод (blocking method) — это метод, который приостанавливает выполнение текущего потока и ждет определенного события или условия.
Они используются для синхронизации потоков, например при работе с сетью или файлами.

При вызове блокирующего метода поток переходит в состояние ожидания и не выполняет других операций.

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

Например, метод readLine() блокирует поток до тех пор, пока пользователь не введет строку и не нажмет Enter.
После ввода данных метод возвращает управление потоку и программа выводит введенную строку.

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


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍9🔥4
Принципы SOLID

Как разработчики, мы стремимся к тому, чтобы наш код был поддерживаемым, масштабируемым и готовым к изменениям. Один из способов достичь этого — следовать принципам SOLID. Эти пять принципов проектирования помогают создавать системы, которые легко понимать и поддерживать, что ведет к более чистому и надежному коду.

Рассмотрим каждый принцип:

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

2️⃣ Принцип открытости/закрытости (O)
Классы должны быть открыты для расширения, но закрыты для изменения. Это значит, что поведение класса можно расширять, не изменяя его существующий код. В Java это часто реализуется через использование интерфейсов или абстрактных классов.

3️⃣ Принцип подстановки Барбары Лисков (L)
Объекты суперкласса должны заменяться объектами подкласса без нарушения корректности программы. В Java это особенно важно при работе с наследованием, чтобы подклассы правильно расширяли базовые классы, не изменяя их поведение.

4️⃣ Принцип разделения интерфейса (I)
Клиенты не должны зависеть от интерфейсов, которые они не используют. В Java это достигается путем разделения крупных интерфейсов на более узкоспециализированные, чтобы классы реализовывали только те методы, которые им действительно нужны.

5️⃣ Принцип инверсии зависимостей (D)
Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. В Java это часто реализуется через внедрение зависимостей (Dependency Injection), которое позволяет передавать зависимости извне, что способствует слабой связности и гибкости системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍206🔥4
Метод isPowerOfTwo()

Метод isPowerOfTwo() используется для проверки, является ли число степенью двойки.

Этот метод полезен при работе с битовыми операциями и оптимизации алгоритмов.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍24🔥65😁1