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
Варианты ответа
Anonymous Quiz
52%
1 2 3
24%
1 2 3 5
17%
1 2 3 6
7%
1 2 3 4 5
👍2
Карточка для запоминания String 😎

#memory_card
👍3
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
Вай-вай))) 300 человеков 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Что такое ConcurrentSkipListMap? 🤓

Ответ:

ConcurrentSkipListMap
— потокобезопасная реализация NavigableMap, использующая структуру skip-list для хранения упорядоченных ключей.

Пример:
ConcurrentSkipListMap<Integer, String> map = new ConcurrentSkipListMap<>();
map.put(2, "Two");
map.put(1, "One");
System.out.println(map.firstKey()); // 1

Подходит для многопоточных приложений с упорядоченными данными.


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

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

Дороти Элизабет Деннинг (урождённая Роблинг, родилась 12 августа 1945 года) — американский исследователь в области информационной безопасности, известный своими системами контроля доступа на основе решётчатой архитектуры (LBAC), системами обнаружения вторжений (IDS) и другими инновациями в области кибербезопасности. Она опубликовала четыре книги и более 200 статей. В 2012 году она была включена в Национальный зал славы кибербезопасности , а сейчас является почётным профессором кафедры анализа обороны Военно-морской аспирантуры.

Мануэла Мария Велозо (родилась 12 августа 1957 г.) руководитель отдела исследований искусственного интеллекта JP Morgan и почётный профессор Университета Герберта А. Саймона в Школе компьютерных наук Университета Карнеги — Меллона, где ранее она возглавляла кафедру машинного обучения. До 2014 года она была президентом Ассоциации содействия развитию искусственного интеллекта (AAAI), а также соучредителем и бывшим президентом Федерации RoboCup. Является международным экспертом в области искусственного интеллекта и робототехники.


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

1960 год — США запустили Echo-1A, первый в истории коммуникационный спутник, осуществляющий ретрансляцию радиосигналов и сделавший огромный шаг в развитии спутниковой связи.

1962 — СССР запустил «Восток 4» с космонавтом Павлом Поповичем, впервые два пилотируемых корабля находились в космосе одновременно; они осуществили радиосвязь и сблизились на расстояние около 6,5 км.

1981 — IBM представила и начала продажи первого массового персонального компьютера IBM PC (модель 5150), что стало ключевым рубежом в истории вычислительной техники.


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

Введение и архитектура


Apache Kafka представляет собой распределенную платформу для обработки потоков данных в реальном времени, которая сочетает в себе функции очереди сообщений, хранилища данных и системы обработки событий. Разработанная изначально в LinkedIn для решения задач высоконагруженных систем, Kafka эволюционировала в мощный инструмент для построения масштабируемых конвейеров данных.



Основные концепции: topic, partition, offset, segment, log, leader/follower, ISR


Kafka строится вокруг понятия Topic — логическая категория для потоков сообщений.

Topic
— это не монолитная структура, а распределенная очередь, разделенная на партиции (partitions). Каждая партиция представляет собой упорядоченную, неизменяемую последовательность записей (records), которая хранится как append-only лог. Это значит, что данные в партиции добавляются только в конец, без возможности модификации существующих записей. Партиции позволяют параллелизовать обработку: разные партиции могут обрабатываться независимо, что обеспечивает масштабируемость.

Внутри партиции каждая запись идентифицируется offset'ом — это монотонно возрастающее целое число, начиная с 0, которое указывает позицию записи в логе. Offset уникален только в пределах партиции; для разных партиций offset'ы независимы. Когда потребитель (consumer) читает данные, он отслеживает текущий offset, чтобы знать, с какой позиции продолжить чтение. В памяти потребителя offset хранится локально, но для надежности Kafka предоставляет механизм коммита offset'ов в специальную внутреннюю тему __consumer_offsets, где они реплицируются как обычные записи.

Партиция физически хранится как лог (log) — последовательность файлов на диске брокера. Лог разбивается на сегменты (segments) для управления размером: каждый сегмент — это файл с записями, начиная с определенного offset'а (base offset). Когда сегмент достигает заданного размера (по умолчанию 1 ГБ, создается новый. Старые сегменты могут удаляться по политикам retention. В памяти брокера сегменты не загружаются целиком; вместо этого Kafka использует memory-mapped files (mmap) для доступа к диску, что позволяет ОС кэшировать горячие данные в page cache, минимизируя реальные I/O-операции.

Для репликации партиции имеют лидера (leader) и фолловеров (followers). Лидер — это реплика партиции на одном брокере, которая принимает все записи от продюсеров (producers) и обслуживает чтение от потребителей. Фолловеры — реплики на других брокерах, которые синхронизируют данные с лидером. ISR (In-Sync Replicas) — это подмножество реплик (включая лидера), которые полностью синхронизированы с лидером. ISR определяется по отставанию фолловеров: если фолловер не запрашивает данные в течение replica.lag.time.max.ms (по умолчанию 30 секунд), он исключается из ISR. Это обеспечивает баланс между доступностью и consistency: записи считаются закоммиченными, когда они реплицированы на все реплики в ISR (min.insync.replicas).

В памяти брокера для каждой партиции лидер хранит в RAM метаданные, такие как текущий high-watermark (максимальный offset, закоммиченный на всех ISR), а также буферы для входящих запросов. Фолловеры используют отдельные потоки (replica fetchers) для pull-запросов к лидеру, копируя данные в свои логи.


Архитектура брокера: роль брокера, контроллера, брокерная конфигурация

Брокер (broker) — это основной узел (сервер) Kafka-кластера, отвечающий за хранение и обслуживание данных. Каждый брокер управляет подмножеством партиций: для каждой партиции один брокер является лидером, а другие — фолловерами. Брокеры образуют кластер, координируемый через ZooKeeper (до Kafka 2.8) или встроенный KRaft (Kafka Raft) в новых версиях, который устраняет зависимость от ZooKeeper.

#Java #middle #Kafka
👍6
Контроллер (controller) — это специальный брокер, избираемый кластером для управления метаданными: распределение партиций, лидер-элекшн, обработка изменений в топиках. Контроллер мониторит состояние брокеров через heartbeat'ы и перераспределяет партиции при сбоях. В памяти контроллера хранится глобальное состояние кластера: mapping партиций к брокерам, ISR для каждой партиции. При сбое контроллера избирается новый, что занимает миллисекунды благодаря репликации метаданных в __controller_epoch теме.

Брокерная конфигурация определяет поведение:
broker.id — уникальный ID,
log.dirs — директории для логов,
num.network.threads — количество потоков для сетевых запросов (по умолчанию 3),
num.io.threads — для дисковых операций (по умолчанию 8).

В памяти брокера значительная часть heap'а (до 50% по умолчанию) выделяется под off-heap буферы для сетевых операций, чтобы избежать GC-пауз. Конфигурация влияет на производительность: слишком малое num.io.threads может привести к bottleneck'у на диске, а большое message.max.bytes увеличивает потребление памяти для батчинга.


Хранение данных: лог-сегменты, индексные файлы, retention vs compaction

Данные в партиции хранятся в лог-сегментах: каждый сегмент состоит из двух файлов — .log (сами записи) и .index (спарс-индекс для быстрого поиска по offset'у).
Запись в .log — это последовательность байт: заголовок (magic byte, attributes, timestamp), ключ, значение, headers. Индексный файл содержит пары (offset, position), где position — байтовое смещение в .log. Индекс спарсный (по умолчанию каждые 4 КБ, configurable via index.interval.bytes), чтобы минимизировать размер: поиск offset'а начинается с ближайшей индексной записи, за которой следует линейный скан.

Retention — это политика удаления старых данных: log.retention.hours (по умолчанию 168) удаляет сегменты по времени, log.retention.bytes — по размеру. Compaction — альтернатива для key-based тем: сохраняет только последнюю запись для каждого ключа, удаляя дубликаты. Compaction работает в фоне: cleaner thread сканирует сегменты, строит в памяти map ключей к последним offset'ам, затем перезаписывает сегмент. В памяти это требует heap'а пропорционально количеству уникальных ключей в сегменте.

Trade-offs: retention подходит для временных данных (например, логи), но тратит диск на устаревшие записи; compaction экономит место для stateful данных (например, конфиги), но увеличивает CPU/IO на cleanup. Влияние segment.bytes: маленькие сегменты (например, 100 МБ) ускоряют deletion/compaction, снижая GC (меньше объектов в heap во время cleanup), но увеличивают overhead на открытые файлы и индексы. Большие сегменты минимизируют фрагментацию, но замедляют GC/IO при compaction, так как требуют больше памяти для временных структур.


Репликация: лидеры, ISR, replica fetcher, лидер-элекшн

Репликация обеспечивает надежность: каждая партиция имеет replication.factor (по умолчанию 1-3) реплик. Продюсеры пишут только в лидера, который реплицирует данные в ISR. Replica fetcher — это поток на фолловере, который периодически посылает FetchRequest к лидеру, запрашивая данные с последнего fetched offset'а. Лидер проверяет, в ISR ли фолловер, и отправляет данные. High-watermark продвигается только когда все ISR зареплицировали запись, обеспечивая durability.

Лидер-элекшн происходит при сбое лидера: контроллер выбирает нового лидера из ISR (предпочтительно unclean.leader.election.enable=false, чтобы избежать data loss). Элекшн использует epoch для предотвращения split-brain: новый лидер увеличивает epoch, уведомляя фолловеров. В памяти брокера реплика хранит log end offset (LEO) — максимальный offset в логе, и high-watermark.

#Java #middle #Kafka
👍6
Сетевая модель: request/response, metadata, fetch/produce

Kafka использует асинхронный, бинарный протокол на TCP: клиенты посылают requests (ProduceRequest, FetchRequest), брокеры отвечают responses. MetadataRequest запрашивает топик-метаданные (партиции, лидеры) от любого брокера, который перенаправляет к контроллеру если нужно. Produce — для записи: продюсер батчит записи по партициям, посылая в лидера. Fetch — для чтения: потребитель запрашивает с offset'а, получая chunk данных.

В памяти: брокер использует NIO selectors для multiplexing соединений, буферы (ByteBuffer) для zero-copy передачи. Zero-copy с sendfile() позволяет передавать данные из page cache напрямую в socket, без копирования в user space.


Обзор API-моделей

- Producer API: Для отправки записей. Создает ProducerRecord (topic, partition, key, value), использует KafkaProducer с конфигами (acks=all для durability, batch.size для батчинга).
- Consumer API: Для чтения. KafkaConsumer с poll(), который возвращает ConsumerRecords. Поддерживает группы для балансировки партиций.
- Admin API: Для управления топиками (create, delete, describe).
- Streams API: Для обработки потоков (KStream, KTable) с state stores.
- Connect API: Для интеграции с внешними системами (sources/sinks).


Ordering guarantees, масштабирование vs ordering


Kafka гарантирует ordering только внутри партиции: записи с одним ключом (если key-based partitioning) идут в порядке отправки. Нет глобального ordering по топику. Масштабирование добавлением партиций улучшает throughput, но жертвует ordering: для строгого ordering используйте одну партицию, что лимитирует parallelism.


Почему Kafka быстрая

- Sequential I/O: Запись/чтение в append-only лог — последовательные операции на диске, эффективные для HDD/SSD (миллионы IOPS vs random access).
- Zero-copy: Sendfile() копирует данные из kernel cache в socket без user space, снижая CPU и latency.
- Batching: Продюсеры/потребители батчат записи (linger.ms), амортизируя overhead сети/диска. В памяти батчи сжимаются (compression.type).


Минимальный producer/consumer

Producer (Java):
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");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");
producer.send(record);
producer.close();


Consumer (Java):
import org.apache.kafka.clients.consumer.*;
import java.util.Properties;
import java.util.Collections;

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singleton("my-topic"));
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
System.out.println(record.value());
}
consumer.close();


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

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