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
Глубокое изучение типа данных long в Java: сравнение с byte, short и int

Тип данных long в Java — это 64-битное целое число со знаком. Он используется, когда диапазона int недостаточно для представления чисел, особенно в финансовых расчётах, временных метках, системах счёта, генерации идентификаторов и других задачах, связанных с большими значениями.

Размер и диапазон

long занимает 8 байт (64 бита) и позволяет представлять значения от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Это примерно ±9 квинтиллионов.

Для сравнения:
byte: 1 байт, от -128 до 127
short: 2 байта, от -32 768 до 32 767
int: 4 байта, от -2.1 млрд до 2.1 млрд


Когда ни byte, ни short, ни даже int не покрывают диапазон значений — long становится необходимостью.

Внутреннее представление

Как и остальные знаковые целые типы в Java, long реализован через дополнительный код (two’s complement). Старший (64-й) бит отвечает за знак: 0 — положительное число или ноль, 1 — отрицательное. Всё остальное аналогично другим типам, но с удвоенным количеством бит по сравнению с int.

Работа с памятью

long — примитивный тип, поэтому:
локальные переменные long хранятся в стеке;
поля объектов — в куче;
память управляется виртуальной машиной Java автоматически: выделяется при создании переменной, освобождается при выходе из области видимости (для локальных) или сборке мусора (для объектов).
Массив long[] из миллиона элементов потребует 8 МБ памяти, тогда как int[] — всего 4 МБ, а byte[] — 1 МБ. Это важно учитывать при проектировании систем, чувствительных к объёму памяти.


Арифметика и автоматическое повышение типов

Арифметика с long происходит без повышения до int, в отличие от byte и short, которые автоматически продвигаются до int в выражениях. Однако, при использовании int и long в одном выражении, результат будет long.

Пример:
int a = 1_000_000_000;
int b = 3;
long result = a * b; // результат может быть неверным!


Здесь сначала перемножаются два int, а потом результат приводится к long. Чтобы избежать переполнения, нужно один из операндов явно сделать long:
long result = (long) a * b; // безопасно


Переполнение и wraparound

Тип long, несмотря на огромный диапазон, всё равно может переполниться. Если результат выходит за пределы диапазона, он не вызывает исключения, а оборачивается по модулю 2⁶⁴:
long x = Long.MAX_VALUE;
x++;
System.out.println(x); // выведет отрицательное число: Long.MIN_VALUE
Это поведение аналогично тому, что происходит с int, short и byte, но требует повышенного внимания при работе с предельными значениями.


Беззнаковость и побитовая работа

В Java нет беззнакового long. Для имитации поведения 64-битного беззнакового числа можно использовать BigInteger, либо применять побитовые маски и операторы, чтобы интерпретировать старшие биты корректно.

Например:
long l = -1L;
String binary = Long.toBinaryString(l); // все 64 бита — единицы


С Java 8 появилась поддержка методов для unsigned арифметики: Long.divideUnsigned, Long.toUnsignedString и т.п., но сами типы остались только знаковыми.

Сравнение с младшими типами

byte и short — экономны по памяти, но быстро переполняются. Используются в низкоуровневом коде, где важен каждый байт.
int — универсален, безопасен по диапазону для большинства задач.
long — выбор для работы с большими числами, когда int недостаточен.
Однако, использование long без необходимости может привести к перерасходу памяти — особенно в коллекциях, структурах данных, больших массивах. Используйте long там, где это действительно оправдано.


Особенности и рекомендации

При передаче литералов типа long, добавляйте суффикс L, чтобы избежать ошибочного приведения к int:
long big = 3000000000L; // без 'L' это вызовет переполнение int
Проверяйте выражения на потенциальное переполнение при арифметике. Для критических расчётов используйте Math.addExact(), Math.multiplyExact() — они выбрасывают ArithmeticException при переполнении.
Если требуется более 64 бит — используйте BigInteger. Это объектный тип, не примитив, но позволяет работать с произвольно большими целыми числами.



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

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

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

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

public class Task220525 {
public static void main(String[] args) {
long a = 1_000_000_000 * 3_000;
long b = 1_000_000_000L * 3_000;
System.out.println(a == b);
}
}


#Tasks
Зачем нужен метод main в Java? 🤓

Ответ: Метод public static void main(String[] args) — точка входа в программу. JVM вызывает его при запуске приложения. Он должен быть public и static, чтобы JVM могла его вызвать без создания экземпляра класса.

В новых версиях Java (21 и выше) метод main не обязателен в строгом виде для простых программ благодаря неименованным классам и упрощённым методам main. Однако для большинства реальных приложений и для совместимости с более ранними версиями Java традиционный метод public static void main(String[] args) всё ещё необходим.

#собеседование
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
Работа с JsonElement и полезные советы в Gson

JsonElement, JsonObject, JsonArray — работа с JSON вручную

Библиотека Gson предоставляет классы JsonElement, JsonObject и JsonArray для ручного разбора и модификации JSON.

Основные классы:
JsonElement — базовый абстрактный класс, представляющий любой элемент JSON (объект, массив, примитив).
JsonObject — подкласс JsonElement, представляющий JSON-объект ({ ... }).
JsonArray — подкласс JsonElement, представляющий JSON-массив ([ ... ]).


Пример разбора JSON вручную:
import com.google.gson.*;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;

public class ManualJsonParsing {
public static void main(String[] args) {
String json = """
{
"name": "John",
"age": 30,
"skills": ["Java", "Kotlin"],
"address": {
"city": "New York",
"zip": "10001"
}
}
""";

JsonElement rootElement = JsonParser.parseString(json);

// Проверяем, что корневой элемент — JsonObject
if (rootElement.isJsonObject()) {
JsonObject rootObject = rootElement.getAsJsonObject();

// Доступ к примитивным полям
String name = rootObject.get("name").getAsString();
int age = rootObject.get("age").getAsInt();

System.out.println("Name: " + name);
System.out.println("Age: " + age);

// Доступ к массиву
JsonArray skills = rootObject.get("skills").getAsJsonArray();
System.out.println("Skills:");
for (JsonElement skill : skills) {
System.out.println("- " + skill.getAsString());
}

// Доступ к вложенному объекту
JsonObject address = rootObject.get("address").getAsJsonObject();
String city = address.get("city").getAsString();
String zip = address.get("zip").getAsString();

System.out.println("City: " + city);
System.out.println("Zip: " + zip);
}
}
}


Когда не знаешь точную структуру JSON

Если структура JSON может меняться, можно проверять наличие полей и их типы:
JsonObject userObject = rootElement.getAsJsonObject();

// Проверка наличия поля
if (userObject.has("email")) {
String email = userObject.get("email").getAsString();
System.out.println("Email: " + email);
} else {
System.out.println("Email not provided");
}

// Проверка типа поля
JsonElement ageElement = userObject.get("age");
if (ageElement != null && !ageElement.isJsonNull()) {
if (ageElement.isJsonPrimitive() && ageElement.getAsJsonPrimitive().isNumber()) {
int age = ageElement.getAsInt();
System.out.println("Age: " + age);
} else {
System.out.println("Age is not a number");
}
}


Добавление и изменение значений вручную

JsonObject user = new JsonObject();
user.addProperty("name", "Alice"); // Добавление строки
user.addProperty("age", 25); // Добавление числа
user.addProperty("isActive", true); // Добавление булева значения

// Добавление массива
JsonArray languages = new JsonArray();
languages.add("Java");
languages.add("Python");
user.add("languages", languages);

// Добавление вложенного объекта
JsonObject address = new JsonObject();
address.addProperty("city", "London");
address.addProperty("country", "UK");
user.add("address", address);

user.addProperty("age", 26); // Перезаписываем age

System.out.println(new Gson().toJson(user));


Преобразование между JsonElement и Java-объектами

Использование fromJson и toJsonTree

Из JSON в POJO (fromJson)
Gson gson = new Gson();
String json = "{\"name\":\"Bob\",\"age\":40}";

// Прямое преобразование строки в объект
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName()); // Bob

// Если есть JsonElement, можно использовать его
JsonElement jsonElement = JsonParser.parseString(json);
Person personFromElement = gson.fromJson(jsonElement, Person.class);


#Java #middle #Gson #JsonElement #JsonObject #JsonArray
Преобразование между JsonElement и Java-объектами

Использование fromJson и toJsonTree

Из JSON в POJO (fromJson)
Gson gson = new Gson();
String json = "{\"name\":\"Bob\",\"age\":40}";

// Прямое преобразование строки в объект
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName()); // Bob

// Если есть JsonElement, можно использовать его
JsonElement jsonElement = JsonParser.parseString(json);
Person personFromElement = gson.fromJson(jsonElement, Person.class);


Из POJO в JsonElement (toJsonTree)

Person person = new Person("Bob", 40);
JsonElement personElement = gson.toJsonTree(person);

// Теперь можно модифицировать JSON
if (personElement.isJsonObject()) {
JsonObject personObject = personElement.getAsJsonObject();
personObject.addProperty("email", "bob@example.com");
}

String modifiedJson = gson.toJson(personElement);
System.out.println(modifiedJson);


Как конвертировать JsonElement обратно в POJO
JsonObject userJson = new JsonObject();
userJson.addProperty("name", "Eve");
userJson.addProperty("age", 28);

// Преобразование JsonObject в POJO
Gson gson = new Gson();
Person person = gson.fromJson(userJson, Person.class);
System.out.println(person.getName()); // Eve


Полезные советы

Проверка isJsonNull() перед чтением значений
JsonElement element = jsonObject.get("optionalField");
if (element != null && !element.isJsonNull()) {
String value = element.getAsString();
}


Обработка разных типов полей
JsonElement dynamicField = jsonObject.get("dynamicField");
if (dynamicField.isJsonPrimitive()) {
JsonPrimitive primitive = dynamicField.getAsJsonPrimitive();
if (primitive.isString()) {
// Обработка строки
} else if (primitive.isNumber()) {
// Обработка числа
}
} else if (dynamicField.isJsonArray()) {
// Обработка массива
}


Использование JsonParser для разбора строки

JsonElement parsed = JsonParser.parseString(jsonString);


Создание сложных JSON структур
JsonObject response = new JsonObject();
JsonArray items = new JsonArray();

JsonObject item1 = new JsonObject();
item1.addProperty("id", 1);
item1.addProperty("name", "Item 1");

items.add(item1);
response.add("items", items);
response.addProperty("count", 1);

String jsonOutput = gson.toJson(response);


Эти методы позволяют гибко работать с JSON, когда точная структура неизвестна или требуется динамическая модификация данных.

#Java #middle #Gson #JsonElement #JsonObject #JsonArray
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

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

Выбираем новую тему!

Что то как-то неактивно! Неужто нет вопросов??? Пишите, все что не понятно! Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?

public class Task230525 {
public static void main(String[] args) {
String str = " Hello ";
str = str.trim().replace('H', 'J').substring(1, 4);
System.out.println(str);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
38%
"ell"
21%
"Jel"
3%
"Hel"
38%
"ello "
Java c днем рождения!

23 мая 1995 года Sun Microsystems официально представила язык Java на конференции SunWorld. И вот уже 30 лет как многие люди изучают этот язык, пишут на нем приложения, игры, бекенд для сайтов и финтехов!

По этому поводу Oracle запустил
шестичасовой стрим про эволюцию Java! Смотрим!
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое класс и объект в Java? 🤓

Ответ:
Класс — это шаблон, описывающий свойства (поля) и поведение (методы) объектов.
Объект — экземпляр класса, созданный с помощью оператора new. Например, Car car = new Car(); создает объект car на основе класса Car.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Применение паттернов проектирования в Java

Паттерны проектирования находят широкое применение в Java благодаря её объектно-ориентированной природе и богатой экосистеме.

1. Разработка корпоративных приложений

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

Например:
Фреймворк Spring: Использует паттерн "Внедрение зависимостей" для управления жизненным циклом объектов. Это позволяет разработчикам сосредоточиться на бизнес-логике, а не на создании и настройке объектов.
Hibernate: Применяет паттерн "Фасад" для упрощения работы с базой данных, скрывая сложность SQL-запросов за простым API.


2. Создание библиотек и API

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

Например:
В Java API паттерн "Итератор" используется в коллекциях (например, List или Set), чтобы обеспечить единообразный способ перебора элементов.
Паттерн "Фабричный метод" применяется в классе java.util.Calendar, где метод getInstance() создает объекты в зависимости от локализации.


3. Управление многопоточностью

Java широко используется для многопоточного программирования, и паттерны помогают управлять сложностью.

Например:
Паттерн "Синглтон" часто используется для создания единственного экземпляра менеджера ресурсов, такого как пул соединений с базой данных.
Паттерн "Монитор" встроен в Java на уровне языка (через ключевое слово synchronized), что упрощает синхронизацию потоков.


4. Упрощение тестирования

Паттерны способствуют написанию тестируемого кода. Например, использование "Внедрения зависимостей" позволяет легко заменять реальные компоненты на заглушки (mocks) во время тестирования.


Проблемы и критика паттернов проектирования

Хотя паттерны проектирования чрезвычайно полезны, их применение не лишено недостатков:
Избыточная сложность: Иногда использование паттерна усложняет код там, где можно было бы обойтись более простым решением.
Злоупотребление: Новички могут применять паттерны везде, даже когда они не нужны, что приводит к "паттерн-ориентированному" программированию.
Контекстная зависимость: Не все паттерны подходят для всех ситуаций. Например, "Синглтон" может быть проблематичным в многопоточных приложениях, если не позаботиться о синхронизации.

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



Для более подробного изучения паттернов, предлагаю к просмотру 4 ранее записанных видео:

Порождающие паттерны проектирования на Java
Структурные паттерны проектирования на Java
Поведенческие паттерны проектирования на Java. Часть 1
Поведенческие паттерны проектирования на Java. Часть 2

Для полезного чтения, рекомендую сайт (может не работать без VPN)

#Java #для_новичков #beginner #on_request #patterns
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!

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

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

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

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


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


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

Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM