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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Варианты ответа:
Anonymous Quiz
33%
6
17%
9
42%
12
8%
15
👍1
Вопрос с собеседований

Что такое CI/CD pipeline? 🤓


Ответ:

CI/CD
— это процесс автоматизации сборки, тестирования и доставки кода.

CI (Continuous Integration) проверяет код при каждом коммите, CD (Continuous Deployment/Delivery) — автоматически выкатывает его на сервер.

Примеры: Jenkins, GitHub Actions, GitLab CI.



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


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

Александр Юльевич Дроздов (род. 14 ноября 1966) — российский разработчик/учёный, кандидат/д.т.н.; вёл работы по трансляторам, автоматическим распараллеливателям и созданию Универсальной Библиотеки Трансляции (УБТ), применимым к современным архитектурам (x86, ARM и др.).

Питер Нортон (англ. Peter Norton; род. 14 ноября 1943)американский предприниматель, программист и филантроп. В 1980-х годах создал популярную программу для персональных компьютеров, позволяющую восстанавливать стёртые данные. Эта утилита вместе с несколькими другими образовали пакет Norton Utilities. Вскоре в пакет был включён Norton Commander, удобный файловый менеджер для операционной системы DOS.


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

1969 — с мыса Канаверал стартовал к Луне американский космический корабль «Аполлон-12», пилотируемый астронавтами Ч. Конрадом, А. Бином и Р. Гордоном.


#Biography #Birth_Date #Events #14Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Раздел 6. Коллекции в Java

Глава 5. Map — отображения (словари)

Основные методы: Итерация по Map: entrySet, keySet, values

Итерация по Map — это не просто последовательный перебор элементов, а сложный процесс навигации по внутренней структуре данных, который должен учитывать специфику реализации, обеспечивать корректность при concurrent модификациях и предоставлять различные perspectives на данные. Три основных view — entrySet, keySet и values — представляют собой разные проекции одного и того же набора данных, каждая из которых оптимизирована для определенных сценариев использования.


Общая архитектура представлений (Views)

Представления в Map реализованы по принципу lazy initialization и являются "окнами" в основную структуру данных. Они не содержат собственных копий элементов, а предоставляют live view содержимого Map. Это создает как преимущества в виде экономии памяти и мгновенного отражения изменений, так и challenges в обеспечении consistency и производительности.


Модель отложенной инициализации

Все три представления обычно создаются по требованию при первом вызове соответствующих методов.

Механизм их работы строится на следующих принципах:
Легковесность: Представления не дублируют данные, а содержат ссылки на исходную Map
Синхронизация изменений: Модификации в Map немедленно отражаются в представлениях
Разделяемая состояние: Несколько представлений разделяют общее состояние с родительской Map
Делегирование операций: Все методы представлений делегируются к внутренней структуре Map



Метод entrySet()

Метод entrySet() возвращает представление пар "ключ-значение" в виде Set объектов Map.Entry. Это наиболее полное и мощное представление, предоставляющее доступ как к ключам, так и к значениям, а также возможность модификации значений через интерфейс Map.Entry.

Внутренняя механика работы

Структура данных представления:
Для каждой реализации Map создается специализированная реализация Set, которая инкапсулирует логику обхода внутренней структуры данных. Эта реализация содержит ссылку на родительскую Map и делегирует ей все операции.

Процесс итерации:
Итератор для entrySet должен на каждом шаге извлекать как ключ, так и значение, что требует coordinated доступа к внутренним структурам данных.

Процесс итерации варьируется в зависимости от реализации:
В HashMap: Итератор проходит по массиву бакетов, для каждого непустого бакета обходит цепочку коллизий (связный список или дерево), создавая объекты Map.Entry для каждого элемента
В TreeMap: Итератор выполняет обход красно-черного дерева в порядке inorder traversal, гарантируя сортированный порядок элементов
В LinkedHashMap: Итератор следует по двусвязному списку, поддерживающему порядок добавления или доступа


Механизм создания Map.Entry:
Объекты Map.Entry, возвращаемые итератором, обычно являются view objects, которые не хранят данные самостоятельно, а содержат ссылки на внутренние узлы структуры данных. Это позволяет эффективно обновлять значения через метод setValue().


Особенности производительности

Временная сложность: Полный обход через entrySet имеет сложность O(n), где n — количество элементов в Map. Однако константные множители значительно различаются между реализациями.
Потребление памяти: entrySet создает временные объекты Map.Entry во время итерации, что может создавать pressure на garbage collector при обходе больших коллекций.
Оптимизации: Современные JVM применяют escape analysis и stack allocation для минимизации overhead создания временных объектов.



#Java #для_новичков #beginner #Map #entrySet #keySet #values
Метод keySet()

Метод keySet() возвращает представление ключей Map в виде Set. Это представление фокусируется исключительно на ключах, предоставляя упрощенный view данных, который полезен для операций проверки принадлежности, массового удаления и других операций, ориентированных на ключи.

Внутренняя механика работы

Архитектура представления:

keySet реализуется как специализированный Set, который делегирует все операции родительской Map. Критически важным аспектом является то, что операции удаления через keySet непосредственно влияют на исходную Map.

Процесс итерации:
Итератор keySet извлекает только ключи, пропуская значения.

Это может быть более эффективно в сценариях, где значения не нужны:
В HashMap: Итератор обходит ту же структуру бакетов, что и entrySet, но возвращает только ключевую компоненту
В TreeMap: Обход дерева выполняется аналогично entrySet, но с извлечением только ключей
В LinkedHashMap: Следование по связному списку с возвратом ключей


Операция удаления через итератор:
При вызове remove() итератора keySet происходит удаление соответствующей пары "ключ-значение" из Map. Этот процесс требует локализации и удаления всего узла, а не только ключа.

Особенности производительности
Эффективность обхода: keySet может быть более эффективен, чем entrySet, когда требуются только ключи, так как избегает создания объектов Map.Entry и извлечения значений.
Операции массового удаления: Методы removeAll() и retainAll() в keySet оптимизированы для работы с ключами и могут быть более эффективны, чем эквивалентные операции через entrySet.
Потребление памяти: keySet обычно создает меньше временных объектов во время итерации по сравнению с entrySet.



Метод values()

Метод values() возвращает представление значений Map в виде Collection. Это представление фокусируется исключительно на значениях, предоставляя view, которое полезно для операций обработки значений, статистического анализа и преобразований.

Внутренняя механика работы

Архитектура представления:
values возвращает Collection, а не Set, поскольку значения могут содержать дубликаты. Эта коллекция поддерживает только операции итерации и удаления, но не добавления, так как значения не могут существовать без ключей.

Процесс итерации:

Итератор values извлекает только значения, что может быть наиболее эффективно в сценариях, где требуются исключительно значения:
В HashMap: Итератор проходит по бакетам и цепочкам, извлекая только value компоненту узлов
В TreeMap: Обход дерева с возвратом значений в порядке сортировки ключей
В LinkedHashMap: Следование по списку с извлечением значений


Особенности модификации:
Коллекция values поддерживает удаление элементов через итератор и методы коллекции. Однако операция удаления по значению требует поиска соответствующего ключа, что может быть затратным.

Особенности производительности
Эффективность для value-oriented операций: values является наиболее эффективным представлением для операций, ориентированных исключительно на значения, таких как статистические вычисления, агрегации и преобразования.
Сложность операций удаления: Удаление по значению требует поиска ключа, ассоциированного с данным значением, что может иметь сложность O(n) в худшем случае.
Отсутствие гарантий уникальности: Поскольку значения могут дублироваться, итерация через values может возвращать повторяющиеся элементы.



Сравнительный анализ представлений

Производительность итерации

Временная сложность:
Все три представления имеют одинаковую асимптотическую сложность O(n) для полного обхода, но различаются константными множителями:
entrySet: Наиболее универсален, но создает наибольшее количество временных объектов
keySet: Более эффективен при работе только с ключами, уменьшает overhead
values: Наиболее эффективен при работе только со значениями


Потребление памяти:
entrySet: Создает временные объекты Map.Entry
keySet: Минимальное потребление памяти при итерации
values: Сравнимо с keySet по потреблению памяти


#Java #для_новичков #beginner #Map #entrySet #keySet #values
Семантика модификаций

Влияние на исходную Map:
Все три представления предоставляют live view, и модификации через них непосредственно влияют на исходную Map:
Удаление через любой итератор удаляет соответствующую пару из Map
Изменение значений через entrySet изменяет значения в Map
Очистка представления очищает исходную Map


Ограничения модификаций:

entrySet: Поддерживает модификацию значений через Map.Entry.setValue()
keySet: Поддерживает только удаление элементов
values: Поддерживает только удаление элементов



Специфика реализации в различных Map

HashMap и связанные реализации

Структура итератора:
Итераторы в HashMap должны обрабатывать сложную структуру данных, включающую массив бакетов, связные списки и деревья.

Процесс итерации включает:
Поиск следующего непустого бакета
Навигацию по цепочке коллизий (список или дерево)
Обработку структурных изменений во время итерации


Механизм fail-fast:
Итераторы HashMap используют счетчик modCount для обнаружения структурных изменений во время итерации. При обнаружении неавторизованной модификации выбрасывается ConcurrentModificationException.

Оптимизации Java 8+:
В современных версиях HashMap итераторы эффективно работают с hybrid структурами, автоматически адаптируясь к спискам и деревьям.


TreeMap

Упорядоченная итерация:


TreeMap обеспечивает обход элементов в sorted порядке, что достигается через:
Inorder traversal красно-черного дерева
Эффективные алгоритмы навигации между узлами
Поддержку descending итераторов

Балансировка и итерация:
Процесс итерации должен корректно работать в условиях ongoing балансировки дерева, обеспечивая consistency обхода.


LinkedHashMap

Итерация с сохранением порядка:
LinkedHashMap гарантирует итерацию в порядке добавления или доступа, что реализуется через:
Следование по двусвязному списку
Поддержку access-order при итерации
Эффективное обновление порядка при операциях доступа



ConcurrentHashMap


Потокобезопасная итерация:
ConcurrentHashMap предоставляет weakly consistent итераторы, которые:
Не выбрасывают ConcurrentModificationException
Могут отражать только часть изменений, произошедших после создания итератора
Обеспечивают высокую производительность в многопоточной среде


Сегментированный обход:
Итерация в ConcurrentHashMap может выполняться по сегментам, что позволяет параллельную обработку в некоторых сценариях.


Потокобезопасность и concurrent модификации

Модель fail-fast

Большинство несинхронизированных реализаций Map используют fail-fast итераторы, которые:
Выбрасывают ConcurrentModificationException при обнаружении структурных изменений
Основаны на сравнении счетчика modCount
Обеспечивают раннее обнаружение ошибок синхронизации


Weakly consistent итераторы
ConcurrentHashMap и другие concurrent реализации используют weakly consistent итераторы, которые:
Не гарантируют отражение всех последних изменений
Не выбрасывают исключения при concurrent модификациях
Обеспечивают баланс между performance и consistency


#Java #для_новичков #beginner #Map #entrySet #keySet #values
Что выведет код?

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

public class Task131125 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);

map.keySet().remove("a");
map.values().remove(2);
map.entrySet().removeIf(entry -> entry.getKey().equals("c"));

System.out.println(map.size());
System.out.println(map.get("a"));
System.out.println(map.get("b"));
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
22%
0 null null
44%
1 null 2
11%
0 null 2
22%
1 null null
Вопрос с собеседований

Что такое REST и его принципы? 🤓


Ответ:

REST
— архитектурный стиль, основанный на HTTP.

Он использует стандартные методы (GET, POST, PUT, DELETE), работает со статeless-сессиями и возвращает ресурсы в виде JSON или XML.

Главные принципы — унифицированный интерфейс и отсутствие состояния.



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


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

Григорий Самуилович Цейтин (15 ноября 1936 года, Ленинград — 27 августа 2022 года, Кэмпбелл, Калифорния, США) — советский и американский учёный-математик и специалист по теории вычислимости; известен Tseitin-преобразованием (широко используется в преобразовании логических формул для SAT-солверов) и работами по тематике Algol-68.


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

1971 — фирма «Intel» выпустила свой первый микропроцессор — модель 4004.


#Biography #Birth_Date #Events #15Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ну что устроим завтра встречу?

Вам интересно?

👍 - если придёте)
👍6
История IT-технологий сегодня — 16 ноября


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

Дэвид Паттерсон (англ. David A. Patterson, 16 ноября 1947 года, Эвергрин-Парк[англ.], Иллинойс) — американский учёный в области архитектуры вычислительных систем; один из авторов идеи RISC, соавтор работ по RAID и многим фундаментальным исследованиям по архитектуре процессоров (лауреат премии Тьюринга).

Кристофер С. Стрейчи (16 ноября 1916 г. – 18 мая 1975 г.) — британский пионер в теории программирования и семантике языков; один из основателей денотационной семантики и ранний разработчик концепций time-sharing и языковых абстракций.


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

1965 — в СССР запущена автоматическая межпланетная станция «Венера-3», беспилотный космический корабль, который первым достиг поверхности Венеры (врезался в неё). Он стал первым земным аппаратом, достигшим поверхности другой планеты.


#Biography #Birth_Date #Events #16Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
JOOQ. Взаимодействуй с БД по-новому.

В сегодняшнем видео мы познакомились с библиотекой взаимодействия с БД - JOOQ.

🔵Рассмотрели чем JOOQ отличается от JPA/Hibernate
🔵Разобрали как JOOQ работает.
🔵Написали демонстрационный код, разобрали как генерируются файлы.
🔵Как всегда немного подебажил))

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

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

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
История IT-технологий сегодня — 17 ноября


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

Дэвид Паттерсон (англ. David A. Patterson, 16 ноября 1947 года, Эвергрин-Парк[англ.], Иллинойс) — американский учёный в области архитектуры вычислительных систем; один из авторов идеи RISC, соавтор работ по RAID и многим фундаментальным исследованиям по архитектуре процессоров (лауреат премии Тьюринга).

Кристофер С. Стрейчи (16 ноября 1916 г. – 18 мая 1975 г.) — британский пионер в теории программирования и семантике языков; один из основателей денотационной семантики и ранний разработчик концепций time-sharing и языковых абстракций.


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

2006 — в США поступила в продажу игровая консоль 7-го поколения «Sony Playstation 3».


#Biography #Birth_Date #Events #17Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Определение схемы в GraphQL (SDL)

SDL (Schema Definition Language) — это декларативный язык описания GraphQL-схем.
Он задаёт структуру данных и операций, доступных клиенту.
SDL не содержит логики — это контракт, который определяет «форму» API: какие типы есть, какие поля у них доступны, какие аргументы принимаются.

GraphQL-сервер использует SDL как единый источник правды для валидации запросов и построения выполнения.



1. Основные виды типов в SDL

GraphQL предоставляет несколько видов типов, каждый из которых отвечает за свою роль.

1. type — объектный тип (основа схемы)

Используется для описания сущностей:
type User {
id: ID!
name: String!
posts: [Post!]!
}

Типы описывают структуру данных — аналог классов/DTO.


2. input — тип вводимых данных

Используется для аргументов мутаций или сложных параметров запросов.
Отличается от type тем, что не может содержать резолверов и нельзя ссылаться на type с циклом.

input CreateUserInput {
name: String!
age: Int
}


3. enum — перечисления

Хороший способ ограничить варианты.
enum Role {
ADMIN
USER
GUEST
}


4. interface — абстрактный тип

Позволяет описывать общий контракт нескольких типов.
interface Entity {
id: ID!
}

type User implements Entity {
id: ID!
name: String!
}

type Post implements Entity {
id: ID!
title: String!
}

Клиент может запросить id для любого, кто реализует Entity.


5. union — объединение разных типов

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

union SearchResult = User | Post | Comment



2. Как выглядит схема GraphQL


В GraphQL схема определяется набором корневых операций:
Query — чтение
Mutation — изменение
Subscription — события/стриминг


Пример минимальной структуры:
schema {
query: Query
mutation: Mutation
}

На практике «schema {}» часто опускают — сервер выводит её автоматически.


3. Полный пример схемы: пользователи, посты и комментарии

Ниже — типичная схема блог-платформы, написанная в чистом SDL.
Сущности
type User {
id: ID!
name: String!
role: Role!
posts: [Post!]!
}

type Post {
id: ID!
title: String!
content: String
author: User!
comments: [Comment!]!
}

type Comment {
id: ID!
text: String!
author: User!
}

Перечисления
enum Role {
ADMIN
USER
GUEST
}

Входные данные
input CreatePostInput {
title: String!
content: String
}

Запросы
type Query {
user(id: ID!): User
users: [User!]!

post(id: ID!): Post
posts(limit: Int, authorId: ID): [Post!]!
}

Мутации
type Mutation {
createPost(input: CreatePostInput!): Post!
deletePost(id: ID!): Boolean!
}

Подписки
type Subscription {
postCreated: Post!
}



#Java #middle #GraphQL
👍3
4. Как схема связана с кодом

SDL — декларация.
Сервер должен сопоставить поля типам данных и резолверам.


Java (graphql-java, Spring for GraphQL)

SDL:
type Query {
user(id: ID!): User
}


Резолвер:
@Component
public class UserResolver implements GraphQLQueryResolver {
private final UserService service;

public UserResolver(UserService service) {
this.service = service;
}

public User user(Long id) {
return service.findById(id);
}
}


GraphQL автоматически соединяет:
поле user → метод user класса UserResolver
аргумент id → параметр метода


На что важно смотреть в связке схема - код

SDL описывает только форму данных, не логику.
Все поля объектных типов должны иметь резолверы (кроме простых полей, которые GraphQL просто читает из объекта).
input использует DTO-классы.
enum маппится на Enum-класс.
union и interface требуют регистрации type resolver-а.



5. Эволюция схемы: изменение и поддержка версий

GraphQL спроектирован так, чтобы обеспечивать обратную совместимость.
Важный принцип: старые клиенты должны продолжать работать после обновлений.


1. Добавление полей — безопасная операция

Можно безболезненно добавлять:
новые поля в типы
новые аргументы с default value
новые типы
новые enum-значения (если клиенты готовы к неизвестным значениям)


Пример:
type User {
id: ID!
name: String!
email: String # новое поле
}


2. Деприкация полей

Поле нельзя удалить сразу — сначала его помечают как
@deprecated.
type User {
id: ID!
name: String!

# старое поле
username: String @deprecated(reason: "Use 'name' instead")
}


Клиентский код и инструменты разработчика (GraphiQL, GraphQL Codegen) предупредят о деприкации.

3. Удаление полей

Удалять поле можно только после:
уведомления клиентов,
завершения миграции SDK/фронта,
истечения grace-period'a.


4. Эволюция enum-ов

Добавлять значения — безопасно.
Удалять — нет.


5. Миграции input-типов

Если нужно изменить входные данные:
Старое:
input CreatePostInput {
title: String!
}

Новое:
input CreatePostInput {
title: String!
content: String @deprecated(reason: "Use body instead")
body: String
}


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

import java.util.EnumMap;
import java.util.Map;

enum Color { RED, GREEN, BLUE }

public class Task171125 {
public static void main(String[] args) {
Map<Color, String> map = new EnumMap<>(Color.class);

map.put(Color.RED, "red");
map.put(Color.GREEN, null);
map.put(null, "null value");

System.out.println(map.get(Color.RED));
System.out.println(map.get(Color.GREEN));
System.out.println(map.get(null));
System.out.println(map.size());
}
}


#Tasks