Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Честное мнение о курсе Евгения Борисова 😂
👍1🤯1🤣11
This media is not supported in your browser
VIEW IN TELEGRAM
Она же ошиблась, да?
🤣6🔥1🆒1
Я не забыл про видео, но так как вечером опять печальный интернет, загружу завтра с утра пораньше))

🧑‍💻 Всем хорошего вечера))
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥21
5. Бизнес-метрики в Spring Boot: Micrometer и реальная Observability

Стоп! Ваш Spring Boot приложение врет вам.

Actuator показывает, что CPU на 20%, память в норме, запросы обрабатываются. Но бизнес простаивает. Заказы не создаются, пользователи уходят, а вы узнаете об этом последним.

В этом видео мы устраним этот разрыв. Я объясню как заставить ваше приложение говорить не о процессах Java, а о бизнесе.

Что вы узнаете:

🔹 Проблема технических метрик: Почему actuator/health — это ложь, когда речь идет о бизнесе
🔹 Практика: Добавим в OrderHub метрики, которые действительно важны:
orders.created.total — сколько заказов создано
orders.created.duration — сколько времени занимает создание
orders.retrieved.total — сколько заказов запрошено
orders.retrieved.duration — сколько времени занимает запрос
Разделение на успехи и ошибки через теги

🔹 AOP-магия: Создадим аннотацию
@BusinessMetric, которая автоматически собирает метрики без изменения бизнес-кода
🔹 Production-мышление: Как правильно именовать метрики, контролировать cardinality тегов и готовить данные для Prometheus

Исходный код проекта на GitHub очень ждет Ваших звезд ☺️

Ссылка на Youtube
Ссылка на Рутьюб

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3🆒1
Всегда было любопытно, зачем таким девушкам мой канал про Java 😨

Вот честно? Неужто они Java ИЗУЧАЮТ? 🆘

P.S. Девушка покинула канал 😭
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3🔥2🤓1
История IT-технологий сегодня — 09 Февраля

ℹ️ Кто родился в этот день

Буркхард Хайм (нем. Burkhard Heim, 9 февраля 1925—14 января 2001) — немецкий физик-теоретик. В 1950-х годах разработал собственную квантовую теорию — теория Хайма (обнародована в 1957) — на основе теории относительности Альберта Эйнштейна.[1]

Предполагается, что на основе его теории (или теорий, разработанных в дальнейшем), человечество сможет строить корабли, способные достичь планет Солнечной системы за несколько часов. Предполагается, что с помощью так называемого «прыжка в гиперпространство» можно будет долететь к звезде, лежащей в десятке световых лет от Земли, за 80 дней по земному и корабельному времени.[2]

Буркхард Хайм не знал английского и не публиковал свои выкладки на нём; по этой причине его теория до сих пор не слишком известна среди физиков.



🌐 Знаковые события

1959 – Первая межконтинентальная баллистическая ракета Р-7 «Семёрка» принята на вооружение в Плесецке , СССР .


#Biography #Birth_Date #Events #09февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #003]

Тема: Никогда не используйте float и double для точных расчетов с деньгами. Используйте BigDecimal или целые числа (копейки, центы).

Проблема: Типы с плавающей запятой (float и double) реализуют двоичную арифметику IEEE 754 и не могут точно представлять большинство десятичных дробей. Это приводит к ошибкам округления и потере точности уже при простейших арифметических операциях.

Данная особенность является фундаментальной, а не багом языка. Например, результат вычисления 0.1 + 0.2 в типе double не будет равен 0.3, а составит 0.30000000000000004. В финансовых, бухгалтерских и любых других расчетах, где важна точность до минимальной единицы (копейки, цента), такие ошибки неприемлемы. Они накапливаются при множественных операциях, приводя к существенным расхождениям в итоговых суммах, что является критическим дефектом.

Решение: Для точных десятичных вычислений необходимо использовать тип java.math.BigDecimal, который предназначен для представения произвольной точности знаков после запятой и предоставляет полный контроль над округлением. Альтернативный, высокопроизводительный подход — выполнять все расчеты в целочисленных типах (long, int), оперируя минимальными единицами валюты (например, копейками, а не рублями).

Это исключает саму возможность появления дробной части в промежуточных вычислениях.


import java.math.BigDecimal;
import java.math.RoundingMode;

public class MonetaryCalculation {
public static void main(String[] args) {
//Антипаттерн: Ошибка округления.
double dollars = 1.00;
double centsToAdd = 0.10;
for (int i = 0; i < 10; i++) {
dollars += centsToAdd; // Приблизительное вычисление
}
System.out.println("Double result: " + dollars); // Выведет ~2.0999999999999996

//Решение 1: Использование BigDecimal (с конструктором из String!).
BigDecimal bigDollars = new BigDecimal("1.00");
BigDecimal bigCents = new BigDecimal("0.10");
for (int i = 0; i < 10; i++) {
bigDollars = bigDollars.add(bigCents); // Точное вычисление
}
System.out.println("BigDecimal result: " + bigDollars); // Точно 2.00

// Важно: Задание масштаба и режима округления для операций.
BigDecimal a = new BigDecimal("10.00");
BigDecimal b = new BigDecimal("3.00");
BigDecimal division = a.divide(b, 2, RoundingMode.HALF_UP); // 3.33
System.out.println("Division with rounding: " + division);

//Решение 2: Использование целых чисел (в копейках).
long balanceInKopecks = 100L; // 1 рубль = 100 копеек
long kopecksToAdd = 10L; // 10 копеек
for (int i = 0; i < 10; i++) {
balanceInKopecks += kopecksToAdd;
}
double resultInRubles = balanceInKopecks / 100.0; // Преобразование для вывода
System.out.println("Long (kopecks) result: " + resultInRubles); // Точно 2.0
}
}


Объяснение: Ключевой нюанс при работе с BigDecimal — использование конструктора, принимающего String. Конструктор BigDecimal(double) также подвержен ошибкам представления, так как передаваемое ему значение double уже содержит погрешность. BigDecimal является неизменяемым (immutable), каждая операция возвращает новый объект.

Он требует явного указания MathContext или RoundingMode для операций, которые могут привести к бесконечной десятичной дроби (например, деление), что делает вычисления полностью контролируемыми. Целочисленный подход (long) лишен накладных расходов на создание объектов и сложную арифметику, поэтому он предпочтителен в высоконагруженных системах, но требует аккуратного ручного управления переполнением и преобразованием для отображения.


#Java #советы
👍9🔥1
Что выведет код?

public class Task090226 {
public static void main(String[] args) {
double price = 0.10;
double total = 0.00;
int items = 0;

for (int i = 0; i < 10; i++) {
total += price;
}

System.out.println(total == 1.00);
System.out.println(total);
}
}


#Tasks
👍2
👍2🤯1
Что такое класс-загрузчик (ClassLoader) 🤓

Ответ:

ClassLoader
— это часть JVM, отвечающая за динамическую загрузку классов в память во время выполнения.

Загрузка происходит иерархически и по принципу делегирования.

Существует три основных встроенных загрузчика:
- Bootstrap ClassLoader (загружает классы Java, написан на C++),
- Extension ClassLoader (загружает классы из jre/lib/ext),
- Application/System ClassLoader (загружает классы из classpath приложения).

Разработчики могут создавать свои загрузчики, наследуясь от ClassLoader, что используется, например, в сервлет-контейнерах (Tomcat) или для реализации горячего перезапуска кода.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
История IT-технологий сегодня — 10 Февраля

ℹ️ Кто родился в этот день

Уолтер Хаузер Браттейн (англ. Walter Houser Brattain; 10 февраля 1902 — 13 октября 1987) — американский физик, лауреат Нобелевской премии по физике в 1956 году «за исследования полупроводников и открытие транзисторного эффекта» (совместно с Уильямом Брэдфордом Шокли и Джоном Бардином).


🌐 Знаковые события

1996 — начался первый шахматный матч между суперкомпьютером IBM Deep Blue и Гарри Каспаровым (со счётом 4—2 победил Г. Каспаров).

2009 — на орбите Земли произошло первое столкновение искусственных спутников за всю историю космонавтики. Столкновение произошло над территорией Российской Федерации (над полуостровом Таймыр, над точкой 72,5° с. ш., 97,9° в. д.), на высоте 788,6 километра. Два спутника во время вращения вокруг Земли со скоростью около 7,5 км/с столкнулись на относительной скорости свыше 10 км/с. Искусственные спутники — «Космос-2251», принадлежавший Космическим войскам России, выведенный на орбиту в 1993 году и функционировавший до 1995 года, и Iridium 33, один из 72 спутников международного оператора спутниковой телефонной связи «Иридиум», запущенный на орбиту в 1997 году, в результате столкновения разрушились полностью. Масса американского спутника «Иридиум» составляла 600 кг, а российского аппарата «Космос-2251» — 900 кг. В результате столкновения образовалось около 600 обломков.


#Biography #Birth_Date #Events #10февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 8. Stream API и функциональный стиль в Java

Глава 1: Философский фундамент. От шагов к преобразованиям

Практика: Рефакторинг мышления в «Библиотеке»

Задача: Найти книги автора «X», отсортировать по году издания, вернуть названия 3 самых старых.

Stream API и функциональный стиль в Java, это один из самых мощных инструментов современного Java, который позволяет писать код более выразительно, лаконично и эффективно. Но прежде чем погружаться в синтаксис Stream, важно понять философский фундамент: переход от императивного стиля (шаг за шагом, с управлением состоянием) к декларативному (описание, что нужно, без деталей как).

Сегодня мы проведем рефакторинг мышления на примере проекта «Библиотека»: решим задачу поиска книг автора "X", сортировки по году и возврата названий 3 самых старых. Мы сделаем это в два шага — императивно и декларативно (мысленно), чтобы вы почувствовали разницу.


Подготовка к уроку

Перед началом убедитесь, что ваш проект «Библиотека» готов: класс Book с полями title, author, year и геттерами, класс Library с List<Book> books и методами добавления/вывода. Добавьте 10–15 книг с разными авторами, включая автора "X" с минимум 5 книгами разных годов.

Импортируйте пакеты: В Library.java импортируйте java.util.Comparator, java.util.ArrayList.

Задача — фильтрация, сортировка, отображение и ограничение. Императивно — шаг за шагом с временными коллекциями. Декларативно — описание цепочки преобразований.


Шаг 1: Императивный подход

В императивном стиле вы описываете "как" сделать: создаёте временные структуры, управляете циклами, изменяете состояние.

Создайте метод findOldestBooksByAuthorImperative(String author, int limit) в Library:
Возвращает List<String> — названия limit самых старых книг автора.
Создайте временный List<Book> filteredBooks = new ArrayList<>();.
Переберите books: for (Book b : books) if (b.getAuthor().equals(author)) filteredBooks.add(b);.
Отсортируйте filteredBooks по году: filteredBooks.sort(Comparator.comparingInt(Book::getYear)); (по возрастанию — самые старые сначала).
Создайте результат List<String> titles = new ArrayList<>();.
Переберите filteredBooks: for (int i = 0; i < Math.min(limit, filteredBooks.size()); i++) titles.add(filteredBooks.get(i).getTitle());.
Верните titles.

Тестирование:
Вызовите с author = "X", limit = 3 — получите 3 самых старых названия.
Проверьте на пустом списке или без книг автора — вернёт пустой list.

Анализ императивного подхода (объёмно):
2 временных коллекции: filteredBooks (для фильтра) и titles (для отображения) — overhead памяти O(n).
3 точки изменения состояния: add в filtered, sort (мутирует list), add в titles — каждая может вызвать ошибки (null, index out of bounds).
Явное управление индексами: Math.min и i < limit — ручной контроль, error-prone (off-by-one).

Процессы внутри:
Фильтр: O(n) перебор, add O(1).
Sort: Timsort O(n log n), мутирует.
Отображение: O(limit) цикл.

Ловушки: Если books изменяется во время перебора — ConcurrentModificationException; sort по году ascending — для "старых" (маленький год) правильно.
Преимущества: Ясно "как" работает, контроль.
Недостатки: Verbose, mutable state, трудно parallelize.


#Java #для_новичков #beginner #Практика #stream_api #declarative
👍4
Шаг 2: Декларативный подход (мысленно)

В декларативном стиле вы описываете "что" нужно: цепочку преобразований данных, без деталей реализации. Это фундамент Stream API — думайте о данных как о потоке, который фильтруется, сортируется, отображается.

Мысленно опишите цепочку в комментариях метода findOldestBooksByAuthorDeclarative(String author, int limit):
Фильтр: Выбрать книги, где author == "X".
Сортировка: Упорядочить по году издания (ascending для старых).
Отображение: Преобразовать в названия (title).
Ограничение: Взять первые 3.

Не пишите код — только подумайте и запишите в комментарии, как это выглядело бы декларативно (в стиле Stream, но без синтаксиса).

Тестирование: Не нужно — это мысленный рефакторинг.

Анализ декларативного подхода (объёмно):

Нет временных коллекций: Цепочка преобразований на потоке — lazy, intermediate operations не создают полные списки.
Нет изменения состояния: Immutable pipeline — данные не мутируются, только преобразуются.
Нет индексов: Ограничение limit(3) — declarative, без ручного Math.min.
Процессы внутри: Filter O(n), sort O(n log n), map O(n), limit O(1).
Ловушки: Lazy evaluation — sort не выполняется, пока не terminal operation (limit).
Преимущества: Кратко, читаемо, легко паралелить (stream().parallel()).
Недостатки: Трудно дебажить (intermediate steps hidden), overhead для малого n.

Вывод: Декларативный подход заставляет думать о данных как о целом (поток), а не об отдельных элементах (циклы). Это рефакторит мышление к функциональному стилю, где фокус на "что", а не "как".
Тестирование и отладка

Императивный метод: Добавьте 10 книг, вызовите — проверьте результат.
Декларативный: Подумать, как цепочка упростит код (меньше строк, меньше ошибок).
Сравнение: Замерьте время для 1000 книг — императивный vs мысленный (для декларативного — представьте Stream).


Полезные советы для новичков

Императив: Для низкоуровневого программирования и высокого контроля кода.
Декларатив: Для более высокого уровня программирования и читабельности.
Рефакторинг: Начните с императивного вида, перейдите к декларативному.

Практическое задание

Реализуйте императивный метод.
Опишите декларативно в комментариях.
Добавьте задачу: Найти 5 самых новых книг жанра "Y" — в двух стилях.


#Java #для_новичков #beginner #Практика #stream_api #declarative
👍4
Что выведет код?

import java.util.Optional;

public class Task100226 {
public static void main(String[] args) {
Optional<String> opt = Optional.ofNullable(null)
.map(s -> s.toString())
.or(() -> Optional.of("DEFAULT"))
.filter(s -> s.length() > 3);

System.out.println(opt.orElse("FALLBACK"));
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
42%
DEFAULT
25%
FALLBACK
13%
null
21%
Исключение
👍2
Объясните, что такое потокобезопасность (thread safety). Как ее достичь? 🤓

Ответ:

Потокобезопасность
— это свойство объекта или кода корректно работать в условиях многопоточного доступа, когда несколько потоков выполняют его одновременно.

Без синхронизации это может привести к состоянию гонки (race condition) и повреждению данных.

Основные способы достижения:
1) Использование synchronized методов или блоков.
2) Использование классов из java.util.concurrent (например, ConcurrentHashMap, AtomicInteger).
3) Использование неизменяемых (immutable) объектов.
4) Ограничение доступа к общим данным (локальные переменные, ThreadLocal).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
История IT-технологий сегодня — 11 Февраля

ℹ️ Кто родился в этот день

То́мас А́лва Э́дисон (англ. Thomas Alva Edison; 11 февраля 1847, Майлан, штат Огайо — 18 октября 1931, Уэст-Ориндж, штат Нью-Джерси) — американский инженер, изобретатель и предприниматель. Создатель фонографа; усовершенствовал телеграф, телефон, киноаппаратуру, разработал один из первых коммерчески успешных вариантов электрической лампы накаливания. Получил в США 1093 патента и около 3 тысяч — в других странах мира.

Ричард Уэсли Хэмминг (11 февраля 1915 года, Чикаго — 7 января 1998 года, Монтерей)американский математик, работы которого в сфере теории информации оказали существенное влияние на компьютерные науки и телекоммуникации. Основной вклад — т. н. код Хэмминга, а также расстояние Хэмминга.


🌐 Знаковые события

1970 — выведен на орбиту первый японский искусственный спутник Земли «Осуми».

2001 — создан компьютерный вирус Anna Kournikova. Он предлагал пользователям открыть почтовое сообщение, в котором предположительно было изображение Анны Курниковой, хотя на самом деле там была вредоносная программа. Если это удавалось, программа рассылала себя всем контактам в адресной книге Microsoft Outlook. Червь отправлял сообщение: «Привет: Посмотри на это!» с прикрепленным файлом «AnnaKournikova.jpg.vbs». При запуске файл не отображал фотографию Анны Курниковой, вместо этого запуская скрипт на Visual Basic, который пересылал себя всем контактам в адресной книге жертвы. Червь был создан с использованием простой и широко доступной программы на Visual Basic «Worm Generator», разработанной аргентинским программистом под ником «[K]Alamar». Похожий на вирус «ILOVEYOU» 2000 года, червь «Anna Kournikova» не портил данные на зараженном компьютере.


#Biography #Birth_Date #Events #11февраля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
[Совет по Java #004]

Тема: При сравнении строк, которые могут быть null, вызывайте equals на константе или используйте Objects.equals().

Проблема: Вызов метода equals(Object) на потенциально null-ссылке приводит к выбрасыванию исключения NullPointerException (NPE).

Это классическая ошибка, возникающая при сравнении переменной, полученной извне (например, из пользовательского ввода, базы данных или API), с ожидаемым строковым литералом. Разработчик, вызывая variable.equals("CONST"), предполагает, что результатом будет false, если строки не равны, но в случае, когда variable равна null, поток выполнения прерывается неконтролируемым исключением. Такая ситуация нарушает принцип устойчивости (robustness) кода и требует дополнительных проверок, что увеличивает когнитивную нагрузку и загромождает логику условными операторами.

Решение: Существуют две основные идиомы, позволяющие безопасно сравнивать строки при возможном null-значении.

1. Вызов метода equals на известной, гарантированно не-null константе или литерале: "CONST".equals(variable).
2. Использование статического утилитного метода java.util.Objects.equals(Object a, Object b), который был введен в Java 7 специально для безопасного сравнения двух объектов, каждый из которых может быть null. Этот метод реализует сравнение с полной проверкой на null и возвращает true, если оба аргумента null, или результат вызова a.equals(b) в ином случае.

import java.util.Objects;

public class SafeStringComparison {
public static void main(String[] args) {
String constantValue = "EXPECTED_VALUE";
String variableFromExternalSource = getPossiblyNullString(); // Может вернуть null

//Антипаттерн: Риск NullPointerException.
try {
boolean unsafeResult = variableFromExternalSource.equals(constantValue);
} catch (NullPointerException e) {
System.out.println("NPE: Прямой вызов equals на null-переменной.");
}

//Решение 1: Вызов equals() на строковой константе.
boolean safeResult1 = constantValue.equals(variableFromExternalSource);
System.out.println("Сравнение через константу: " + safeResult1); // Безопасно вернет false.

//Решение 2: Использование Objects.equals().
boolean safeResult2 = Objects.equals(constantValue, variableFromExternalSource);
System.out.println("Сравнение через Objects.equals(): " + safeResult2); // Также безопасно.

// Пример с двумя null-значениями:
String nullString = null;
boolean resultForTwoNulls = Objects.equals(nullString, null); // Возвращает true.
System.out.println("Objects.equals(null, null): " + resultForTwoNulls);
}

private static String getPossiblyNullString() {
// Имитация логики, которая может вернуть null.
return Math.random() > 0.5 ? "SOME_VALUE" : null;
}
}


Объяснение: Вызов "CONST".equals(variable) является защищенным, потому что литерал "CONST" — это валидный, существующий в пуле строк объект, на котором можно безопасно вызвать любой метод.

Его реализация equals включает проверку на null для переданного аргумента. Метод Objects.equals() абстрагирует эту логику, делая код более симметричным и читаемым, особенно при сравнении двух переменных, каждая из которых может быть null. Это универсальное решение, применимое не только к строкам, но и к любым объектам. Важно подчеркнуть, что для случая, когда null считается неравным любому значению (включая другой null), необходимо использовать явную проверку variable != null && variable.equals(constant).

Однако в большинстве сценариев логического сравнения Objects.equals() предоставляет корректную и безопасную семантику.

#Java #советы
👍7
Что выведет код?

import java.util.*;

public class Task110226 {
public static void main(String[] args) {
String str = null;
List<String> list = new ArrayList<>();

System.out.println(str == null);
System.out.println("null".equals(str));
System.out.println(Objects.equals(str, "test"));
System.out.println(list.equals(str));
}
}


#Tasks
👍4