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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Изучаем Swagger

Встреча от 25.05.2025

Запись встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы разобрали часто встречающуюся библиотеку - Swagger UI

Что мы успели:
➡️ Зачем нам вообще нужен Swagger UI
➡️ Какие существуют основные принципы его написания
➡️ Основные аннотации Swagger Core
➡️ Все это посмотрели на примере кода

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Кому нужно проект на гитхабе (кому не жалко поставьте звездочек)

Спасибо всем кто пришел, респект 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Глубокое изучение типа данных double в Java: сравнение с целочисленными типами

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

Размер и назначение

double занимает 8 байт (64 бита) и поддерживает числа с высокой точностью в достаточно большом диапазоне — от ±10⁻³⁰⁸ до ±10³⁰⁸. При этом точность составляет около 15–17 десятичных цифр. Это делает double универсальным для большинства задач, связанных с вещественной арифметикой.


В отличие от int и long, которые могут хранить только целые числа, double может представлять дробные значения. Например, 3.14, -0.0001, 2.71828.

Формат хранения и особенности


Числа типа double хранятся в формате IEEE 754 — стандарте представления чисел с плавающей точкой.

Эти 64 бита делятся на три части:
1 бит знака;
11 бит на экспоненту;
52 бита на мантиссу (значащие цифры).


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


Сравнение с целочисленными типами


byte, short, int, long обеспечивают точную арифметику в рамках своего диапазона. double же — приближённую, и это накладывает ограничения.
Например, выражение 0.1 + 0.2 == 0.3 даст false, потому что 0.1 и 0.2 не имеют точного двоичного представления, и результат чуть отличается от 0.3.
double может без ошибок хранить целые числа, но только до 2⁵³ (около 9 квадриллионов). После этого точность теряется: не каждое целое число может быть представлено уникально.
Попытка точно представить большие целые (long) в double может привести к неожиданным ошибкам.


Автоматическое приведение типов

При работе в выражениях:
Все целочисленные типы (byte, short, int, long) автоматически продвигаются до double, если в выражении участвует double.
Приведение от double к целым типам выполняется явно, с усечением дробной части.


Пример:
int x = 5;
double y = 2.5;
double z = x + y; // x автоматически превращается в double

int i = (int) y; // i = 2, дробная часть отбрасывается


Переполнение и особые значения

В отличие от целочисленных типов, double не оборачивается при переполнении, а уходит в бесконечность:
double x = Double.MAX_VALUE;
System.out.println(x * 2); // Infinity


Также возможны:

NaN (Not a Number) — результат недопустимых операций (например, 0.0 / 0.0)
+Infinity и -Infinity — результат переполнения или деления на ноль

Производительность и использование


Арифметика с double обычно медленнее, чем с целыми числами, особенно на старых процессорах или в JVM без JIT-оптимизаций. В современных системах разница не всегда критична, но при массовых расчётах (for-циклы, обработка массивов) её стоит учитывать.

Когда использовать double, а когда — целые типы

Используйте double, если:

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


Выбирайте int или long, если:
работаете с точным счётом (деньги, единицы, индексы);
важна предсказуемость и надёжность арифметики;
нужны точные операции без округлений.


Выбирайте BigDecimal, если:
нужна максимальная точность и надежность расчетов.

Рекомендации

Для точных денежных расчётов не используйте double — он не гарантирует точность. Лучше использовать BigDecimal.
Избегайте == для сравнения double — сравнивайте с допустимой дельтой (например, Math.abs(a - b) < epsilon)
Помните, что double не хранит точных значений, даже для простых дробей вроде 0.1


#Java #для_новичков #beginner #double
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

Голосуем за тему к рассмотрению в эти выходные!

Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)

Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?

public class Task260525 {
public static void main(String[] args) {
double d1 = 0.1 + 0.2;
double d2 = 0.3;
System.out.println(d1 == d2);
}
}


#Tasks
Объясните основные принципы ООП в Java? 🤓

Ответ:

Инкапсуляция: сокрытие данных (через private) и предоставление доступа через методы (геттеры/сеттеры).

Наследование: класс может наследовать свойства и методы другого класса (extends).

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

Абстракция: сокрытие деталей реализации, предоставление только необходимого интерфейса (через абстрактные классы или интерфейсы).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Введение в Liquibase

1. Что такое Liquibase и зачем он нужен

Liquibase — это инструмент для управления изменениями в структуре базы данных (миграциями).

Он позволяет:
Контролировать эволюцию схемы БД через версионированные скрипты.
Автоматизировать применение изменений (создание таблиц, изменение столбцов и т. д.).
Обеспечивать консистентность между разными окружениями (dev, test, prod).
Поддерживать откат изменений (rollback) в случае ошибок.


Проблемы, которые решает Liquibase:
Ручное выполнение SQL-скриптов на разных серверах.
Отсутствие истории изменений БД.
Несовместимость версий схемы БД между разработчиками.


2. Поддерживаемые СУБД

Liquibase работает с большинством популярных баз данных:
Реляционные: PostgreSQL, MySQL, Oracle, SQL Server, H2, SQLite.
NoSQL: MongoDB (с ограниченной поддержкой).
Облачные: Amazon RDS, Google Cloud SQL.

3. Принципы работы


Changelog (журнал изменений)

Это главный файл, который ссылается на все изменения (changeSet’ы). Хранится в формате XML, YAML, JSON или SQL.

ChangeSet (набор изменений)

Минимальная единица изменения в Liquibase.

Каждый changeSet:
Имеет уникальный идентификатор (id + author).
Описывает одно или несколько изменений (например, создание таблицы).
Может содержать атрибуты (runOnChange, failOnError).


Контроль версий

Liquibase ведет таблицы в БД:
DATABASECHANGELOG — журнал примененных changeSet’ов.
DATABASECHANGELOGLOCK — блокировка для предотвращения конфликтов.


4. Форматы changelog-файлов

XML — строгая структура, но многословный.
<?xml version="1.0" encoding="UTF-8"?>  
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.6.xsd">

<changeSet id="1" author="alex">
<createTable tableName="users">
<column name="id" type="INT" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="username" type="VARCHAR(50)"/>
</createTable>
</changeSet>
</databaseChangeLog>


YAML — лаконичный, но чувствителен к отступам.
databaseChangeLog:  
- changeSet:
id: 1
author: alex
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: INT
autoIncrement: true
constraints:
primaryKey: true
- column:
name: username
type: VARCHAR(50)


SQL — прост для DBA, но менее гибкий.
--liquibase formatted sql  

--changeset alex:1
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50)
);



5. Интеграция Liquibase в Java-проект (Maven/Gradle)

Maven

Добавить в pom.xml:
<dependency>  
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.20.0</version>
</dependency>


Конфигурация в
application.properties (Spring Boot):
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml  
spring.liquibase.url=jdbc:postgresql://localhost:5432/mydb
spring.liquibase.user=user
spring.liquibase.password=pass


Gradle
Добавить в build.gradle:
implementation 'org.liquibase:liquibase-core:4.20.0'


#Java #middle #Liquibase
Сегодня каналу исполнился год! 🥳

Начинавшийся как попытка освоить телеграм-каналы и найти единомышленников в программировании на Java - сегодня наш канал, небольшое, но уникальное сообщество, в котором объединено стремление охватить все аспекты Java, с встречами и интересным общением! 🤓

Вот немного статистики по каналу:
🔵Сегодня нас в канале: 669 человек
🔵Постов в канале: 2406 или 6.6 постов в день
🔵Постов содержащих обучающую информацию: ~ 440
🔵Постов с уникальными задачами: 257
🔵Постов с IT-мемами: 415
🔵Постов с IT-фактами: 89
🔵Постов с IT-цитатами и биографиями: 88
🔵Проведено встреч и опубликовано видео: 42
🔵Подписчиков на YouTube: 220
🔵Потрачено на рекламу/заработано: 0 рублей

Много это или мало - судить Вам))

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

Спасибо всем, кто поддерживает канал, помогает с лайвкодингом, приходит на встречи.

Ценю
🍸

С днем рождения нас
❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдет при выполнении следующего кода, если соединение с БД установлено успешно?

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

public class Task270525 {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "user", "pass");
Statement stmt = conn.createStatement()) {

conn.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO users VALUES (1, 'John')");
stmt.executeUpdate("INSERT INTO users VALUES (1, 'Mike')");
conn.commit();

} catch (
SQLException e) {
System.out.println("Error occurred");
}
}
}


#Tasks
Что такое перегрузка и переопределение методов? 🤓

Ответ:
Перегрузка (overloading): методы в одном классе с одинаковым именем, но разными параметрами (по количеству или типу). Происходит на этапе компиляции.

Переопределение (overriding): подкласс переопределяет метод родительского класса с той же сигнатурой. Происходит на этапе выполнения.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Глубокое изучение типа float в Java: сравнение с double и целочисленными типами

Тип float — один из двух примитивных типов с плавающей точкой в Java. Он используется для хранения чисел с десятичной частью и обеспечивает определённый баланс между точностью и потреблением памяти. Несмотря на свою "простоту", float имеет множество нюансов, особенно в сравнении с double и целочисленными типами (int, long и т. д.), и может вести себя неожиданно, если не понимать его природу.

Что такое float в Java

float — это 32-битный (4 байта) тип данных, реализующий стандарт IEEE 754 для представления чисел с плавающей точкой.

Это означает, что число хранится в следующем формате:
1 бит — знак числа
8 бит — экспонента
23 бита — мантисса (дробная часть)


Таким образом, float может хранить числа приблизительно в диапазоне от ±1.4 × 10^-45 до ±3.4 × 10^38 с точностью около 6–7 значащих десятичных цифр.

Чтобы обозначить литерал как float, нужно явно указать f или F:
float pi = 3.1415927f;
Без этого литерал будет воспринят как double по умолчанию, что приведет к ошибке компиляции при попытке неявного присваивания.


Сравнение с double

double — это 64-битный тип, также реализующий IEEE 754, но имеющий:
1 бит для знака
11 бит для экспоненты
52 бита для мантиссы

Он способен хранить числа от ±4.9 × 10^-324 до ±1.7 × 10^308, с точностью около 15–16 значащих цифр.

То есть:
float — быстрее, но менее точен, занимает меньше памяти
double — точнее, но требует больше памяти и может быть чуть медленнее в вычислениях на некоторых архитектурах


В реальной практике предпочтение обычно отдают double, особенно в финансовых, статистических или инженерных вычислениях, где важна точность. float чаще применяется в графике (например, координаты вершин), машинном обучении, играх и устройствах с ограниченными ресурсами (встраиваемые системы, Android до определённых API-уровней).

Сравнение с целочисленными типами

Целочисленные типы (byte, short, int, long) хранят точные значения и не допускают погрешностей. Они идеальны для подсчётов, индексов, флагов, битовых масок и всего, что не связано с дробями.
В отличие от них, float и double — не точные типы.


Это означает:
Результаты вычислений могут быть неточными из-за ограниченной точности представления дробных чисел.
Сравнение значений на равенство (==) — рискованно и почти всегда плохая идея.


Простые на вид операции могут давать неожиданный результат:
float a = 0.1f + 0.2f;
System.out.println(a == 0.3f); // false
Это связано с тем, что не все десятичные дроби можно точно представить в двоичной системе.


Работа с памятью и производительность

Обе переменные — float и double — примитивные типы и, следовательно, при размещении в стеке (например, внутри метода) не требуют участия сборщика мусора. Они быстро выделяются и удаляются вместе с фреймом стека. Однако, если переменные — поля объекта, то они хранятся в куче, и их "жизненный цикл" зависит от объекта.

С точки зрения производительности:
На современных процессорах разница между float и double минимальна.
Некоторые GPU и встраиваемые процессоры всё ещё используют float как основной тип с плавающей точкой.
На JVM оба типа оптимизируются, но float может быть чуть быстрее при большом объеме операций и памяти.


#Java #для_новичков #beginner #float
Особенности и подводные камни

Погрешность и потеря точности
Каждое присваивание или операция с float может сопровождаться потерей точности. Например:
float a = 1_000_000;
float b = a + 0.0001f;
System.out.println(a == b); // true — потерялась дробная часть


Нормализованные и денормализованные числа

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

NaN, Infinity и -Infinity

float поддерживает специальные значения:
Float.NaN — результат недопустимых операций (например, 0.0f / 0.0f)
Float.POSITIVE_INFINITY и Float.NEGATIVE_INFINITY — результат переполнения или деления на 0
Эти значения не вызывают исключений, и с ними можно работать, но это требует осторожности.


Сравнение на равенство

Из-за округлений не следует использовать == для сравнения двух float.


Вместо этого используют допустимую погрешность:
float a = 0.1f + 0.2f;
float b = 0.3f;
if (Math.abs(a - b) < 1e-6) {
System.out.println("Равны с учетом погрешности");
}


Приведение типов

При смешанных операциях с float и целочисленными типами Java автоматически приводит меньший тип к float.

Например:
int x = 3;
float y = 2.5f;
float result = x + y; // x преобразован в float
Это не вызывает проблем, но может повлиять на точность, если целое число очень большое.


Двоичное представление и неожиданное округление

Некоторые десятичные дроби (например, 0.1, 0.2) не могут быть точно представлены в двоичной системе. Это приводит к накапливающимся погрешностям, особенно при работе с циклами или большими массивами данных.


Когда использовать float, а когда — double


Используй float, если:
Работаешь в среде с ограниченной памятью или производительностью (например, Android, микроконтроллеры)
Требуется снизить объем данных (например, передача координат в 3D-движке)
Максимальная точность не критична


Используй double, если:
Точность важна (финансовые расчеты, физические симуляции)
Объёмы данных позволяют использовать больше памяти
Не хочешь постоянно контролировать потерю точности


#Java #для_новичков #beginner #float
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

Голосуем за тему к рассмотрению в эти выходные!

Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)

Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?

public class Task280525 {
public static void main(String[] args) {
float f = 16777216f;
System.out.println(f == (f + 1f));
}
}


#Tasks