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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!

Тема будет: Swagger
Anonymous Poll
50%
Да, я обязательно приду! 🙂
45%
Я хотел бы прийти, но не могу 🤷‍♀️
5%
Не приду, фигню какую-то рассматриваете 🤢
👍1
Всем привет! ✌️

Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!

В этот раз, дошла очередь рассказать о том, как в контроллере в экосистеме Spring, добавить Swagger.

И даже если раньше вы и не слышали о таком слове - уверен, Вам это пригодится!


Рассмотрим:
- Зачем нам вообще нужен Swagger
- Какие существуют основные принципы его написания
- Основные аннотации Swagger
- Все это посмотрим на примере кода


Приходите, будет весьма интересно 🧑‍💻

Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
"Твой первый проект — важнее, чем думаешь"

Не знаю как все, а я хорошо помню как писал свой первый проект 😉
И пускай сейчас я лишь улыбнусь, вспоминая его, но тогда мне казалось, что я как минимум сделал что-то великое
✈️

И наверно лишь после этого, я смог окончательно поверить, что стану программистом.💪

И если Вы 🫵 до сих пор считаете, что писать пет-проекты - это как минимум ерунда и никому не нужно, спешу огорчить - Вы не правы.

Так почему же стоит попробовать реализовать свою самую смелую и сложную идею, самым простым образом?

🔴 Первый завершённый проект — это точка отсчёта. Он показывает, что ты не просто учишься, а уже умеешь создавать что-то настоящее.

Это по сути, первая проверка твоих настоящих умений, а не копирование кода с видео или сайта. И пускай чатями ты все равно берешь код с Stack Owerflow или из LLM, но сама проработка идеи, наполнение смыслом безликого кода, порождает в тебе уверенность в своих силах.

🔴 Доведение проекта до конца — уже победа.

Ведь большинство бросает обучение, написание проекта на середине, а то и в самом начале!
Вы знаете сколько пользователей JavaRush достигли 10 уровня? Из нескольких миллионов - 3%! Да, Карл, всего 3%!

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

🔴 Обучение в процессе

Ведь в даже самом простом проекте ты сталкиваешься как минимум с:
структурой кода,
ООП (объектно-ориентированным программированием),
работой с вводом/выводом,
дебагом и ошибками,
поиском информации и документацией.

А это как минимум зарядка для твоего серого вещества!

🔴 Маленький проект - это уже портфолио.

Даже самый простой проект можно показать на GitHub. А это твой первый кирпичик в карьеру.
А если он написан с использованием топовых технологий - это лишний повод гордится собой и давать ссылку на GitHub собеседующему.

🔴 С каждым следующим проектом будет легче.

После первого проекта страх уходит. После второго ты начинаешь думать не “смогу ли?”, а “что сделаю дальше?”. После третьего ты уже сам можешь кого-то научить 🙂

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
Предлагаем темы для разбора и публикации! 📖

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

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

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

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

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

Залетаем! ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Изучаем Swagger

Встреча от 25.05.2025

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

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

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

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

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

Спасибо всем кто пришел, респект 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Факт дня:

А вы знали, что термин Boilerplate (Шаблонный код) пришел к нам из начала 20 века?

Изначально термином Boiler plate описывалась согнутая в цилиндры сталь для изготовления водонагревателей. Затем начал применяться в СМИ для банального или неоригинального текста. Также этим термином называли металлические печатные формы с заранее подготовленным текстом, например, с рекламой или синдицированными колонками, которые передавались в небольшие местные газеты. По аналогии сами печатные формы тоже стали называть boilerplates. Одним из крупных поставщиков таких форм была компания Western Newspaper Union. Она предлагала газетам с небольшим географическим покрытием «готовые к печати истории, содержащие национальные или международные новости». Эти «истории» могли содержать рекламные объявления, размещённые рядом с обычным текстом.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Глубокое изучение типа данных 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
👍5
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

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

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

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

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
👍1
Объясните основные принципы ООП в Java? 🤓

Ответ:

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

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

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

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


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
📌 Факт дня:

А вы знали, что термин Cursor (Курсор) пришел к нам из древней Греции?

Cursor в переводе с латыни — бегун. Этим словом называли прозрачную каретку на логарифмической линейке — бегунок, ползунок. На бегунке была нанесена тончайшая линия для выбора нужной позиции на линейке. Позднее термин «курсор» перекочевал в компьютеры.


#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Цитата дня: Рид Хоффман

"Если вам не стыдно за первую версию продукта, вы запустились слишком поздно."


Рид Хоффман, сооснователь LinkedIn, сказал это в 2009 году в интервью о стартапах.

Биография

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Введение в 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
👍8
Сегодня каналу исполнился год! 🥳

Начинавшийся как попытка освоить телеграм-каналы и найти единомышленников в программировании на 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
🔥15🍾4👍31
Что произойдет при выполнении следующего кода, если соединение с БД установлено успешно?

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
👍1