Java for Beginner
716 subscribers
660 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Как обрабатывать исключения в Stream API? 🤓

Ответ:
Stream API
не поддерживает проверяемые исключения напрямую, поэтому их нужно обрабатывать в лямбда-выражениях.

Пример:
List<String> files = Arrays.asList("file.txt");
files.stream()
.map(f -> {
try { return Files.readString(Paths.get(f)); }
catch (IOException e) { return "Error: " + e.getMessage(); }
})
.forEach(System.out::println);

Альтернатива — вынести логику в отдельный метод.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🗓 История IT сегодня — 14 августа


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

Ян Петерс (родился 14 августа 1976 года) — немецкий исследователь в области машинного обучения и робототехники; известен работой по обучению управлению для автономных роботов и объяснимым методам обучения в роботике.

Артур Джеффри Демпстер (англ. Arthur Jeffrey Dempster; 14 августа 1886 года, Торонто, — 11 марта 1950 года, Стюарт, Флорида)канадско-американский физик, член Национальной академии наук США (с 1937 года), в 1944 году избирался президентом Американского физического общества. Создатель первого современного масс-спектрометра (базирующегося на изобретении Ф. Астона), первооткрыватель нуклида урана 235U (в 1935 году). Значительную часть карьеры посвятил поиску стабильных изотопов химических элементов и определению их распространённости. Обнаружил большее количество стабильных изотопов, чем кто-либо другой (кроме Ф. Астона, открывшего это исследовательское поле).


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

1888 — американский инженер Оливер Шелленбергер патентует электрический счётчик.

1964 — с Байконура успешно был запущен космический аппарат Восток-2 / Космос-37 (Зенит-2) — ключевой этап в программе пилотируемой и спутниковой космонавтики СССР.

1984 — компания IBM выпустила PC DOS 3.0, одну из важных версий операционной системы, которую использовали на персональных компьютерах того времени.

Сегодня, 14 августа, день рождения Telegram. Мессенджеру исполняется 12 лет, так как он был впервые запущен для iOS 14 августа 2013 года.


#Biography #Birth_Date #Events #14Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Apache Kafka

Producer — гарантии, производительность, транзакции


Apache Kafka Producer — это клиентская компонента, ответственная за отправку сообщений в Kafka-кластер.

Основные конфиги: acks, linger.ms, batch.size, compression.type, buffer.memory
Продюсер настраивается через свойства в Properties объекте (в Java/Scala) или аналогичные в других клиентах. Эти конфиги определяют баланс между latency, throughput и durability.

- acks: Определяет уровень подтверждения от брокера. Возможные значения: 0 (fire-and-forget, нет подтверждения, минимальная latency, но возможна потеря данных при сбое), 1 (подтверждение от лидера, данные записаны на диск лидера, но не реплицированы), all (или -1, подтверждение после репликации на все ISR, максимальная durability). В памяти продюсера: при acks=all запрос блокируется до получения подтверждения от min.insync.replicas брокеров. Это влияет на throughput: acks=0 дает миллионы сообщений/сек, но без гарантий; acks=all снижает до сотен тысяч из-за ожидания репликации. Нюанс: при acks=all, если ISR сокращается (например, из-за лага фолловеров), продюсер может бросить MetadataException, требуя ручного вмешательства.

- linger.ms: Время ожидания перед отправкой батча (по умолчанию 0). Продюсер аккумулирует сообщения в памяти (в RecordAccumulator), группируя по партициям. Если батч не заполнен в течение linger.ms, он отправляется принудительно. Это trade-off: высокое значение (например, 5-10 мс) увеличивает размер батча, амортизируя network overhead, но повышает latency. В памяти: таймер на основе ScheduledExecutorService проверяет батчи; overhead — минимальный, но при высоком linger.ms память может заполняться, если трафик низкий.

- batch.size: Максимальный размер батча в байтах (по умолчанию 16 КБ). Когда батч достигает этого размера, он отправляется немедленно, игнорируя linger.ms. В памяти: каждый батч — это Deque<ProducerBatch> в RecordAccumulator, где ProducerBatch содержит ByteBuffer для сериализованных записей. Нюанс: слишком большой batch.size (например, 1 МБ) увеличивает память (buffer.memory), но снижает I/O на брокере; малый — приводит к частым мелким запросам, увеличивая CPU на serialization и network.

- compression.type: Тип сжатия (none, gzip, snappy, lz4, zstd). Сжатие происходит в памяти продюсера перед добавлением в батч: сериализованные записи компрессируются в ByteBuffer. Это снижает объем данных на сети/диске, но добавляет CPU overhead. Подробнее в senior-нюансах ниже.

- buffer.memory: Общий размер буфера в памяти для несент батчей (по умолчанию 32 МБ). Это off-heap память (DirectByteBuffer), чтобы избежать GC. Если буфер заполнен, send() блокируется (configurable via max.block.ms). Нюанс: при высоком трафике и медленной сети буфер может переполниться, вызывая ProducerFencedException в транзакционных режимах; мониторьте метрики bufferpool-usage.

В памяти продюсера: основной компонент — RecordAccumulator, который держит Map<TopicPartition, Deque<ProducerBatch>>. Каждое send() сериализует ProducerRecord, вычисляет партицию (via Partitioner), добавляет в батч. Отдельный Sender thread (в KafkaProducer) периодически проверяет батчи и отправляет ProduceRequest через NetworkClient (NIO-based).


#Java #middle #Kafka #Produser
👍3
Idempotence: enable.idempotence=true, гарантии без дублей

Idempotent producer обеспечивает exactly-once семантику без дубликатов при ретреях. Включается via enable.idempotence=true, что implicitly устанавливает acks=all, retries>0, max.in.flight.requests.per.connection=5 (или меньше).

Как работает: каждому продюсеру присваивается уникальный producer.id (PID) от брокера при init. Каждому батчу добавляется sequence number (начиная с 0 per partition). Брокер хранит last sequence per PID/partition и отвергает дубликаты (если sequence уже обработан). При ретрее продюсер переотправляет с тем же sequence.

В памяти: продюсер держит Map<TopicPartition, Integer> для sequences. Overhead: минимальный, но требует стабильного соединения (если connection drops, может потребоваться reinitialization). Гарантии: at-least-once becomes exactly-once для одной сессии; не покрывает множественные продюсеры или app restarts (для этого — transactions).

Нюанс: idempotence не влияет на ordering, если max.in.flight=1; но по умолчанию позволяет до 5 in-flight, что может нарушить order (см. senior-нюансы).


Transactions (EOS): transactional.id, initTransactions(), ограничения и caveats

Transactions предоставляют exactly-once semantics (EOS) через топики, включая atomicity: все или ничего для группы send(). Включается via transactional.id (уникальный ID, persistent across restarts).

Процесс: producer.initTransactions() регистрирует PID с брокером (via InitProducerIdRequest), устанавливая epoch. Затем beginTransaction(), send()..., commitTransaction() или abortTransaction(). В commit брокер пишет маркеры (commit/abort) в логи, делая транзакцию видимой для потребителей с isolation.level=read_committed.

В памяти: продюсер держит TransactionManager, который тракает открытые транзакции, pending batches. Batches помечаются transactionally; overhead — дополнительные метаданные в ProduceRequest.

Ограничения: только для idempotent producers; max.in.flight=1 (принудительно, чтобы сохранить ordering); нельзя смешивать transactional и non-transactional send в одном продюсере. Caveats: timeout via transaction.timeout.ms (по умолчанию 60 сек), после чего транзакция фенсится (ProducerFencedException). При restart с тем же transactional.id старый PID фенсится, позволяя продолжить. Нюанс: в кластере с downtime контроллера initTransactions() может блокироваться; для EOS в Streams используйте processing.guarantee=exactly_once.


Partitioner: кастомный и дефолтный


Partitioner определяет, в какую партицию идет запись. Дефолтный (DefaultPartitioner): если key=null, round-robin; если key не null, hash(key) % num_partitions (murmur2 hash для consistency).

Кастомный: implement Partitioner interface (partition() method). Полезно для affinity (например, все orders пользователя в одну партицию для ordering). В памяти: вызывается синхронно в send(), overhead — от hash computation.

Нюанс: плохой partitioner может привести к skew (горячие партиции), снижая throughput; всегда учитывайте num_partitions changes.


Retry/backoff политика

Retries (по умолчанию 2147483647) и retry.backoff.ms (100 мс) управляют повторными попытками при transient errors (например, NotLeaderForPartitionException).

Как работает: Sender thread ловит retriable exceptions, backoff (exponential с jitter), затем retry. В idempotence/transactions retry прозрачен, без дубликатов.

В памяти: pending requests в InFlightRequests Map, с timeout per request. Нюанс: высокие retries могут маскировать проблемы (например, network flaps), увеличивая latency; мониторьте retry-rate метрики.


#Java #middle #Kafka #Produser
Метрики: request-latency, batch-size-avg

Продюсер экспортирует JMX метрики via KafkaProducer.metrics().

Ключевые:
- request-latency-avg: Средняя latency ProduceRequest (от send до response). Включает network + broker processing. Высокая — указывает на bottleneck (медленная сеть, перегруженный брокер).
- batch-size-avg: Средний размер батча в байтах. Идеально близко к batch.size для efficiency; низкий — увеличьте linger.ms.

Другие: record-queue-time-avg (время в accumulator), buffer-bytes (используемая память). Нюанс: используйте MetricsReporter для интеграции с Prometheus; в production мониторьте per-partition метрики для detection skew.


Пример кода

Вот расширенный пример на Java, демонстрирующий idempotence и transactions:
import org.apache.kafka.clients.producer.*;
import java.util.Properties;

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all");
props.put("enable.idempotence", "true");
props.put("transactional.id", "order-tx-1");

try (KafkaProducer<String, String> producer = new KafkaProducer<>(props)) {
producer.initTransactions();
producer.beginTransaction();
ProducerRecord<String, String> record = new ProducerRecord<>("orders", "key", "value");
producer.send(record);
producer.commitTransaction();
} catch (ProducerFencedException e) {
// Handle fencing, e.g., abort and reinitialize
} catch (KafkaException e) {
// Abort on error
producer.abortTransaction();
}


В production добавьте Callback в send() для async handling, и flush() перед close().

Нюансы: max.in.flight.requests.per.connection влияние на ordering, компрессия: zstd vs snappy vs lz4, когда idempotence недостаточно и нужна транзакция

- max.in.flight.requests.per.connection: По умолчанию 5, позволяет параллельные запросы по одному соединению для throughput. Но если >1 и retry происходит, ordering может нарушиться: failed batch retry после successful последующих. В idempotence это разрешено, но для strict ordering установите=1 (снижает throughput на 20-50%). В transactions forcibly=1.

- Компрессия: zstd — лучший ratio (до 5x), но высокий CPU (для высоких данных); snappy — быстрый, низкий CPU, средний ratio (2-3x), идеален для real-time; lz4 — баланс, faster than gzip. В памяти: compression в отдельном thread pool (если compression.type set), overhead — allocate temp buffers. Тестируйте: для text-heavy — zstd; binary — snappy.

- Когда idempotence недостаточно: Idempotence покрывает retries в одной сессии, но не atomicity across topics/partitions или app failures (дубликаты при restart). Транзакции нужны для EOS в multi-topic writes (например, order + inventory update) или с Kafka Streams. Caveat: transactions добавляют 10-20% overhead из-за маркеров и fencing. Используйте если SLA требует no duplicates/loss even on crashes; иначе idempotence достаточно для 99% случаев.


#Java #middle #Kafka #Produser
👍2
Что выведет код?

public class Task140825 {
public static void main(String[] args) {
System.out.println(test());
}

public static int test() {
try {
return 1;
} finally {
return 2;
}
}
}


#Tasks
👍3
Варианты ответа:
Anonymous Quiz
33%
1
33%
2
13%
1 2
21%
Ошибка компиляции
👍5
Карточка для запоминания for 😎

#memory_card
👍2
Что такое ExecutorCompletionService? 🤓

Ответ:
ExecutorCompletionService
оборачивает Executor и позволяет получать результаты задач по мере их завершения.

Пример:
ExecutorService executor = Executors.newFixedThreadPool(2);
CompletionService<String> service = new ExecutorCompletionService<>(executor);
service.submit(() -> "Task1");
System.out.println(service.take().get()); // Task1

Полезен для асинхронных задач с разным временем выполнения.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🗓 История IT сегодня — 15 августа


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

Лесли Джон Комри (15 августа 1893 г. – 11 декабря 1950 г.) Астроном и пионер механической/механографической автоматизации вычислений; один из ранних организаторов коммерческих вычислительных услуг и автоматизации таблиц — предтеча компьютерной обработки данных.

Пьер Буге́р (также Буге; фр. Pierre Bouguer; 16 февраля 1698, Круазик (Croisic), Франция — 15 августа 1758, Париж)французский физик, математик и астроном, основатель фотометрии. Известен трудами по теории корабля, геодезии, гидрографии и другим отраслям знания. Имя Бугера внесено в список 72 величайших учёных Франции, размещённый на первом этаже Эйфелевой башни.


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

1877американский изобретатель Томас Эдисон в письме президенту телеграфной компании Питтсбурга предложил в качестве приветствия при общении по телефону использовать слово «hello» (в России оно трансформировалось в «алло»). В этот же день Эдисон произвёл первую запись звука на свой фонограф — песню «Mary Had a Little Lamb» («У Мэри был барашек»).

1977радиотелескоп Big Ear (Огайо, США) зафиксировал "Wow! signal" — один из самых известных возможно внеземных радиоимпульсов.

1998компания Apple начала поставки iMac G3, модели, которая кардинально изменила дизайн и восприятие компьютеров в массовом сознании.

15 августа (дата отмечается как Computer Science Day) — день, посвящённый дате запуска первого массового электронного компьютера ENIAC.


#Biography #Birth_Date #Events #15Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Основы ООП в Java

Глава 1. Классы и объекты

Состояние и поведение: поля и методы


Объектно-ориентированное программирование — это подход, где программа строится вокруг объектов, которые представляют реальные сущности (например, машину, человека или счет в банке).

Java — это чисто объектно-ориентированный язык, где всё (кроме примитивных типов) является объектом. ООП помогает писать масштабируемый код, который легко расширять и поддерживать.
Классы и объекты: Основные понятия


Класс: Это шаблон или "чертеж" для создания объектов. Класс определяет, какие данные (состояние) и действия (поведение) будут у объектов.
Объект: Это экземпляр класса — конкретная реализация шаблона. Например, класс Car может описывать автомобили в общем, а объект — конкретный автомобиль, такой как "красный Ford с номером ABC123".
Пример: Представьте класс Person (Человек). Он может иметь состояние (имя, возраст) и поведение (ходить, говорить). Объекты этого класса — конкретные люди, такие как "Алексей, 35 лет".



Состояние: Поля (Fields)

Состояние объекта определяется полями — переменными внутри класса, которые хранят данные. Поля описывают характеристики объекта.


Объявление полей: Поля объявляются в теле класса, вне методов. Они могут быть примитивными типами (int, double) или ссылочными (String, другие классы).

Модификаторы доступа: Чтобы защитить данные, используйте модификаторы:
private: Доступны только внутри класса (рекомендуется для полей).
public: Доступны везде (избегайте для полей, чтобы сохранить инкапсуляцию).
protected: Доступны в классе и подклассах.
Без модификатора (default): Доступны в пакете.


Пример класса с полями:

public class Person {
// Поля (состояние)
private String name; // Имя человека
private int age; // Возраст человека
}

Здесь name и age — поля, хранящие состояние объекта.
Они private, чтобы внешний код не мог напрямую изменять их (инкапсуляция).



Поведение: Методы (Methods)

Поведение объекта определяется методами — функциями внутри класса, которые выполняют действия с данными или изменяют состояние.

Объявление методов: Методы имеют сигнатуру: модификатор, тип возвращаемого значения, имя, параметры в скобках, тело в фигурных скобках.

Типы методов:
Конструкторы: Специальные методы для инициализации объектов. Имя совпадает с именем класса, нет типа возвращаемого значения.
Обычные методы: Выполняют действия, могут возвращать значение или нет (void).
Геттеры и сеттеры: Методы для чтения (get) и записи (set) полей, чтобы обеспечить контролируемый доступ.


Пример с методами:
public class Person {
private String name;
private int age;

// Конструктор (инициализирует состояние)
public Person(String name, int age) {
this.name = name; // this — ссылка на текущий объект
this.age = age;
}

// Метод (поведение): Вывод информации
public void introduce() {
System.out.println("Привет, меня зовут " + name + ", мне " + age + " лет.");
}

// Геттер для возраста
public int getAge() {
return age;
}

// Сеттер для возраста (с проверкой)
public void setAge(int age) {
if (age > 0) {
this.age = age;
} else {
System.out.println("Возраст не может быть отрицательным!");
}
}
}

Конструктор: Person(String name, int age) устанавливает начальное состояние.
Метод introduce(): Выводит информацию (поведение).
Геттер getAge(): Возвращает значение поля.
Сеттер setAge(int age): Изменяет поле с проверкой (инкапсуляция).



#Java #для_новичков #beginner #class #object
👍4
Создание и использование объектов

Объекты создаются с помощью оператора new.

Пример в методе main:

public class Main {
public static void main(String[] args) {
// Создание объекта
Person person1 = new Person("Алексей", 35);

// Вызов метода
person1.introduce(); // Вывод: Привет, меня зовут Алексей, мне 35 лет.

// Использование геттера и сеттера
System.out.println("Текущий возраст: " + person1.getAge());
person1.setAge(36);
System.out.println("Новый возраст: " + person1.getAge());
}
}

new Person("Алексей", 35): Создает объект и вызывает конструктор.
person1.introduce(): Вызывает метод объекта.



Как создать это в IntelliJ IDEA


Создайте класс:

В проекте щелкните правой кнопкой на src → New → Java Class.
Назовите Person и добавьте код выше.


Создайте класс Main:
Аналогично создайте Main с методом main.

Запустите:
Правой кнопкой на Main.java → Run 'Main.main()'.


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

Используйте this: Для отличия полей класса от параметров методов (например, this.name = name;).
Конструкторы по умолчанию: Если конструктор не указан, Java создает пустой конструктор public Person() {}.
Множественные конструкторы: Можно иметь несколько конструкторов (перегрузка), перегрузка, но об этом в следующем уроке.
Практика инкапсуляции: Всегда делайте поля private и предоставляйте доступ через геттеры/сеттеры.
Проверки в сеттерах: Добавляйте логику, чтобы избежать некорректных данных.



#Java #для_новичков #beginner #class #object
👍3
Что выведет код?

class Parent150825 {
Parent150825() {
print();
}
void print() {
System.out.println("Parent");
}
}

class Child150825 extends Parent150825 {
int value = 10;

@Override
void print() {
System.out.println(value);
}
}

public class Task150825 {
public static void main(String[] args) {
new Child150825();
}
}


#Tasks
👍4
Варианты ответа:
Anonymous Quiz
22%
"Parent"
11%
0
44%
10
22%
Ошибка компиляции
🤯2😱1
Карточка для запоминания for 😎

#memory_card
👍2
Что такое LockSupport? 🤓

Ответ:
LockSupport
предоставляет низкоуровневые методы (park, unpark) для приостановки и возобновления потоков. Используется в реализации Lock. Пример:

Thread t = new Thread(() -> {
LockSupport.park();
System.out.println("Unparked");
});
t.start();
LockSupport.unpark(t);

Более гибкий, чем wait/notify.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🗓 История IT сегодня — 16 августа


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

Христос Харилаос Пападимитриу (греч. Χρήστος Χαριλάος Παπαδημητρίου; род. 1949, Афины) один из ведущих теоретиков в компьютерных науках; важные работы по теории алгоритмов, сложности вычислений и теория игр, автор фундаментальных учебников и исследований. Член Национальных Академии наук (2009) и Инженерной академии США, профессор Калифорнийского университета в Беркли.


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

1890 — Электромеханическая обработка переписи США: Бюро переписи объявляет результаты, подсчитанные машинами Германа Холлерита — рубеж для истории вычислений и табуляторов.

1993 — Иан Мёрдок основал сообщество «Debian», занимающееся созданием и распространением свободного дистрибутива Debian GNU/Linux.

2006 — в русской Википедии появилась юбилейная, 100-тысячная статья.


#Biography #Birth_Date #Events #16Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1