Java for Beginner
715 subscribers
659 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
Что выведет код?

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class Task120825 {
public static void main(String[] args) {
Random r1 = new Random(42);
Random r2 = new Random(42);

System.out.println(r1.nextInt(100) == r2.nextInt(100));

ThreadLocalRandom tl1 = ThreadLocalRandom.current();
ThreadLocalRandom tl2 = ThreadLocalRandom.current();

System.out.println(tl1.nextInt(100) == tl2.nextInt(100));
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
35%
true true
30%
true false
13%
false true
22%
false false
👍1
Карточка для запоминания If 😎

#memory_card
👍5
Что такое Collectors.toUnmodifiableList()? 🤓

Ответ:
Метод Collectors.toUnmodifiableList() (Java 10) создает неизменяемый список из элементов потока.

Пример:
List<String> list = Stream.of("a", "b")
.collect(Collectors.toUnmodifiableList());
list.add("c"); // UnsupportedOperationException

Гарантирует неизменность результата, повышая безопасность.


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


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

Роман Владимирович Ямпольский (родился в Риге 13 августа 1979 года) — исследователь в области безопасности ИИ и криптографии поведения, автор работ по безопасности искусственного интеллекта и критическим анализам рисков ИИ.

Гарольд Дин Браун (13 августа 1927 г. — 24 июня 2003 г.) — учёный, работавший на стыке физики и вычислительной техники; имел влияние на развитие программного обеспечения и практик внедрения вычислительных систем в промышленных и исследовательских средах.

Джон Ло́уги Бэрд (Байрд; англ. John Logie Baird; 13 августа 1888, Хеленсборо (Шотландия) — 14 июня 1946, Бексхилл, Восточный Суссекс, Англия) — шотландский инженер, получивший известность за создание первой механической телевизионной системы. Хотя впоследствии механическое телевидение было вытеснено разработками Владимира Зворыкина и Фило Фарнсуорта в области электронного телевидения, первые телевизоры Бэрда — важный шаг в развитии телевидения.


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

1889 — американский изобретатель Уильям Грей запатентовал телефон-автомат.

1932 — в Риме Маркони провёл первое испытание коротковолнового радио.

1985 — в Японии выходит Famicom Robot-совместимая игра Gyromite.

1991 — в США выходит Super Nintendo Entertainment System (SNES), значительно повлиявшая на игровую индустрию, вместе с культурально значимыми играми Super Mario World и F-Zero.

#Biography #Birth_Date #Events #13Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Break, continue, метки (label) в Java

В циклах иногда нужно прервать выполнение или пропустить часть кода. Для этого в Java используются операторы break и continue. Метки (labels) позволяют управлять вложенными циклами. Эти инструменты помогают делать циклы гибкими и эффективными.

Что такое break, continue и метки в Java?
- break: Полностью прерывает цикл и выходит из него. Полезно, когда условие для продолжения больше не нужно.
- continue: Пропускает остаток текущей итерации (повторения) цикла и переходит к следующей. Полезно, чтобы игнорировать некоторые случаи.
- Метки (labels): Это специальные имена перед циклами, которые позволяют break или continue влиять на внешние циклы в вложенных конструкциях.


Зачем нужны эти операторы?
- Управление потоком: Позволяют досрочно завершать или пропускать части цикла.
- Эффективность: Избегают ненужных повторений, делая код быстрее.
- Читаемость: Делают логику цикла понятной, особенно в сложных случаях.
- Гибкость: Метки помогают работать с вложенными циклами, как в обработке таблиц или массивов.



Синтаксис

break
- Прерывает ближайший цикл или switch и выходит из него.

Синтаксис:
break;

С меткой (для вложенных циклов):
метка: {
// Цикл
break метка;
}


continue
- Пропускает остаток текущей итерации и переходит к следующей проверке условия.

Синтаксис:
continue;

С меткой:
метка: {
// Цикл
continue метка;
}


Метки (labels)
- Метка — это имя с двоеточием (:) перед циклом или блоком.

Синтаксис:
имяМетки: for (...) {
// Код
break имяМетки; // или continue имяМетки
}

- Метки должны быть уникальными и состоять из букв, цифр или подчеркиваний, как переменные.

Примечания к синтаксису:
- break и continue работают в циклах (for, while, do-while) и switch.
- Без метки они влияют на ближайший цикл.
- Метки используются редко, но полезны в сложных вложенных циклах.



Примеры использования

break в цикле
- Прерывает цикл, когда число больше 3.
int i = 1;
while (i <= 5) {
System.out.println(i);
if (i > 3) {
break;
}
i++;
}

Вывод:
1
2
3
4

- Объяснение: Когда i становится 4, if истинно, break прерывает цикл, и 5 не печатается.

continue в цикле
- Пропускает четные числа.
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println(i);
}

Вывод:
1
3
5

- Объяснение: Если i четное, continue пропускает печать и переходит к следующей итерации.

Метки с break
- Вложенные циклы: прерывает внешний цикл.
outer: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break outer; // Прерывает внешний цикл
}
System.out.println("i=" + i + ", j=" + j);
}
}

Вывод:
i=1, j=1

- Объяснение: Когда j == 2, break outer прерывает весь внешний цикл.

Метки с continue
- Пропускает итерацию внешнего цикла.
outer: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue outer; // Переходит к следующей итерации внешнего цикла
}
System.out.println("i=" + i + ", j=" + j);
}
}

Вывод:
i=1, j=1
i=2, j=1
i=3, j=1

- Объяснение: Когда j == 2, continue outer пропускает остаток итерации внешнего цикла и переходит к следующей i.


Правильное применение


break
- Используйте, когда нужно досрочно выйти из цикла (например, поиск элемента в списке).
- Пример: Поиск числа в массиве.

int[] numbers = {1, 2, 3, 4, 5};
int target = 3;
boolean found = false;
for (int num : numbers) {
if (num == target) {
found = true;
break;
}
}
System.out.println("Найдено: " + found);


continue
- Используйте, чтобы пропустить ненужные случаи (например, игнорировать пустые строки).
- Пример: Суммирование только положительных чисел.

int sum = 0;
for (int i = -2; i <= 3; i++) {
if (i <= 0) {
continue;
}
sum += i;
}
System.out.println("Сумма: " + sum); // 1 + 2 + 3 = 6


#Java #для_новичков #beginner #break #continue
👍4
Правильное применение

break
- Используйте, когда нужно досрочно выйти из цикла (например, поиск элемента в списке).
- Пример: Поиск числа в массиве.

int[] numbers = {1, 2, 3, 4, 5};
int target = 3;
boolean found = false;
for (int num : numbers) {
if (num == target) {
found = true;
break;
}
}
System.out.println("Найдено: " + found);


continue
- Используйте, чтобы пропустить ненужные случаи (например, игнорировать пустые строки).
- Пример: Суммирование только положительных чисел.

int sum = 0;
for (int i = -2; i <= 3; i++) {
if (i <= 0) {
continue;
}
sum += i;
}
System.out.println("Сумма: " + sum); // 1 + 2 + 3 = 6



Метки
- Используйте в вложенных циклах, когда нужно влиять на внешний цикл.
- Пример: Поиск в матрице.

int[][] matrix = {{1, 2}, {3, 4}};
outer: for (int row = 0; row < matrix.length; row++) {
for (int col = 0; col < matrix[row].length; col++) {
if (matrix[row][col] == 3) {
System.out.println("Найдено в строке " + row + ", столбце " + col);
break outer;
}
}
}


Рекомендации
- Избегайте меток, если возможно — используйте методы для упрощения кода.
- Документируйте метки комментариями, так как они делают код сложнее.
- Тестируйте циклы на бесконечность или пропуски.


Работа под капотом

Компиляция в байт-код
- break: Компилируется в инструкцию goto для перехода к концу цикла.
- continue: Компилируется в goto для возврата к началу цикла (проверке условия).
- Метки: Метка становится меткой в байт-коде, а break/continue с меткой — goto к этой метке.


Пример break в цикле:
while (true) {
if (condition) break;
}

Байт-код (упрощенно):
loop:
if condition goto end
goto loop
end:


Память и стек
- break и continue не влияют напрямую на память, но прерывают или пропускают код, экономя ресурсы.
- Вложенные циклы с метками используют стек вызовов для локальных переменных.


Оптимизация в JVM
- JIT-компилятор может встраивать циклы с break/continue, оптимизируя переходы.
- В бесконечных циклах с break JVM может оптимизировать, если видит частый выход.


Ошибки в памяти
- Бесконечные циклы без break могут переполнить стек или кучу.
- Неправильные метки могут привести к неожиданным переходам.

#Java #для_новичков #beginner #break #continue
👍5
Что выведет код

public class Task130825 {
public static void main(String[] args) {
int count = 0;
outer:
for (int i = 0; i < 3; i++) {
inner:
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outer;
}
count++;
}
}
System.out.println(count);
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
7%
9
7%
6
7%
5
80%
4
👍2
Карточка для запоминания switch 😎

#memory_card
👍2
Как обрабатывать исключения в 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