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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Предлагаем темы для разбора и публикации! 📖

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

Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.

Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 один человек - одна тема.
🟢Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!

Жду Ваших предложений! 👏
Please open Telegram to view this post
VIEW IN TELEGRAM
Голосуем за предложенные (одним человеком!) темы!
Anonymous Poll
27%
Keycloak
32%
MVC
30%
EntityManager
11%
EntityGraph
Встреча создана! 👋

https://telemost.yandex.ru/j/38398531869301

Залетаем! ✈️
Please open Telegram to view this post
VIEW IN 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