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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Влияние на производительность

Факторы, влияющие на скорость операции put
Качество хэш-функции: Плохая хэш-функция, создающая много коллизий, значительно замедляет операцию, увеличивая длину цепочек.
Коэффициент загрузки: Высокий коэффициент загрузки уменьшает частоту операций resize, но увеличивает среднюю длину цепочек коллизий.
Начальная емкость: Слишком маленькая начальная емкость приводит к частым операциям resize, слишком большая — к избыточному потреблению памяти.
Размер данных: В TreeMap производительность зависит от сбалансированности дерева, в HashMap — от равномерности распределения хэшей.

Сравнительная производительность
HashMap: O(1) в среднем случае, O(log n) в худшем (с деревьями)
LinkedHashMap: O(1) с небольшими накладными расходами на поддержание порядка
TreeMap: O(log n) в любом случае благодаря сбалансированному дереву


Потокобезопасность и параллелизм

В несинхронизированных реализациях Map операция put не является атомарной, что может привести к:
Потере данных при конкурентной модификации
Повреждению внутренней структуры данных
Бесконечным циклам в цепочках коллизий


ConcurrentHashMap решает эти проблемы через:
Сегментированную блокировку (в старых версиях)
CAS (Compare-And-Swap) операции и fine-grained блокировку (в новых версиях)
Позволяет выполнять конкурентные put операции на разных сегментах



Практические рекомендации

Оптимизация производительности


Для HashMap:
Выбирайте адекватную начальную емкость, чтобы избежать частых resize операций
Используйте ключи с хорошими хэш-функциями
Рассмотрите возможность использования immutable ключей


Для TreeMap:

Обеспечьте согласованность Comparator или естественного порядка
Используйте для данных, которые требуют сортировки или диапазонных запросов


Общие рекомендации:
Избегайте частых put операций в критичных по производительности участках кода
Используйте bulk операции при добавлении больших объемов данных
Рассмотрите альтернативные реализации для специфических use cases


#Java #для_новичков #beginner #Map #put
👍2
Напоминаю про встречу!

В 16:00 по МСК, бот даст ссылку)

Приходите, познакомимся с graphQL
👍1
Что выведет код?

import java.util.HashMap;
import java.util.Map;

public class Task041125 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();

String key = "key";
System.out.print(map.put(key, 1) + " ");
System.out.print(map.put(key, 2) + " ");
System.out.print(map.putIfAbsent(key, 3) + " ");
System.out.print(map.compute(key, (k, v) -> null) + " ");
System.out.print(map.put(key, 4));
}
}


#Tasks
👍1
👍2
Бот заряжен и готов выдавать ссылки!

Переходите и просите у него ссылку)


Чтобы избежать ошибок при работе с ботом нажмите /start

@JFB_admin_bot
👍1
GraphQL. Как усложнение упрощает жизнь.

В сегодняшнем видео мы рассмотрели что такое GraphQL.

Сегодня я написал и запустил простой демонстрационный код в котором рассмотрел что такое GraphQL.
🔵 Разобрали в чем отличие от REST и gRPC, как это работает.
🔵 Написали файл shema.graphqls, разобрали какие типы данных в нем применяются.
🔵 Как всегда немного подебажили))

Репозиторий на GitHub ждет Ваших звезд ☺️

Ссылка на Youtube
Ссылка на Рутьюб

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Вопрос с собеседований

Что делает класс AtomicInteger? 🤓


Ответ:

AtomicInteger
обеспечивает атомарные операции инкремента/декремента без блокировок.

Он использует низкоуровневые CAS (compare-and-swap) операции, что быстрее, чем синхронизация.

Это ключевой инструмент при реализации неблокирующих алгоритмов.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История IT-технологий сегодня — 05 ноября


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

Бернар Шазель (родился 5 ноября 1955 года) — французско-американский учёный в вычислительной геометрии; автор ряда фундаментальных алгоритмических результатов (soft heap, эффективные алгоритмы MST и т.п.).


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

2007 — Компания Google представила открытую мобильную платформу Android.


#Biography #Birth_Date #Events #05Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Типы RPC в gRPC

Одно из ключевых преимуществ gRPC — это гибкость модели обмена данными.
REST традиционно работает в стиле “один запрос — один ответ”.
gRPC, в отличие от него, поддерживает четыре типа взаимодействия, и каждый из них решает свою задачу.



1. Unary RPC (один запрос — один ответ)

Это самый простой и самый распространённый тип — аналог классического REST-вызова.
Клиент отправляет один запрос, сервер обрабатывает его и возвращает один ответ.


Клиент → (один запрос) → Сервер
Сервер → (один ответ) → Клиент


Пример .proto
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
int32 id = 1;
}

message UserResponse {
string name = 1;
int32 age = 2;
}


Сервер (Java)
public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
@Override
public void getUser(UserRequest request, StreamObserver<UserResponse> responseObserver) {
UserResponse response = UserResponse.newBuilder()
.setName("Alice")
.setAge(30)
.build();

responseObserver.onNext(response);
responseObserver.onCompleted();
}
}


Клиент
UserResponse response = stub.getUser(
UserRequest.newBuilder().setId(1).build()
);
System.out.println(response.getName());


Где применяется:
CRUD-операции (создание, получение, обновление, удаление).
Любые точечные вызовы, где не требуется поток данных.
По сути: это "REST, но бинарный, типобезопасный и в 10 раз быстрее".



2. Server Streaming RPC (поток ответов от сервера)

В этом типе клиент делает один запрос, а сервер возвращает несколько ответов последовательно — поток сообщений.

Клиент → (один запрос) → Сервер
Сервер → (много ответов в потоке) → Клиент


Сеанс продолжается, пока сервер не закончит отправку данных.

Пример .proto
service OrderService {
rpc ListOrders (OrdersRequest) returns (stream Order);
}

message OrdersRequest {
string user = 1;
}

message Order {
string id = 1;
string product = 2;
}


Сервер (Java)
public class OrderServiceImpl extends OrderServiceGrpc.OrderServiceImplBase {
@Override
public void listOrders(OrdersRequest request, StreamObserver<Order> responseObserver) {
for (int i = 1; i <= 3; i++) {
Order order = Order.newBuilder()
.setId("ORD-" + i)
.setProduct("Product " + i)
.build();

responseObserver.onNext(order);
try { Thread.sleep(1000); } catch (InterruptedException ignored) {}
}
responseObserver.onCompleted();
}
}


Клиент

stub.listOrders(OrdersRequest.newBuilder().setUser("Bob").build())
.forEachRemaining(order -> System.out.println(order.getProduct()));


Где применяется:
Поток обновлений или уведомлений.
Стриминг данных (например, список записей, логи, результаты аналитики).
Долгие вычисления, когда сервер постепенно отдаёт результаты.


Пример из реального мира:
Сервер передаёт клиенту “живой” поток котировок акций или данных из IoT-устройств.


#Java #middle #gRPC #proto
👍2
3. Client Streaming RPC (поток запросов от клиента)

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

Клиент → (много запросов) → Сервер
Сервер → (один ответ) → Клиент


Это удобно, когда клиенту нужно собрать несколько событий или пакетов данных и отправить их вместе.

Пример .proto
service UploadService {
rpc UploadPhotos (stream PhotoChunk) returns (UploadStatus);
}

message PhotoChunk {
bytes content = 1;
}

message UploadStatus {
string message = 1;
}



Сервер (Java)

public class UploadServiceImpl extends UploadServiceGrpc.UploadServiceImplBase {
@Override
public StreamObserver<PhotoChunk> uploadPhotos(StreamObserver<UploadStatus> responseObserver) {
return new StreamObserver<PhotoChunk>() {
int totalBytes = 0;

@Override
public void onNext(PhotoChunk chunk) {
totalBytes += chunk.getContent().size();
}

@Override
public void onError(Throwable t) {
System.err.println("Upload failed: " + t.getMessage());
}

@Override
public void onCompleted() {
UploadStatus status = UploadStatus.newBuilder()
.setMessage("Uploaded " + totalBytes + " bytes")
.build();
responseObserver.onNext(status);
responseObserver.onCompleted();
}
};
}
}


Клиент
StreamObserver<PhotoChunk> requestObserver = asyncStub.uploadPhotos(
new StreamObserver<UploadStatus>() {
@Override
public void onNext(UploadStatus status) {
System.out.println(status.getMessage());
}
@Override
public void onError(Throwable t) {}
@Override
public void onCompleted() {}
}
);

// Отправляем несколько чанков
requestObserver.onNext(PhotoChunk.newBuilder().setContent(ByteString.copyFrom(new byte[1000])).build());
requestObserver.onNext(PhotoChunk.newBuilder().setContent(ByteString.copyFrom(new byte[500])).build());
requestObserver.onCompleted();


Где применяется:
Отправка файлов по частям.
Отчёты, собираемые из нескольких частей.
Потоковое логирование от клиента на сервер.



#Java #middle #gRPC #proto
👍1
4. Bidirectional Streaming RPC (двунаправленный поток)

Самый мощный и сложный тип.
Клиент и сервер одновременно отправляют данные потоками.
Они не ждут завершения друг друга — общение идёт асинхронно в обе стороны.


Клиент ⇄ (двунаправленный поток) ⇄ Сервер

Пример .proto
service ChatService {
rpc Chat (stream ChatMessage) returns (stream ChatMessage);
}

message ChatMessage {
string user = 1;
string text = 2;
}


Сервер (Java)
public class ChatServiceImpl extends ChatServiceGrpc.ChatServiceImplBase {
@Override
public StreamObserver<ChatMessage> chat(StreamObserver<ChatMessage> responseObserver) {
return new StreamObserver<ChatMessage>() {
@Override
public void onNext(ChatMessage message) {
// Эхо-сообщение обратно клиенту
ChatMessage reply = ChatMessage.newBuilder()
.setUser("Server")
.setText("Echo: " + message.getText())
.build();
responseObserver.onNext(reply);
}

@Override
public void onError(Throwable t) {
System.err.println("Error: " + t.getMessage());
}

@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
}


Клиент
StreamObserver<ChatMessage> requestObserver = asyncStub.chat(
new StreamObserver<ChatMessage>() {
@Override
public void onNext(ChatMessage value) {
System.out.println(value.getUser() + ": " + value.getText());
}
@Override
public void onError(Throwable t) {}
@Override
public void onCompleted() {}
}
);

requestObserver.onNext(ChatMessage.newBuilder().setUser("Client").setText("Hello!").build());
requestObserver.onNext(ChatMessage.newBuilder().setUser("Client").setText("How are you?").build());
requestObserver.onCompleted();


Где применяется:
Чаты и видеоконференции.
Онлайн-игры и взаимодействие в реальном времени.
Телеметрия, двунаправленные датчики, IoT.
Главная особенность: оба канала открыты, и клиент, и сервер могут посылать данные независимо друг от друга.



5. Под капотом


Все типы RPC работают поверх HTTP/2, где каждый поток — это отдельный канал в рамках одного TCP-соединения.
gRPC использует этот механизм для организации стримов.
По сути, StreamObserver в Java — это высокоуровневая абстракция над HTTP/2-стримом, обеспечивающая асинхронность и реактивное взаимодействие.



#Java #middle #gRPC #proto
👍2
Что выведет код?

import java.util.TreeMap;

public class Task061125 {
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<>();
map.put(1, "one");
map.put(3, "three");
map.put(5, "five");
map.put(7, "seven");

System.out.print(map.lowerKey(4) + " ");
System.out.print(map.floorKey(4) + " ");
System.out.print(map.higherKey(4) + " ");
System.out.print(map.ceilingKey(4));
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
50%
3 3 5 4
25%
3 3 5 5
0%
3 3 4 4
25%
3 4 5 4
👍1
Вопрос с собеседований

Что такое шаблон Singleton? 🤓


Ответ:

Singleton
гарантирует, что класс имеет только один экземпляр.

В Java часто реализуют через enum, так как это потокобезопасно и защищено от сериализации.

Используется для глобальных конфигураций, логгеров, кэшей, соединений.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2