Java for Beginner
677 subscribers
546 photos
155 videos
12 files
837 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Примитивные типы данных в Java

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


1. Философия проектирования

При разработке Java было принято решение о введении примитивных типов как части ядра языка, несмотря на общий объектно-ориентированный подход.

Это обусловлено несколькими причинами:
Минимизация накладных расходов. Объекты требуют размещения в куче, участия в сборке мусора и хранения служебной информации. Использование объектов для представления простых значений, таких как числа или логические флаги, приводит к неоправданным издержкам по памяти и времени выполнения.
int x = 42;                  // примитив, 4 байта
Integer y = Integer.valueOf(42); // объект, ~16+ байт


Предсказуемость поведения. Размеры всех примитивных типов жёстко заданы и не зависят от платформы. Например, тип int всегда занимает 32 бита, в отличие от языков вроде C/C++, где размер целого числа может варьироваться в зависимости от архитектуры.
System.out.println(Integer.SIZE); // 32 — всегда


Соответствие аппаратному уровню. Примитивы напрямую сопоставимы с регистрами процессора и машинными инструкциями. Это обеспечивает аппаратное ускорение вычислений и минимальные издержки при выполнении арифметических операций.
int sum = a + b; // напрямую транслируется в инструкцию iadd в JVM


2. Низкоуровневое представление

Каждый примитивный тип в Java представлен последовательностью битов и интерпретируется согласно определённой модели:
Целочисленные типы (byte, short, int, long) хранятся в представлении с дополнительным кодом (two’s complement). Это обеспечивает корректную работу с отрицательными значениями.
int a = -1;
System.out.println(Integer.toBinaryString(a)); // 11111111111111111111111111111111


Типы с плавающей точкой (float, double) соответствуют стандарту IEEE 754.
double d = 3.14;
System.out.println(Double.toHexString(d)); // 0x1.91eb851eb851fp1


Символьный тип (char) реализован как 16-битное беззнаковое значение.
char ch = 'Ж';
System.out.println((int) ch); // 1046 — Unicode-код символа


Логический тип (boolean) не имеет фиксированного размера, но часто реализуется как int.
boolean flag = true;
if (flag) {
System.out.println("Включено");
}


3. Размещение в памяти и управление временем жизни


Примитивные переменные в Java хранятся по-разному в зависимости от контекста:

Локальные переменные методов размещаются в стеке вызовов.
void compute() {
int localCounter = 0; // хранится в стеке
}


Поля объектов хранятся непосредственно в их структуре в куче.
class Data {
int x = 10; // хранится в объекте в куче
}


4. Механизмы выполнения в JVM

Для каждого примитива в спецификации JVM предусмотрены специализированные инструкции байт-кода.
int x = 2, y = 3;
int result = x * y; // используется imul в байт-коде


Примитивы не участвуют в иерархии наследования, не реализуют интерфейсы и не имеют методов.
int a = 5;
// a.compareTo(3); // ошибка компиляции — у int нет методов


5. Обёртки и автоупаковка

Для интеграции примитивов в объектную модель Java были введены соответствующие классы-обёртки:

Integer wrapped = 42;   // автоупаковка
int raw = wrapped; // автораспаковка


Нужно учитывать возможные проблемы:
Integer i = null;
// int val = i; // NullPointerException при распаковке


6. Ограничения примитивов

Примитивы нельзя использовать напрямую в обобщённых коллекциях.
List<Integer> list = new ArrayList<>();
list.add(10); // автоматическая упаковка int → Integer


Сравнение обёрток может вести к неожиданным результатам:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (значения до 127 хранятся в кэше)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false (разные объекты)


Производительность может снижаться из-за постоянной упаковки/распаковки:
for (int i = 0; i < 1000; i++) {
list.add(i); // создаётся 1000 объектов Integer
}


#Java #для_новичков #beginner #primitive_types
Что выведет код?

public class Task120525 {
public static void main(String[] args) {
byte a = 100;
byte b = 30;
byte c = (byte) (a + b);
System.out.println(c);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
4%
30
30%
130
51%
-126
15%
Ошибка компиляции
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Gson: основы сериализации и десериализации

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

Gson — это библиотека от Google для работы с JSON в Java.


Она позволяет:
Преобразовывать Java-объекты в JSON (сериализация).
Восстанавливать Java-объекты из JSON (десериализация).


Почему Gson?
Простота: минимум кода для работы.
Мощность: поддержка сложных структур (коллекции, вложенные объекты, generics).
Нет зависимостей: работает без дополнительных библиотек.


Пример JSON и его Java-представление

Допустим, у нас есть JSON:
{
"name": "John",
"age": 30,
"isDeveloper": true
}


Ему соответствует Java-класс:
public class Person {
private String name;
private int age;
private boolean isDeveloper;

// Конструктор, геттеры и сеттеры (обязательны для корректной работы)
public Person(String name, int age, boolean isDeveloper) {
this.name = name;
this.age = age;
this.isDeveloper = isDeveloper;
}

// Геттеры и сеттеры (опущены для краткости, но должны быть)
}


Подключение Gson

Через Maven (добавить в pom.xml):

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- Актуальная версия на момент 2025 года -->
</dependency>


Через Gradle (добавить в build.gradle):
implementation 'com.google.code.gson:gson:2.10.1'



2. Простая сериализация Java-объекта в JSON


Создание POJO

POJO (Plain Old Java Object) — простой Java-класс с полями, конструктором и геттерами/сеттерами.

Пример:
public class Book {
private String title;
private String author;
private double price;

public Book(String title, String author, double price) {
this.title = title;
this.author = author;
this.price = price;
}

// Геттеры (обязательны для сериализации)
public String getTitle() { return title; }
public String getAuthor() { return author; }
public double getPrice() { return price; }
}


Сериализация с помощью Gson.toJson()

Создаем объект Gson:
Gson gson = new Gson();


Сериализуем объект в JSON-строку:
Book book = new Book("Clean Code", "Robert Martin", 29.99);
String json = gson.toJson(book);


Выводим результат:

System.out.println(json);


Результат:
{"title":"Clean Code","author":"Robert Martin","price":29.99}


Как это работает?

Gson рефлективно анализирует поля класса.
Имена полей становятся ключами JSON.
Примитивы (int, boolean), строки (String) и числа с плавающей точкой (double) преобразуются в соответствующие JSON-типы.


Полный пример кода
import com.google.gson.Gson;

public class Main {
public static void main(String[] args) {
// Создаем объект
Book book = new Book("Clean Code", "Robert Martin", 29.99);

// Сериализуем в JSON
Gson gson = new Gson();
String json = gson.toJson(book);

// Выводим JSON
System.out.println(json);
}
}


Вывод:
{"title":"Clean Code","author":"Robert Martin","price":29.99}


Важные замечания

Поля должны быть private (или иметь геттеры).
Поля со значением null не включаются в JSON (если не настроено иначе).
Gson автоматически обрабатывает вложенные объекты и коллекции.


#Java #middle #Gson
Что выведет код?

public class Task130525 {
public static void main(String[] args) {
String s = "123abc";
int num = Integer.parseInt(s);
System.out.println(num);
}
}


#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Глубокое изучение типа данных byte в Java

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

Диапазон и внутреннее представление

Значения byte варьируются от -128 до 127. Это обусловлено использованием 8 бит и представления чисел в формате дополнительного кода (two's complement):

0: 00000000
127: 01111111
-1: 11111111
-128: 10000000

Самый старший бит (MSB) определяет знак: 0 — положительное число, 1 — отрицательное. Формат two's complement позволяет упростить реализацию арифметики на уровне процессора.

Как работает two's complement

Чтобы получить отрицательное значение, берут двоичное представление положительного числа, инвертируют биты и прибавляют единицу:

Пример:
5 → 00000101
~5 → 11111010
+1 → 11111011 → это -5

Этот подход ведет к асимметрии диапазона: -128 можно представить, а +128 — нет, так как 8 бит не хватает.


Размещение в памяти

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

Если byte используется как поле класса, то память выделяется при создании объекта в куче. Освобождение происходит автоматически через сборщик мусора JVM.

Поведение в арифметике и преобразования

Одной из ключевых особенностей byte является то, что в арифметических операциях он автоматически приводится к int. Это значит, что результат выражений типа byte + byte — это int, и его необходимо явно привести обратно к byte, если нужно сохранить в переменной этого типа:
byte b1 = 100;
byte b2 = 30;
byte sum = b1 + b2; // ошибка компиляции
byte sum = (byte)(b1 + b2); // корректно


Переполнение (overflow)

Так как byte хранит только 8 бит, любые арифметические операции, выходящие за диапазон [-128; 127], приводят к оборачиванию значения:
byte b = 127;
b++; // теперь b = -128
Это не ошибка компиляции, но может привести к логическим багам, особенно если разработчик не учитывает граничные значения.


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

В Java отсутствует беззнаковый byte. Для получения значений в диапазоне 0–255 применяется побитовая маска:
byte b = -1;
int unsigned = b & 0xFF; // результат: 255
Это часто используется при работе с бинарными протоколами, изображениями, файлами и сетевыми буферами.


Применение


Экономия памяти. В массивах или структурах, где значения всегда укладываются в [-128; 127], использование byte позволяет экономить в 4 раза больше памяти по сравнению с int.
Работа с файлами и сетевыми потоками. Классы вроде InputStream и ByteBuffer оперируют byte[] для обработки бинарных данных.
Явное ограничение диапазона. Использование byte вместо int служит также как форма документации: переменная ограничена по смыслу и диапазону.


Инициализация и значения по умолчанию

Для полей класса byte значение по умолчанию — 0.
Для локальных переменных компилятор требует явной инициализации — использование необъявленного byte приведет к ошибке компиляции.


Потенциальные ошибки и рекомендации

Не забывайте про overflow при арифметике.
Используйте явное приведение типов при необходимости.
Помните, что byte[] — это массив чисел, не строка. Учитывайте кодировку, если работаете с текстом.
Для беззнаковой работы применяйте b & 0xFF.


Пример: работа с бинарным файлом
FileInputStream in = new FileInputStream("image.png");
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
in.close();


#Java #для_новичков #beginner #byte
Что выведет код?

public class Task140525 {
public static void main(String[] args) {
byte a = (byte) 0b10000000;
byte b = 1;
byte c = (byte) (a + b);
System.out.println(c);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
14%
-128
10%
129
52%
-127
24%
Ошибка компиляции
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