Изучаем Java. По вопросам сотрудничества: @seniorvladislav
Low Coupling
Low Coupling (низкая связанность) — это принцип проектирования программного обеспечения, который подразумевает, что модули или классы должны быть максимально независимы друг от друга.
В контексте Java, низкая связанность означает, что классы должны взаимодействовать друг с другом через четко определенные интерфейсы, а не напрямую через внутренние детали реализации.
В этом примере у нас есть интерфейс DataSource
, который определяет контракт для получения данных. У нас также есть два класса, реализующих этот интерфейс: DatabaseDataSource
и ApiDataSource
. Класс DataProcessor
обрабатывает данные, полученные из разных источников, но взаимодействует с ними только через интерфейс DataSource
. Это обеспечивает низкую связанность между классами, так как DataProcessor
не зависит от конкретных реализаций источников данных.
Java-разработка: где найти и сравнить лучшие курсы?
Tutortop — образовательный маркетплейс №1, где представлено свыше 5000 курсов от более чем 300 школ и все их можно сравнить по рейтингу, цене и отзывам, а еще купить дешевле, чем напрямую 🔥
Собрали для вас подборку из топовых курсов для Java-разработчиков по мнению их пользователей:
— Профессия «Java-разработчик» от Skypro Рейтинг 4.9 из 5.
— Онлай-курс «Java-разработчик» от Бруноям. Рейтинг 4.9 из 5.
— Профессия «Java-разработчик с гарантией трудоустройства» от Product Star. Рейтинг 4.8 из 5.
Десятки других курсов по программированию на любом языке можно найти и сравнить на tutortop!⚡️
ScheduledExecutorService
ScheduledExecutorService — это интерфейс, предоставляющий возможность планирования задач на выполнение в будущем в Java. Он является частью библиотеки java.util.concurrent
, которая предоставляет классы и интерфейсы для обработки многопоточности и параллельности.
В данном примере мы создаем ScheduledExecutorService
с одним потоком и создаем задачу - отображение строкового сообщения. Задача будет выполняться каждую секунду начиная с 2-ой секунды после запуска. Затем мы ждем 10 секунд и останавливаем задачу, используя метод cancel()
. Наконец, мы закрываем ScheduledExecutorService
.
Результатом работы данного кода будет вывод в консоли строки "Строка вывода из задачи" каждую секунду, начиная с 2-ой секунды после запуска. После 10 секунд работы задача будет остановлена.
Hashset
HashSet - это одна из основных структур данных в Java Collections API. Он представляет собой набор элементов, где каждый элемент уникален, и порядок элементов не гарантируется. HashSet
основан на HashMap
, и его производительность во многом зависит от начальной емкости и коэффициента загрузки.
В этом примере мы создаем HashSet
с типом String
и добавляем в него несколько элементов. Обратите внимание, что мы добавляем "Apple" дважды. Затем мы выводим все элементы HashSet
с помощью цикла for-each
.
Элемент "Apple" добавлен только один раз, хотя мы пытались добавить его дважды. Это происходит потому, что HashSet
автоматически удаляет дубликаты.
#вопросы_с_собеседований
Какие основные принципы Stream API?
Stream API - это функциональный интерфейс в Java 8, который позволяет работать с коллекциями объектов с помощью функциональных операций.
Основные принципы Stream API включают в себя:
- Stream API не выполняет операции над элементами коллекции до тех пор, пока не будет вызван терминальный метод.
- Stream API представляет собой поток данных, который можно обрабатывать с помощью функциональных операций.
- Stream API предоставляет множество функциональных операций, таких как filter()
, map()
, reduce()
и т. д., которые позволяют обрабатывать элементы потока данных.
- Stream API не изменяет исходную коллекцию, а создает новый поток данных на основе исходной коллекции.
- Stream API позволяет обрабатывать элементы потока данных параллельно, что может ускорить выполнение операций над большими коллекциями.
- Stream API требует вызова терминальной операции, такой как forEach()
, collect()
или reduce()
, чтобы выполнить операции над элементами потока данных и получить результат.
#вопросы_с_собеседований
Как хранятся соотношения one-to-one, one-to-many и many-to-many в виде таблиц?
Соотношения one-to-one, one-to-many и many-to-many в таблицах баз данных хранятся следующим образом:
- Соотношение one-to-one — в одном primary key одной таблицы хранятся значения, связанные с другой одиночной таблицей во внешнем ключе (foreign key).
- Соотношение one-to-many — в таблице, которая "one", в качестве primary key используется идентификатор объекта, который распространяется на все связанные объекты в таблице, которая "many". Так, одно значение может ссылаться на несколько значений в другой таблице.
- Соотношение many-to-many — необходимо создать дополнительную таблицу, которая связывает связанные таблицы. Так, в этой дополнительной таблице устанавливается соответствие между primary key одной таблицы и primary key другой таблицы.
#вопросы_с_собеседований
Какие виды Garbage Collector есть в HotSpot?
В HotSpot JVM имеется несколько видов Garbage Collector:
1. Serial: однопоточный сборщик мусора, обрабатывает один поток в куче, который блокирует все приложение на этапе сборки мусора;
2. Parallel: многопоточный сборщик мусора, работает по тому же принципу, что и Serial, но использует несколько потоков для устройства сборки мусора, что сокращает время блокировки приложения;
3. CMS (Concurrent Mark-Sweep): сборщик мусора для больших куч, работает параллельно со стоп-временем, когда сборка мусора производится мгновенно, а приложение продолжает работу во время сборки мусора;
4. G1 (Garbage First): сборщик мусора нового поколения с выделенной кучей на основе регионов, который был разработан с целью улучшения показателей быстродействия и уменьшения времени блокировки. G1 собирает мусор в регионах, где около 25% от общего числа объектов имеют самую высокую степень задействованности и блокирует только те регионы, где собран мусор.
IdentityHashMap
Класс IdentityHashMap
в Java является реализацией интерфейса Map
и работает на основе проверки на равенство ссылок объектов, а не на основе метода equals
.
Это означает, что если два объекта, хранящихся в IdentityHashMap
, содержат одинаковые значения полей, но разные ссылки, то они будут считаться разными ключами.IdentityHashMap
может быть полезной альтернативой для HashMap
в тех случаях, когда ключом является объект, и необходимо учесть различие между ссылками на объект.
Spring JDBC
Spring JDBC - это фреймворк Spring, который предоставляет удобный и гибкий доступ к базам данных через JDBC API в Java.
В данном примере создается класс JdbcTemplateExample
, в конструктор которого передается Datasource
. JdbcTemplate
используется для выполнения запросов к базе данных.
Метод getAllNames
использует метод query
для выполнения запроса SELECT
и получения имени всех пользователей из таблицы users
, обрабатывая результаты через интерфейс RowMapper
.
Метод addUser
использует метод update
для выполнения запроса INSERT
и добавления нового пользователя в таблицу users
.
Результатом метода getAllNames
будет список всех имен пользователей, а метод addUser
добавит нового пользователя в таблицу users
.
*Чтобы полностью понимать, как работает Spring JDBC
, необходимо также разобраться в различных методах и классах, которые используются при работе с ним.
⌨️Изучать Java с нуля гораздо интереснее, если сразу начать делать игры!
При работе на Java вы вряд ли столкнетесь с разработкой игр, однако так вы сможете увидеть, как изменение кода приводит к изменению поведения программ.
📆Приглашаем 8 июня в 20:00 на открытый урок «Создание игры на Java и LibGDX с нуля». Вебинар приурочен к старту специализации «Java Developer».
На вебинаре создадим небольшую двумерную игру на Java с нуля, изучим принципы кодирования и разработаем логику игры на ходу.
Урок будет полезен тем, кто хочет:
— Начать изучать Java с нуля.
— Посмотреть, как на практике создаются Java-приложения на примере 2D игры.
— Создать свою игру и уже имеет базовые навыки программирования.
В результате урока вы:
— Увидите, как пишется код и создаются программы на языке Java.
— Узнаете, из каких базовых блоков строятся программы.
После вебинара онлайн-курс можно приобрести в рассрочку.
➡️Для участия зарегистрируйтесь: https://otus.pw/NAKO/
Нативная интеграция. Информация о продукте www.otus.ru
TreeMap
TreeMap - это класс, который реализует интерфейс Map и представляет отображение, где ключи хранятся в отсортированном порядке. TreeMap
хранит элементы в красно-черном дереве, что обеспечивает быстрый доступ и эффективный поиск элемента по ключу.
Элементы в TreeMap
автоматически сортируются по ключу. Также можно использовать методы get(key)
, remove(key)
и др., чтобы получить, удалить или изменить элементы в TreeMap
.
В этом примере мы создаем TreeMap
, добавляем в нее несколько элементов и выводим все элементы. При запуске программы в консоли вы увидите следующий вывод:
1 - одинЧитать полностью…
2 - два
3 - три
4 - четыре
5 - пять
✏️ 6 июня в 19:00 по МСК пройдёт бесплатный вебинар «Spring. Ошибки и решения»
Что будет на трансляции:
— Spring Initz, шаблон приложения
— Архитектура базового микросервиса
— ControllerAdvice — обработка ошибок в контроллерах
— JPA генерация
Ведущий: Сергей Полухин, Senior Java Developer, старший разработчик и руководитель разработки на проектах Infobip, Сбера, Evento, суперкассы, основатель PDev Studio.
🚀 Бесплатная регистрация: https://clck.ru/34asdN
Middle/Senior Node.JS Developer [МТС еСпортс]
Привет, мы команда МТС Digital. И у нас в разработке крутой продукт для стриминга, а именно мы создаем инструменты для работы с видео, которые помогут блогерам получить охваты с новых рынков и всегда оставаться в топе:)
Сейчас мы ищем Backend node.js Developer-а, который будет:
· Разрабатывать backend-логику WEB-продуктов
· Участвовать в разработке архитектуры проекта, в создании продукта «с нуля» и самостоятельно выбирать техническое решение поставленных задач
· Подключать сторонние API
Скорее переходи по ссылке и присылай свой отклик
Cartesian product
Это операция, которая создает все возможные пары элементов, взятых из двух наборов. В Java это реализуется с помощью оператора foreach
, который работает с коллекциями.
Например, если у нас есть две коллекции: A = {1, 2, 3}
и B = {a, b}
, то произведение A
и B
будет выглядеть следующим образом:
{(1, a), (1, b), (2, a), (2, b), (3, a), (3, b)}. Таким образом, мы получаем шесть возможных пар элементов из коллекций
A
и B
.cartesianProduct
типа List<List<Object>>
и результат выводится на экран.
Читать полностью…
👨🏻💻 Работаете удалённо и мечтаете переехать за рубеж?
Ваша мечта может стать реальностью с визой цифровых кочевников Digital Nomad Испании.
Данный путь подходит:
- удалённым работникам в найме,
- фрилансерам, которые оказывают услуги юрлицам в качестве ИП.
Это иммиграционная виза не просто ВНЖ Испании, это ПМЖ уже через 5 лет и паспорт через 10. С возможностью переезда всей семьёй.
👉🏻 Переходите в Telegram-канал и узнайте подробнее о релокации в Испанию и другие страны: /channel/+5obEnY4li843ZmJi
High Cohesion
High Cohesion (высокая связность) — это принцип проектирования программного обеспечения, который подразумевает, что каждый модуль или класс должен иметь четко определенную ответственность и выполнять только одну задачу. Это упрощает понимание, тестирование и поддержку кода, а также улучшает его модульность и масштабируемость.
В контексте Java, высокая связанность означает, что каждый класс должен иметь только одну причину для изменения. Это соответствует принципу единственной ответственности (Single Responsibility Principle, SRP) из принципов SOLID.
В этом примере у нас есть два класса: Calculator
и Printer
. Класс Calculator
отвечает за выполнение арифметических операций, таких как сложение и вычитание, в то время как класс Printer
отвечает за вывод сообщений на экран. Оба класса имеют высокую связность, так как каждый из них выполняет только одну задачу.
PriorityBlockingQueue
Это реализация BlockingQueue, которая хранит элементы в естественном порядке (если они реализуют Comparable), или в порядке, определенном Comparatorm. Это означает, что предметы, с наибольшим приоритетом, будут находиться в голове очереди и поэтому, будут выбираться для извлечения перед предметами с более низким приоритетом.
Класс PriorityBlockingQueue
является потокобезопасным, то есть может использоваться множеством потоков без необходимости дополнительной синхронизации.
В этом примере мы создали 4 задачи, каждая с заданым имением и приоритетом. Затем мы добавили все задачи в PriorityBlockingQueue
используя метод put()
. После этого мы извлекаем все элементы из очереди используя метод take()
.
Поскольку очередь PriorityBlockingQueue
гарантирует, что элементы будут храниться в порядке убывания приоритета, мы ожидаем, что во время выполнения кода задача с именем "JobC" будет выбрана первой, затем задача с именем "JobD" и т. д. Ответ был точно таким, как и ожидалось.
Многие компании уже перешли на микросервисную архитектуру. Хотите оставаться востребованным на рынке IT? Тогда самое время пополнять свой багаж знаний! Приходите 🗓 13 июня в 20:00 на открытый урок «DDD и модульные монолиты», который приурочен к старту онлайн-курса «Microservice Architecture» в OTUS.
На занятии мы рассмотрим:
— Основы domain-driven design
— Применение DDD к предметно-ориентированному проектированию
— Поймем, как DDD помогает в построении архитектуры.
👨💻 Спикер — Станислав Щетинников, директор разработки с 10-летним опытом. Архитектурой систем занимается уже больше 8 лет.
👉 Пройдите вступительный тест, чтобы записаться на урок — https://otus.pw/3L6r/
Вебинар приурочен к старту онлайн-курса «Microservice Architecture» в OTUS. После урока полный курс вы сможете приобрести удобным для вас способом.
Реклама. Информация о рекламодателе на сайте www.otus.ru
Стать сотрудником Яндекса быстрее и проще, чем кажется. Участвуйте в днях быстрого найма: решите тестовое, пройдите несколько секций собеседования и получите офер за несколько дней.
Ближайшие мероприятия:
• 17-18 июня — Fast Track для С++ и Python разработчиков, офер за 2 дня в команды Поискового портала.
• 24-25 июня — Fast Track для Java разработчиков, офер за 2 дня в команды Яндекс Маркета.
Зарегистрироваться
LinkedHashSet
LinkedHashSet представляет собой структуру данных, которая хранит элементы в порядке их добавления, а также не допускает дублирования элементов, как и HashSet.
Однако, в отличие от HashSet
, LinkedHashSet
сохраняет порядок добавления элементов, что может быть полезно в некоторых случаях.
Как видно из примера, элементы были добавлены в множество в порядке их добавления, а дубликат элемента "Java" не был добавлен в множество.
Изучите основы Java и разработайте приложение, даже если никогда прежде не программировали
Java — один из самых востребованных и доступных для освоения языков программирования. Его используют для создания сайтов, мобильных и десктоп-приложений, даже игр.
На бесплатном онлайн-курсе «Основы разработки на Java» за 4 занятия вы изучите основы синтаксиса языка Java и поймёте, подходит ли он вам, а в качестве практики разработаете приложение для публикации фото из NASA, а после сделаете на основе этого приложения Telegram-бота.
Зарегистрироваться → https://netolo.gy/bJKk
Реклама. ООО «Нетология» LatgBgyq1
SingleThreadPoolExecutor
SingleThreadPoolExecutor — это реализация интерфейса ThreadPoolExecutor, которая выполняет задачи в одном потоке. Она гарантирует, что только одна задача будет выполнена в любое время. Если в очереди имеется несколько задач, они будут исполняться последовательно, начиная с первой.
В результате работы данного кода мы получим вывод в консоль, где вначале будут выводиться сообщения о начале выполнения задач, а затем их завершения. Обратите внимание, что задачи выполняются последовательно и только одна задача выполняется в любой момент времени.
Hashtable
Hashtable в Java - это реализация коллекции Map, которая была добавлена в Java в версии 1.0.
В этом примере мы создали объект Hashtable
, добавили в него три элемента с ключами "A", "B" и "C" и значениями 1, 2 и 3 соответственно. Затем мы вывели на консоль все элементы таблицы, получили значение элемента с ключом "B" и удалили элемент с ключом "C".
Также мы проверили, содержится ли в таблице определенный ключ или значение, а также вывели на консоль размер таблицы.
*Hashtable
не рекомендуется к использованию в новых приложениях, вместо нее следует использовать более современную реализацию HashMap
или ConcurrentHashMap
.
Spring Transactions
Spring Transactions - это механизм, предоставляемый Spring Framework, который позволяет управлять транзакциями в Java-приложениях. Он предоставляет абстракцию уровня транзакций, которая скрывает детали управления транзакциями в низкоуровневых API базы данных, и упрощает создание транзакционных приложений.
В коде на первом изображении мы используем аннотацию @Transactional
для указания того, что метод createUser()
должен выполняться в контексте транзакции. Все операции с базой данных, включая вставку новой записи, будут обернуты в транзакцию.
На втором изображении представлен пример использования первого кода, мы создаем двух пользователей и пытаемся сохранить их в базе данных. Затем мы генерируем исключение RuntimeException
.
В результате выполнения данного кода, изменения в базе данных будут отменены, так как выполнявшиеся операции были выполнены в контексте транзакции, которая была отменена после генерации исключения.
flatMap
flatMap - это метод, который принимает функцию в качестве параметра, применяет ее ко всем элементам потока, а затем объединяет результаты в один поток. Обычно используется для работы с потоками, содержащими другие потоки или коллекции.
В этом примере мы используем flatMap
для преобразования потока сотрудников в поток проектов, используя лямбда-выражение, которое возвращает поток проектов сотрудника. Затем мы собираем все проекты в один поток при помощи метода collect
.
Таким образом, flatMap
очень полезен в случаях, когда нужно преобразовать поток, содержащий другие потоки или коллекции, в один плоский поток.
IoC (Inversion of Control)
Это модель программного проектирования, в которой управление жизненным циклом объекта переходит от самого объекта к внешним компонентам. Например, вместо того, чтобы объект сам создавал свои зависимости, он получает их извне.
В Java IoC
реализуется с помощью DI
(Dependency Injection) - механизма внедрения зависимостей.
В этом примере мы создали объект User
в одном месте нашего приложения, а затем передали его как зависимость в объект UserController
, который в свою очередь воспользовался этой зависимостью для выполнения своей работы. Это и есть пример IoC
и DI
в Java.
#вопросы_с_собеседований
Каковы особенности многопоточности в Java EE и Spring?
Одной из особенностей многопоточности в Java EE
и Spring
является использование синхронизации и примитивов синхронизации, таких как блокировки и семафоры, для предотвращения конфликтов между потоками.
Ещё одна важная особенность - использование пулов потоков для более эффективного использования ресурсов и увеличение производительности.
Также в Spring
есть возможность использования асинхронных методов, что позволяет не блокировать основной поток выполнения и ускорять обработку запросов.
WeakHashMap
WeakHashMap - это подкласс java.util.HashMap, который используется для хранения пар "ключ-значение". Основное отличие WeakHashMap
заключается в том, что он хранит ключи в виде "слабых ссылок" (weak reference), что означает их уничтожение при отсутствии сильной ссылки на объект.
Это позволяет использовать WeakHashMap для кэширования объектов, которые могут быть уничтожены сборщиком мусора в случае, если на них не осталось сильных ссылок. Это может подойти для объектов, созданных на основе потребительских запросов, которые не будут использоваться долгое время и не нужно хранить их в памяти постоянно.
В примере мы создаем объект и добавляем его в WeakHashMap
. Затем мы обнуляем ссылку на этот объект и запускаем сборщик мусора. После этого мы пытаемся получить значение по ключу и должны получить null
, так как ключ был удален из WeakHashMap
.
serialVersionUID
serialVersionUID является статическим полем, которое используется для контроля версий сериализуемых классов. Оно используется для определения уникальной идентификации класса при сериализации и десериализации объектов. serialVersionUID
помогает обеспечить совместимость между классами при изменении их структуры.
Когда класс сериализуется, serialVersionUID
записывается в поток данных вместе с объектом. При десериализации объекта Java сравнивает serialVersionUID
, прочитанный из потока данных, со значением текущего serialVersionUID
в классе:-
Если они совпадают, то класс считается совместимым и процесс десериализации может продолжаться. -
Если значения serialVersionUID
отличаются, будет сгенерировано исключение InvalidClassException
, указывающее на несовместимость версий класса.
#вопросы_с_собеседований
Что означает CAP-теорема?
CAP-теорема, также известная как теорема Брюэра, является концептуальной основой для понимания распределенных систем.
Она была предложена в 2000 году Эриком Брюэром и формулирует три фундаментальных свойства, которые невозможно обеспечить одновременно в распределенной системе данных: -
Согласованность (Consistency); -
Доступность (Availability);-
Устойчивость к разделению (Partition tolerance).
Согласно CAP-теореме, в распределенной системе данных можно гарантировать только два из трех свойств: -
Согласованность и доступность (CA);-
Согласованность и устойчивость к разделению (CP); -
Доступность и устойчивость к разделению (AP).
Выбор между этими свойствами зависит от требований и характеристик конкретной системы и ее целей.