Java for Beginner
675 subscribers
548 photos
155 videos
12 files
839 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Варианты ответа:
Anonymous Quiz
14%
5
5%
10
70%
15
11%
RuntimeException
Маленький, пушистый гайд по Cubernetes 🤓 🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Класс BigDecimal в Java

Класс BigDecimal в Java используется для выполнения точных арифметических операций с числами с плавающей точкой. В отличие от примитивных типов double и float, которые могут терять точность из-за особенностей двоичного представления, BigDecimal обеспечивает полный контроль над точностью и округлением. Это делает его идеальным выбором для финансовых расчетов, где важна каждая копейка.

Внутреннее устройство


BigDecimal хранит число в виде двух компонентов:
Мантисса (unscaled value): Целое число типа BigInteger, представляющее значимые цифры числа.
Масштаб (scale): Целое число, указывающее количество цифр после десятичной точки.


Пример:
BigDecimal decimal = new BigDecimal("123.456");


Здесь:
Мантисса: 123456
Масштаб: 3 (три цифры после точки).


Основные методы класса BigDecimal

Конструкторы:
BigDecimal(String val) — создает объект BigDecimal из строки.
BigDecimal(double val) — создает объект BigDecimal из числа double (не рекомендуется из-за потери точности).
BigDecimal(BigInteger val) — создает объект BigDecimal из BigInteger.


Пример:
BigDecimal a = new BigDecimal("123.456");
BigDecimal b = new BigDecimal(123.456); // Не рекомендуется


Арифметические операции:
add(BigDecimal val) — сложение.
subtract(BigDecimal val) — вычитание.
multiply(BigDecimal val) — умножение.
divide(BigDecimal val) — деление.
remainder(BigDecimal val) — остаток от деления.


Пример:
BigDecimal a = new BigDecimal("100.50");
BigDecimal b = new BigDecimal("20.25");
BigDecimal sum = a.add(b); // 120.75


Округление:
setScale(int newScale, RoundingMode roundingMode) — устанавливает новый масштаб (количество знаков после точки) и применяет указанный режим округления.
RoundingMode — перечисление, определяющее стратегию округления (например, RoundingMode.HALF_UP для округления до ближайшего числа).


Пример:
BigDecimal a = new BigDecimal("123.456789");
BigDecimal rounded = a.setScale(2, RoundingMode.HALF_UP); // 123.46


Сравнение:
compareTo(BigDecimal val) — сравнивает два числа. Возвращает -1, 0 или 1, если текущее число меньше, равно или больше переданного.
equals(Object x) — проверяет равенство двух объектов BigDecimal (учитывает масштаб).


Пример:
BigDecimal a = new BigDecimal("100.00");
BigDecimal b = new BigDecimal("100.0");
boolean isEqual = a.equals(b); // false, так как масштабы разные
int comparison = a.compareTo(b); // 0, так как числовые значения равны


Другие полезные методы:
abs() — возвращает абсолютное значение.
pow(int n) — возведение в степень.
stripTrailingZeros() — удаляет незначащие нули после точки.


Пример:
BigDecimal a = new BigDecimal("123.4500");
BigDecimal stripped = a.stripTrailingZeros(); // 123.45


Плюсы и минусы BigDecimal


Плюсы:
Высокая точность вычислений.
Полный контроль над округлением.
Подходит для финансовых расчетов.


Минусы:
Медленнее, чем примитивные типы (double, float).
Требует больше памяти.


Пример использования
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("100.50");
BigDecimal b = new BigDecimal("20.25");

BigDecimal sum = a.add(b);
BigDecimal product = a.multiply(b);
BigDecimal rounded = product.setScale(2, RoundingMode.HALF_UP);

System.out.println("Сумма: " + sum);
System.out.println("Произведение: " + product);
System.out.println("Округленное произведение: " + rounded);
}
}


#Java #Training #Medium #BigDecimal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Чтение ZIP-архивов с использованием ZipInputStream

ZIP-архивы — это популярный формат сжатия данных, который позволяет объединять несколько файлов в один архив. В Java для работы с ZIP-архивами используются классы ZipInputStream и ZipOutputStream. Начнем с чтения ZIP-архивов.

Класс ZipInputStream


ZipInputStream — это класс, который позволяет читать содержимое ZIP-архива. Он наследуется от InflaterInputStream и использует алгоритм сжатия DEFLATE для распаковки данных.

Как это работает под капотом?

Чтение структуры ZIP-архива: ZIP-архив состоит из записей (entries), каждая из которых представляет отдельный файл. Каждая запись содержит метаданные (имя, размер, метод сжатия и т.д.) и сами данные.
Распаковка данных: ZipInputStream читает каждую запись по очереди и распаковывает данные с использованием алгоритма DEFLATE.

Пример чтения ZIP-архива
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipReaderExample {
public static void main(String[] args) {
String zipFilePath = "example.zip";

try (FileInputStream fis = new FileInputStream(zipFilePath);
ZipInputStream zis = new ZipInputStream(fis)) {

ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println("File: " + entry.getName());
System.out.println("Size: " + entry.getSize() + " bytes");

// Чтение содержимого файла
byte[] buffer = new byte[1024];
int len;
while ((len = zis.read(buffer)) > 0) {
// Здесь можно обработать данные, например, записать в другой файл
System.out.write(buffer, 0, len);
}
System.out.println("\n-------------------");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


Плюсы и минусы ZipInputStream

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


Минусы:
Низкоуровневый API: требует ручного управления данными и записями.
Нет встроенной поддержки для работы с паролями или шифрованием.


Нюансы использования


Всегда закрывайте ZipInputStream после использования, чтобы освободить ресурсы.
Используйте буфер для чтения данных, чтобы минимизировать количество операций ввода-вывода.


#Java #Training #Medium #ZipInputStream
Что выведет код?

public class Task180225 {
public static void main(String[] args) {
int a = 5;
int b = 3;
int result = a & b | a ^ b;
System.out.println(result);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
15%
3
15%
5
24%
7
45%
RuntimeException
А как ошибки ощущаются в Java? 🧐 😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Какой интерфейс используется для работы с ключами и значениями?
Anonymous Quiz
9%
List
2%
Set
81%
Map
7%
Queue
Запись ZIP-архивов с использованием ZipOutputStream

Теперь, когда мы научились читать ZIP-архивы, давайте рассмотрим, как создавать их с помощью ZipOutputStream.

Класс ZipOutputStream

ZipOutputStream — это класс, который позволяет создавать ZIP-архивы. Он наследуется от DeflaterOutputStream и использует алгоритм DEFLATE для сжатия данных.

Как это работает под капотом?


Создание структуры ZIP-архива: Каждый файл, добавляемый в архив, представлен как ZipEntry. Метаданные (имя, размер, метод сжатия) записываются в архив перед самими данными.
Сжатие данных: Данные сжимаются с использованием алгоритма DEFLATE и записываются в архив.

Пример создания ZIP-архива
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipWriterExample {
public static void main(String[] args) {
String[] filesToZip = {"file1.txt", "file2.txt"};
String zipFilePath = "output.zip";

try (FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos)) {

for (String file : filesToZip) {
try (FileInputStream fis = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(file);
zos.putNextEntry(zipEntry);

byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
}
}
System.out.println("ZIP-архив успешно создан: " + zipFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}


Плюсы и минусы ZipOutputStream

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


Минусы:
Нет встроенной поддержки для шифрования или установки паролей.
Требует ручного управления записями и данными.


Нюансы использования

Всегда закрывайте ZipOutputStream после использования, чтобы завершить запись архива.
Используйте буфер для записи данных, чтобы минимизировать количество операций ввода-вывода.


#Java #Training #Medium #ZipOutputStream
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Для тех кто не знает у нас есть чат!

Не шибко активный, но ламповый) -
https://t.me/Java_Beginner_chat

👋
Please open Telegram to view this post
VIEW IN TELEGRAM
Основы криптографии в Java

Криптография — это наука о методах обеспечения конфиденциальности, целостности и аутентичности информации.

Типы криптографии

Симметричная криптография

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

Основные алгоритмы симметричной криптографии


AES (Advanced Encryption Standard):
Современный стандарт шифрования, используемый во многих приложениях.
Работает с блоками данных размером 128 бит и поддерживает ключи длиной 128, 192 или 256 бит.

Основные этапы: SubBytes, ShiftRows, MixColumns, AddRoundKey.
Плюсы: высокая скорость, надежность, поддержка аппаратного ускорения.
Минусы: необходимость безопасного обмена ключами.

DES (Data Encryption Standard):
Устаревший алгоритм, использующий ключ длиной 56 бит.
Работает с блоками данных размером 64 бита.


Основные этапы: начальная перестановка, 16 раундов шифрования, финальная перестановка.
Плюсы: простота реализации.
Минусы: слабая стойкость из-за короткого ключа.

Пример шифрования с использованием AES в Java:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class AESExample {
public static void main(String[] args) throws Exception {
// Генерация ключа
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-bit key
SecretKey secretKey = keyGen.generateKey();

// Шифрование
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String plainText = "Hello, World!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted: " + encryptedText);

// Дешифрование
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted: " + decryptedText);
}
}


#Java #Training #Medium #Crypto #Symmetrical
Что выведет код?

public class Task190225 {
public static void main(String[] args) {
String dateStr = "2013-13-12 23:31:50";
try {
LocalDateTime date = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(date);
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("Ошибка парсинга");
}
}
}


#Tasks
И знаешь, что однажды у тебя будет такая яхта 😎

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Какой тип коллекции хранит уникальные элементы?
Anonymous Quiz
11%
List
13%
Map
73%
Set
2%
Queue
Основы криптографии в Java

Симметричная криптография: алгоритм AES (Advanced Encryption Standard)

AES — это блочный шифр, который обрабатывает данные блоками по 128 бит. Он поддерживает ключи длиной 128, 192 или 256 бит.

Этапы шифрования AES

1. Key Expansion (Генерация раундовых ключей)
Перед началом шифрования AES генерирует набор раундовых ключей на основе исходного ключа. Это делается с помощью алгоритма Rijndael Key Schedule.

Раундовый ключ (AddRoundKey):
Это ключ, который используется в каждом раунде шифрования.
Каждый раундовый ключ — это 128 бит (16 байт), как и блок данных.
Раундовые ключи генерируются путем применения нелинейных преобразований и сдвигов к исходному ключу.
Использование разных ключей для каждого раунда повышает безопасность шифрования.
Если злоумышленник узнает один из раундовых ключей, это не поможет ему восстановить исходный ключ.


2. Initial Round (Начальный раунд)
Начальный раунд состоит из одного этапа: AddRoundKey.

AddRoundKey:
Каждый байт данных XORится с соответствующим байтом раундового ключа.
XOR (исключающее ИЛИ) — это битовая операция, которая возвращает 1, если биты разные, и 0, если биты одинаковые.
Пример: 1010 XOR 1100 = 0110.
Результат этой операции — это первый шаг к "запутыванию" данных.


3. Main Rounds (Основные раунды)
Каждый основной раунд состоит из четырех этапов: SubBytes, ShiftRows, MixColumns и AddRoundKey.

Количество раундов зависит от длины ключа:
10 раундов для 128-битного ключа.
12 раундов для 192-битного ключа.
14 раундов для 256-битного ключа.


SubBytes (Замена байтов)
Каждый байт данных заменяется с использованием S-блока (таблицы замен).
S-блок — это предопределенная таблица, которая заменяет каждый байт на другой байт по определенному правилу.
Например, байт 0x53 может быть заменен на 0xED.
S-блок добавляет нелинейность, что делает шифрование более устойчивым к криптоанализу.


ShiftRows (Перестановка строк)
Блок данных представляется как матрица 4x4 (16 байт).
Каждая строка матрицы сдвигается влево на определенное количество байт:
Первая строка не сдвигается.
Вторая строка сдвигается на 1 байт.
Третья строка сдвигается на 2 байта.
Четвертая строка сдвигается на 3 байта.
Перестановка строк "перемешивает" данные, что повышает сложность шифрования.


MixColumns (Линейное преобразование столбцов)
Каждый столбец матрицы 4x4 обрабатывается с помощью линейного преобразования.
Это преобразование представляет собой умножение столбца на фиксированную матрицу в поле Галуа GF(2^8).
MixColumns добавляет диффузию, что означает, что изменение одного байта влияет на несколько байтов в блоке.


AddRoundKey (Добавление раундового ключа)
На этом этапе каждый байт данных снова XORится с соответствующим байтом раундового ключа.
Это завершает раунд и подготавливает данные для следующего раунда.


4. Final Round (Финальный раунд)
Финальный раунд похож на основные раунды, но в нем пропускается этап MixColumns. Это сделано для упрощения дешифрования.

Этапы финального раунда:
SubBytes.
ShiftRows.
AddRoundKey
.

#Java #Training #Medium #Crypto #Symmetrical