Java Developer | Backend
1.7K subscribers
136 photos
1 video
231 links
Авторский канал действующего java разработчика

Платформа: https://offercraft.ru

Сотрудничество @offercraft_support
Download Telegram
🔤 Транзакции в Spring: сила управления данными

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

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Что такое ThreadPool (Часть 1)

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

*️⃣Основные компоненты ThreadPool:

1️⃣ Executor: интерфейс, который определяет метод execute(), используемый для выполнения задач.

2️⃣ ExecutorService: подинтерфейс Executor, который добавляет методы для управления жизненным циклом пула.

3️⃣ ThreadPoolExecutor: конкретная реализация ExecutorService, которая предоставляет расширенные возможности настройки пула потоков.

*️⃣Пример использования ThreadPool с помощью Executors:

Java предоставляет класс Executors, который позволяет легко создать пул потоков. Например, можно создать фиксированный пул потоков с заданным количеством потоков.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
public static void main(String[] args) {
// Создание пула из 5 потоков
ExecutorService executorService = Executors.newFixedThreadPool(5);

// Добавление задач в пул
for (int i = 0; i < 10; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Задача " + taskId + " выполняется в потоке " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // Имитация долгой задачи
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Задача " + taskId + " завершена");
});
}

// Завершение работы пула
executorService.shutdown();
}
}


🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2👏2
Вопрос: Для чего используется Connection pool?
Ответ -
Взаимодействие с базой данных может быть затратным, в отношении открытия и закрытия подключений к базе данных. Особенно, когда число клиентов базы данных увеличивается, эти затраты очень высоки, и потребляется большое количество ресурсов. Пул подключений к базе данных получается при запуске сервером приложений и поддерживается в пуле. Запрос на подключение обслуживается подключением, находящимся в пуле. В конце подключения запрос возвращается в пул и может использоваться для удовлетворения будущих запросов.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Вопрос: Что такое RMI? (Remote Method Invocation)
Ответ -
Java Remote Method Invocation (Java RMI) — это API Java, который выполняет объектно-ориентированный эквивалент удаленных вызовов процедур (RPC) с поддержкой прямой передачи сериализованных классов Java и распределенной сборки мусора. Удаленный вызов методов (RMI) также можно рассматривать как процесс активации метода на удаленно запущенном объекте. RMI обеспечивает прозрачность местоположения, поскольку пользователь чувствует, что метод выполняется на локально запущенном объекте.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Что такое ThreadPool (Часть 2)

Если вам нужно вернуть результат выполнения задачи, вы можете использовать интерфейсы Callable и Future:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolWithCallable {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);

// Создание задачи
Callable<Integer> task = () -> {
Thread.sleep(1000);
return 42; // Возвращаемое значение
};

// Выполнение задачи
Future<Integer> future = executorService.submit(task);

try {
// Получение результата
Integer result = future.get();
System.out.println("Результат задачи: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}

😎Преимущества использования ThreadPool:

1️⃣Улучшение производительности: Переиспользование потоков снижает накладные расходы на создание и уничтожение потоков.

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

3️⃣Упрощение кода: Упрощает управление многопоточностью, так как разработчику не нужно заботиться о создании и управлении потоками вручную.

*️⃣Заключение

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

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🔤 Один день из жизни JVM-инженера

Почему JVM-инженеры всё так медленно делают? На каком языке стоит писать рантайм, а на каком компилятор? Как «папка бога» в Windows привела к неожиданным последствиям? Может ли «обычный джавист» стать JVM-инженером?

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
Leetcode. Задача 318. Maximum Product of Word Lengths. (medium)

Дан массив строк words, верните максимальное значение произведения длины word[i] на длину word[j], где два слова не имеют общих букв. Если таких двух слов не существует, верните 0.

Пример:
Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".


👨‍💻 Алгоритм:

1️⃣Предварительная обработка масок и длин
Вычислите битовые маски для всех слов и сохраните их в массиве masks. Сохраните длины всех слов в массиве lens.

2️⃣Сравнение слов и проверка общих букв
Сравните каждое слово с каждым последующим словом. Если два слова не имеют общих букв (проверка с использованием масок: (masks[i] & masks[j]) == 0), обновите максимальное произведение maxProd.

3️⃣Возврат результата
Верните максимальное значение произведения maxProd.

😎 Решение:
class Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] masks = new int[n];

for (int i=0; i<n; i++)
for (char c: words[i].toCharArray())
masks[i] |= (1 << (c - 'a'));

int largest = 0;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if ((masks[i] & masks[j]) == 0)
largest = Math.max(largest, words[i].length() * words[j].length());

return largest;
}
}


🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Вопрос: Что такое URL-кодирование и URL-декодирование?
Ответ -
Процедура URL-кодирования отвечает за замену всех пробелов и всех других дополнительных специальных символов URL-адреса на их соответствующее шестнадцатеричное представление. Соответственно, URL-декодирование — это прямо противоположная процедура.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
🔤 Знакомство с АОП

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

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Please open Telegram to view this post
VIEW IN TELEGRAM
4😁4👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔤 «Почему Kotlin хуже, чем Java?»

В данной статье рассказывается о сравнении java и kotlin, а так же почему стоит использовать java вместо kotlin

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Дорогие подписчики! ☃️
Поздравляю вас с новым годом! 🍭 Желаю вам новых профессиональных побед, интересных событий, финансового благополучия и крепкого здоровья в новом году! 🧦🔴🎁🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥3👍2
Использование PreparedStatement для предотвращения SQL-инъекций

При работе с базами данных в Java, использование PreparedStatement является предпочтительным методом по сравнению с обычным Statement. Это связано с тем, что PreparedStatement помогает предотвратить SQL-инъекции и улучшает производительность за счет предварительной компиляции SQL-запросов.

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

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JdbcPreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3000/mydatabase";
String user = "username";
String password = "password";

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";

try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, "newuser");
pstmt.setString(2, "securepassword");
pstmt.executeUpdate();

System.out.println("User added successfully!");

} catch (SQLException e) {
e.printStackTrace();
}
}
}


Использование PreparedStatement не только защищает ваше приложение от SQL-инъекций, но и улучшает читаемость кода. Это особенно важно при работе с пользовательскими данными.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👏1
🔤 Люди не понимают ООП

Похоже, многим не нравится объектно-ориентированное программирование. Первое, что приходит в голову, когда слышишь эту трёхбуквенную аббревиатуру — это пример с автомобилем, наследование, геттеры, сеттеры и ObjectFactoryFactorySingleton.

Мне это всегда казалось довольно странным. Мне не только нравится ООП, я ещё и считаю, что часто это лучший/наиболее очевидный способ моделирования задачи. И ниже я расскажу, почему.


🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1🔥1
Leetcode. Задача 523. Continuous Subarray Sum. (medium)

Дан целочисленный массив nums и целое число k. Верните true, если в nums есть подходящий подмассив, или false в противном случае.

Подходящий подмассив — это подмассив, который:
*️⃣имеет длину не менее двух;
*️⃣сумма элементов подмассива является кратной k.

Учтите:

Подмассив — это непрерывная часть массива.
Целое число x является кратным k, если существует целое число n такое, что x = n * k. Число 0 всегда является кратным k.

Пример:
Input: nums = [23,2,4,6,7], k = 6
Output: true
Explanation: [2, 4] is a continuous subarray of size 2 whose elements sum up to 6.


👨‍💻 Алгоритм:

1️⃣Итерация по начальным точкам:
*️⃣Используйте вложенный цикл для итерации по всем возможным начальным точкам start в списке nums.
*️⃣Внешний цикл будет итерироваться от 0 до len(nums) - 2 (включительно).

2️⃣Расширение подмассива:
*️⃣Внутри внешнего цикла используйте другой цикл для итерации по возможным конечным точкам end.
*️⃣Внутренний цикл будет итерироваться от start + 1 до len(nums) - 1 (включительно).

3️⃣Вычислите сумму:
*️⃣Для каждой комбинации start и end вычислите сумму подмассива с помощью встроенной функции суммы Python.

4️⃣Проверьте, является ли сумма кратной (k):
*️⃣Проверьте, является ли сумма кратной k, с помощью оператора остатка от деления (%).
*️⃣Если сумма равна нулю, обработайте особый случай, когда k также равно нулю.

5️⃣Верните результат:
*️⃣Если сумма любого подмассива кратна k, верните True.
*️⃣Если после проверки всех комбинаций такой подмассив не найден, вернуть False.

😎 Решение:
public class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int n = nums.length;

// Step 1: Iterate Through Starting Points
for (int start = 0; start < n - 1; start++) {
// Step 2: Expand the Subarray
for (int end = start + 1; end < n; end++) {
// Step 3: Calculate the Sum
int subarraySum = 0;
for (int i = start; i <= end; i++) {
subarraySum += nums[i];
}

// Step 4: Check if the Sum is a Multiple of k
if (subarraySum == 0 && k == 0) { // Handling special case where k is 0
return true;
}
if (k != 0 && subarraySum % k == 0) {
return true;
}
}
}

// Step 5: Return the Result
return false;
}
}


🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👏2🔥1