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

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

Сотрудничество @offercraft_support
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🤩3👍2
Объясните роль драйвера в JDBC.
Ответ -
Драйвер JDBC предоставляет специфичные для поставщика реализации абстрактных классов, предоставляемых API JDBC. Каждый драйвер должен предоставлять реализации для следующих классов пакета java.sql: Connection, Statement, PreparedStatement, CallableStatement, ResultSet и Driver.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1👏1
Основы Java Collection Framework. Карты (Map):

Java Collection Framework (JCF) — это архитектура, которая предоставляет набор интерфейсов и классов для работы с группами объектов. Основные реализации коллекций в Java включают:

😎Карты (Map):

1️⃣HashMap: реализация карты, которая не сохраняет порядок ключей и допускает один null ключ.

2️⃣ LinkedHashMap: сохраняет порядок добавления элементов.

3️⃣TreeMap: реализует интерфейс NavigableMap и хранит элементы в отсортированном порядке по ключу.

Пример:

   import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

public class MapExample {
public static void main(String[] args) {
// Использование HashMap
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 1);
hashMap.put("Banana", 2);
System.out.println("HashMap: " + hashMap);

// Использование LinkedHashMap
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Orange", 3);
linkedHashMap.put("Grape", 4);
System.out.println("LinkedHashMap: " + linkedHashMap);

// Использование TreeMap
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Banana", 2);
treeMap.put("Apple", 1);
treeMap.put("Grape", 3);
System.out.println("TreeMap: " + treeMap);
}
}


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

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍1👏1
🔤 От подвала до облака: как обучить нейросеть в домашних условиях

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

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍3🔥3
Задача:
Leetcode. Задача 35. Search Insert Position (easy)

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

Вы должны написать алгоритм со временной сложностью O(log n).

Пример:
Input: nums = [1,3,5,6], target = 5
Output: 2


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

1⃣Инициализируйте указатели left и right: left = 0, right = n - 1.

2⃣Пока left <= right:
Сравните средний элемент массива nums[pivot] с целевым значением target.
Если средний элемент является целевым, то есть target == nums[pivot]: верните pivot.
Если цель не найдена:
Если target < nums[pivot], продолжайте поиск в левом подмассиве. right = pivot - 1.
Иначе продолжайте поиск в правом подмассиве. left = pivot + 1.
3⃣Верните left.

😎 Решение:
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
}


🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👏2👍1
Что такое JDBC?
Ответ -
JDBC — это уровень абстракции, который позволяет пользователям выбирать между базами данных. JDBC позволяет разработчикам писать приложения баз данных на Java, не беспокоясь о базовых деталях конкретной базы данных.
🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👏1
🔤 Мастерство работы с Java Stream

В этой статье мы постараемся подробно рассмотреть Java Stream. Без долгих предисловий сразу приступим к делу. Для начала возьмём знакомый класс Student. Представим, что у нас есть группа студентов:

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁3👍2👏1
Тестирование с помощью JUnit 5

JUnit 5 — это популярный фреймворк для тестирования Java-приложений. Он предоставляет мощные инструменты для написания и выполнения тестов, а также поддерживает различные возможности, такие как аннотации, расширения и параметры тестирования. Вот основные моменты тестирования Java-кода с помощью JUnit 5, включая примеры.

*️⃣Основные аннотации JUnit 5

1️⃣@Test: аннотация, указывающая, что метод является тестовым.

2️⃣ @BeforeEach: метод, помеченный этой аннотацией, будет выполняться перед каждым тестом.

3️⃣ @AfterEach: метод, помеченный этой аннотацией, будет выполняться после каждого теста.

4️⃣ @BeforeAll: метод, помеченный этой аннотацией, будет выполняться один раз перед всеми тестами (должен быть статическим).

5️⃣@AfterAll: метод, помеченный этой аннотацией, будет выполняться один раз после всех тестов (должен быть статическим).

6️⃣@DisplayName: позволяет задать более читаемое имя для теста.

Рассмотрим пример простого класса Calculator и его тестирования с помощью JUnit 5.

public class Calculator {
public int add(int a, int b) {
return a + b;
}

public int subtract(int a, int b) {
return a - b;
}

public int multiply(int a, int b) {
return a * b;
}

public double divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("Division by zero");
}
return (double) a / b;
}
}


Тестовый класс TestCalculator
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

private Calculator calculator;

@BeforeEach
void setUp() {
calculator = new Calculator();
}

@AfterEach
void tearDown() {
// Здесь можно освободить ресурсы, если это необходимо
}

@Test
@DisplayName("Тестирование сложения")
void testAdd() {
assertEquals(5, calculator.add(2, 3), "2 + 3 должно быть равно 5");
assertEquals(-1, calculator.add(-2, 1), "-2 + 1 должно быть равно -1");
}

@Test
@DisplayName("Тестирование вычитания")
void testSubtract() {
assertEquals(1, calculator.subtract(3, 2), "3 - 2 должно быть равно 1");
assertEquals(-3, calculator.subtract(-2, 1), "-2 - 1 должно быть равно -3");
}

@Test
@DisplayName("Тестирование умножения")
void testMultiply() {
assertEquals(6, calculator.multiply(2, 3), "2 * 3 должно быть равно 6");
assertEquals(-2, calculator.multiply(-1, 2), "-1 * 2 должно быть равно -2");
}

@Test
@DisplayName("Тестирование деления")
void testDivide() {
assertEquals(2.0, calculator.divide(4, 2), "4 / 2 должно быть равно 2.0");
assertThrows(IllegalArgumentException.class, () -> calculator.divide(1, 0), "Деление на ноль должно выбрасывать IllegalArgumentException");
}
}


Тесты можно запускать из IDE (например, IntelliJ IDEA или Eclipse) или с помощью командной строки с использованием Maven или Gradle.

Если вы используете Maven, убедитесь, что у вас в pom.xml добавлена зависимость JUnit 5:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>


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

JUnit 5 — это мощный инструмент для тестирования Java-приложений. Он предоставляет множество возможностей для организации и выполнения тестов. Использование аннотаций @BeforeEach, @AfterEach, @Test и других позволяет создавать чистые и понятные тестовые классы. Тестирование кода помогает обеспечить его корректность и надежность при изменениях и добавлении новых функций.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3👏2
Созвон с начальством

🖥 Java Developer | Backend | #⃣#мемы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2😁2
🔤 Транзакции в 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