Please open Telegram to view this post
VIEW IN TELEGRAM
Mapper MapStruct. Коротко о важном. Встреча от 16.02.2025
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу мапперов - библиотек которые помогают преобразовывать объекты в друг друга. А также:
- Зачем нам вообще нужны Mappers?
- Какие наиболее популярные Mappers есть?
- Рассмотрели часто встречающуюся реализацию - MapStruct.
- Написали немного кода, посмотрели как все это работает, изучили разные варианты взаимодействий.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!🤘 🔫
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу мапперов - библиотек которые помогают преобразовывать объекты в друг друга. А также:
- Зачем нам вообще нужны Mappers?
- Какие наиболее популярные Mappers есть?
- Рассмотрели часто встречающуюся реализацию - MapStruct.
- Написали немного кода, посмотрели как все это работает, изучили разные варианты взаимодействий.
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!
Please open Telegram to view this post
VIEW IN TELEGRAM
Класс BigInteger в Java — основы и внутреннее устройство
В Java для работы с целыми числами, которые выходят за пределы диапазона long (от -2⁶³ до 2⁶³-1), используется класс BigInteger. Этот класс позволяет работать с числами произвольной длины, что делает его незаменимым для задач, требующих высокой точности, таких как криптография, научные вычисления и финансы.
Внутреннее устройство
Класс BigInteger хранит число в виде массива целых чисел (int[]), где каждый элемент массива представляет часть большого числа. Это позволяет BigInteger работать с числами, которые могут быть сколь угодно большими, ограничиваясь только доступной памятью.
Хранение данных: Число хранится в виде массива int[], где каждый элемент массива представляет 32 бита числа. Это позволяет эффективно использовать память и выполнять операции над большими числами.
Знак: Отдельно хранится знак числа (положительное или отрицательное).
Пример внутреннего представления числа:
Основные методы класса BigInteger
Конструкторы:
BigInteger(String val) — создает объект BigInteger из строки.
BigInteger(byte[] val) — создает объект BigInteger из массива байт.
BigInteger(int signum, byte[] magnitude) — создает объект BigInteger с указанным знаком и массивом байт.
Пример:
Арифметические операции:
add(BigInteger val) — сложение.
subtract(BigInteger val) — вычитание.
multiply(BigInteger val) — умножение.
divide(BigInteger val) — деление.
mod(BigInteger val) — остаток от деления.
Пример:
Сравнение:
compareTo(BigInteger val) — сравнивает два числа. Возвращает -1, 0 или 1, если текущее число меньше, равно или больше переданного.
equals(Object x) — проверяет равенство двух объектов BigInteger.
Пример:
Битовые операции:
and(BigInteger val) — побитовое И.
or(BigInteger val) — побитовое ИЛИ.
xor(BigInteger val) — побитовое исключающее ИЛИ.
shiftLeft(int n) — сдвиг влево на n бит.
shiftRight(int n) — сдвиг вправо на n бит.
Пример:
Другие полезные методы:
pow(int exponent) — возведение в степень.
gcd(BigInteger val) — наибольший общий делитель.
isProbablePrime(int certainty) — проверка на простоту.
Пример:
Плюсы и минусы BigInteger
Плюсы:
Поддержка чисел произвольной длины.
Высокая точность вычислений.
Богатый набор методов для арифметических и битовых операций.
Минусы:
Медленнее, чем примитивные типы данных (int, long).
Требует больше памяти для хранения больших чисел.
Пример использования
#Java #Training #Medium #BigInteger
В Java для работы с целыми числами, которые выходят за пределы диапазона long (от -2⁶³ до 2⁶³-1), используется класс BigInteger. Этот класс позволяет работать с числами произвольной длины, что делает его незаменимым для задач, требующих высокой точности, таких как криптография, научные вычисления и финансы.
Внутреннее устройство
Класс BigInteger хранит число в виде массива целых чисел (int[]), где каждый элемент массива представляет часть большого числа. Это позволяет BigInteger работать с числами, которые могут быть сколь угодно большими, ограничиваясь только доступной памятью.
Хранение данных: Число хранится в виде массива int[], где каждый элемент массива представляет 32 бита числа. Это позволяет эффективно использовать память и выполнять операции над большими числами.
Знак: Отдельно хранится знак числа (положительное или отрицательное).
Пример внутреннего представления числа:
BigInteger bigInt = new BigInteger("123456789012345678901234567890");
Внутри это число будет представлено как массив int[], где каждый элемент массива хранит часть числа.
Основные методы класса BigInteger
Конструкторы:
BigInteger(String val) — создает объект BigInteger из строки.
BigInteger(byte[] val) — создает объект BigInteger из массива байт.
BigInteger(int signum, byte[] magnitude) — создает объект BigInteger с указанным знаком и массивом байт.
Пример:
BigInteger bigInt = new BigInteger("12345678901234567890");
Арифметические операции:
add(BigInteger val) — сложение.
subtract(BigInteger val) — вычитание.
multiply(BigInteger val) — умножение.
divide(BigInteger val) — деление.
mod(BigInteger val) — остаток от деления.
Пример:
BigInteger a = new BigInteger("10000000000000000000");
BigInteger b = new BigInteger("20000000000000000000");
BigInteger sum = a.add(b); // 30000000000000000000
Сравнение:
compareTo(BigInteger val) — сравнивает два числа. Возвращает -1, 0 или 1, если текущее число меньше, равно или больше переданного.
equals(Object x) — проверяет равенство двух объектов BigInteger.
Пример:
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("200");
int result = a.compareTo(b); // -1, так как a < b
Битовые операции:
and(BigInteger val) — побитовое И.
or(BigInteger val) — побитовое ИЛИ.
xor(BigInteger val) — побитовое исключающее ИЛИ.
shiftLeft(int n) — сдвиг влево на n бит.
shiftRight(int n) — сдвиг вправо на n бит.
Пример:
BigInteger a = new BigInteger("10"); // 1010 в двоичной системе
BigInteger b = a.shiftLeft(2); // 101000 (40 в десятичной)
Другие полезные методы:
pow(int exponent) — возведение в степень.
gcd(BigInteger val) — наибольший общий делитель.
isProbablePrime(int certainty) — проверка на простоту.
Пример:
BigInteger a = new BigInteger("17");
boolean isPrime = a.isProbablePrime(100); // true, так как 17 — простое число
Плюсы и минусы BigInteger
Плюсы:
Поддержка чисел произвольной длины.
Высокая точность вычислений.
Богатый набор методов для арифметических и битовых операций.
Минусы:
Медленнее, чем примитивные типы данных (int, long).
Требует больше памяти для хранения больших чисел.
Пример использования
import java.math.BigInteger;
public class BigIntegerExample {
public static void main(String[] args) {
BigInteger a = new BigInteger("12345678901234567890");
BigInteger b = new BigInteger("98765432109876543210");
BigInteger sum = a.add(b);
BigInteger product = a.multiply(b);
System.out.println("Сумма: " + sum);
System.out.println("Произведение: " + product);
}
}
#Java #Training #Medium #BigInteger
Что выведет код?
#Tasks
public class Task170225 {
public static void main(String[] args) {
int x = 5;
int y = 0;
if (x > 0) {
while (x > 0) {
y += x;
x--;
}
}
System.out.println(y);
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что делает оператор continue?
Что делает оператор continue?
Anonymous Quiz
2%
Завершает выполнение программы
94%
Пропускает текущую итерацию цикла
4%
Возвращает значение из метода
0%
Перехватывает исключения
Класс BigDecimal в Java
Класс BigDecimal в Java используется для выполнения точных арифметических операций с числами с плавающей точкой. В отличие от примитивных типов double и float, которые могут терять точность из-за особенностей двоичного представления, BigDecimal обеспечивает полный контроль над точностью и округлением. Это делает его идеальным выбором для финансовых расчетов, где важна каждая копейка.
Внутреннее устройство
BigDecimal хранит число в виде двух компонентов:
Мантисса (unscaled value): Целое число типа BigInteger, представляющее значимые цифры числа.
Масштаб (scale): Целое число, указывающее количество цифр после десятичной точки.
Пример:
Здесь:
Мантисса: 123456
Масштаб: 3 (три цифры после точки).
Основные методы класса BigDecimal
Конструкторы:
BigDecimal(String val) — создает объект BigDecimal из строки.
BigDecimal(double val) — создает объект BigDecimal из числа double (не рекомендуется из-за потери точности).
BigDecimal(BigInteger val) — создает объект BigDecimal из BigInteger.
Пример:
Арифметические операции:
add(BigDecimal val) — сложение.
subtract(BigDecimal val) — вычитание.
multiply(BigDecimal val) — умножение.
divide(BigDecimal val) — деление.
remainder(BigDecimal val) — остаток от деления.
Пример:
Округление:
setScale(int newScale, RoundingMode roundingMode) — устанавливает новый масштаб (количество знаков после точки) и применяет указанный режим округления.
RoundingMode — перечисление, определяющее стратегию округления (например, RoundingMode.HALF_UP для округления до ближайшего числа).
Пример:
Сравнение:
compareTo(BigDecimal val) — сравнивает два числа. Возвращает -1, 0 или 1, если текущее число меньше, равно или больше переданного.
equals(Object x) — проверяет равенство двух объектов BigDecimal (учитывает масштаб).
Пример:
Другие полезные методы:
abs() — возвращает абсолютное значение.
pow(int n) — возведение в степень.
stripTrailingZeros() — удаляет незначащие нули после точки.
Пример:
Плюсы и минусы BigDecimal
Плюсы:
Высокая точность вычислений.
Полный контроль над округлением.
Подходит для финансовых расчетов.
Минусы:
Медленнее, чем примитивные типы (double, float).
Требует больше памяти.
Пример использования
#Java #Training #Medium #BigDecimal
Класс 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
Чтение ZIP-архивов с использованием ZipInputStream
ZIP-архивы — это популярный формат сжатия данных, который позволяет объединять несколько файлов в один архив. В Java для работы с ZIP-архивами используются классы ZipInputStream и ZipOutputStream. Начнем с чтения ZIP-архивов.
Класс ZipInputStream
ZipInputStream — это класс, который позволяет читать содержимое ZIP-архива. Он наследуется от InflaterInputStream и использует алгоритм сжатия DEFLATE для распаковки данных.
Как это работает под капотом?
Чтение структуры ZIP-архива: ZIP-архив состоит из записей (entries), каждая из которых представляет отдельный файл. Каждая запись содержит метаданные (имя, размер, метод сжатия и т.д.) и сами данные.
Распаковка данных: ZipInputStream читает каждую запись по очереди и распаковывает данные с использованием алгоритма DEFLATE.
Пример чтения ZIP-архива
Плюсы и минусы ZipInputStream
Плюсы:
Простота использования.
Поддержка потокового чтения, что позволяет работать с большими архивами без загрузки всего содержимого в память.
Минусы:
Низкоуровневый API: требует ручного управления данными и записями.
Нет встроенной поддержки для работы с паролями или шифрованием.
Нюансы использования
Всегда закрывайте ZipInputStream после использования, чтобы освободить ресурсы.
Используйте буфер для чтения данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #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
Что выведет код?
#Tasks
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
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-архива
Плюсы и минусы ZipOutputStream
Плюсы:
Простота создания архивов.
Поддержка потоковой записи, что позволяет работать с большими объемами данных.
Минусы:
Нет встроенной поддержки для шифрования или установки паролей.
Требует ручного управления записями и данными.
Нюансы использования
Всегда закрывайте ZipOutputStream после использования, чтобы завершить запись архива.
Используйте буфер для записи данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #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
Для тех кто не знает у нас есть чат!
Не шибко активный, но ламповый) - https://t.me/Java_Beginner_chat
👋
Не шибко активный, но ламповый) - https://t.me/Java_Beginner_chat
Please open Telegram to view this post
VIEW IN TELEGRAM