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).
Выбор между этими свойствами зависит от требований и характеристик конкретной системы и ее целей.
#вопросы_с_собеседований
Какие возможности Spring предоставляет для коммуникации с базой данных?
Spring предоставляет мощный набор инструментов для работы с базами данных. Ниже перечислены некоторые из них:-
Spring JDBC
: Абстракции над JDBC (Java Database Connectivity), что упрощает взаимодействие с базой данных через простые API.-
Spring Data JPA
: Spring абстракция над JPA (Java Persistence API) и упрощает взаимодействие с объектно-реляционными базами данных (ORM).-
Spring ORM
: Spring ORM интегрирует ORM-фреймворки, такие как Hibernate
, с Spring Framework
. Он обеспечивает удобную интеграцию между Spring и ORM-фреймворками, предоставляя возможности управления транзакциями, упрощенный доступ к данным и возможности кэширования.-
Spring Data JDBC
: Альтернативный подход к доступу к данным с использованием JDBC. В отличие от ORM, Spring Data JDBC предлагает простую и прямолинейную модель доступа к данным без использования объектно-реляционного отображения (ORM).-
Spring Transactions
: Spring предоставляет механизм управления транзакциями для работы с базами данных. Он позволяет объявлять транзакции с помощью аннотаций или XML-конфигурации.-
Spring Batch
: Spring Batch предоставляет возможности для пакетной обработки данных, включая чтение, обработку и запись данных в базу данных.
#вопросы_с_собеседований
Когда лучше использовать наследование, а не агрегацию?
Использование наследования целесообразно, когда существует отношение "является" (is-a) между классами. То есть, если один класс является специализацией или расширением другого класса.
Наследование позволяет унаследовать свойства и методы родительского класса, а также добавить или изменить их в производном классе. Это способствует повторному использованию кода и созданию иерархий классов.
Агрегацию следует использовать, когда существует отношение "имеет" (has-a) между классами. Это означает, что один класс содержит экземпляр другого класса в качестве своего члена.
Агрегация позволяет создавать более сложные объекты, состоящие из других объектов, и устанавливать между ними отношения. В отличие от наследования, агрегация не создает иерархических связей между классами.
POJO
Термин POJO
означает Plain Old Java Object
, что переводится как "простой старый Java-объект". POJO - это обычный Java-класс, который не зависит от каких-либо фреймворков или библиотек и не имеет особых ограничений или требований к своей структуре.POJO
классы часто используются в различных контекстах, таких как модель данных, передача данных или DTO
(Data Transfer Object). Они служат для хранения данных и обеспечивают доступ к этим данным через геттеры и сеттеры.
В этом примере класс Person
имеет два приватных поля name
и age
, а также соответствующие геттеры и сеттеры для доступа к этим полям. Геттеры используются для получения значений полей, а сеттеры - для установки новых значений.
#вопросы_с_собеседований
Что такое optimistic и pessimistic locking?
Это две стратегии управления параллельным доступом к данным в многопоточной или распределенной среде.Optimistic locking
— это подход, основанный на предположении, что конфликты при доступе к данным происходят редко.
При оптимистической блокировке ресурс не блокируется для других потоков во время чтения. Когда поток пытается изменить ресурс, происходит проверка наличия конфликтов. Обычно используются механизмы версионирования (например, с помощью временных меток или счетчиков) для обнаружения изменений.Pessimistic locking
— это подход, при котором ресурс блокируется для других потоков во время чтения или записи.
При пессимистической блокировке поток, запрашивающий доступ к ресурсу, получает эксклюзивное право на его использование до тех пор, пока не освободит его. Pessimistic locking
обеспечивает более жесткую синхронизацию и может быть полезен в случаях, когда конфликты доступа к данным возникают часто.
Для реализации блокировки можно использовать различные механизмы, такие как synchronized
блоки, ключевое слово volatile
, Lock
или ReadWriteLock
интерфейсы.
#вопросы_с_собеседований
Как хранятся соотношения 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
ACID (Atomicity, Consistency, Isolation, Durability)
Это набор свойств, которые обеспечивают надежность и целостность транзакций в базах данных. Хотя ACID является широко применяемым концептом в области баз данных, в Java есть различные способы обеспечения ACID-транзакций в приложениях, работающих с базами данных.
Одним из распространенных способов работы с ACID-транзакциями в Java является использование JDBC
(Java Database Connectivity
), который предоставляет стандартный способ взаимодействия с базами данных в Java. В JDBC
есть возможность создания транзакций, используя методы commit()
и rollback()
.
ACID-транзакции можно использовать с различными базами данных, такими как MySQL, PostgreSQL, Oracle и другими, поддерживающими JDBC.
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor является реализацией интерфейса ScheduledExecutorService и представляет собой пул потоков, который позволяет выполнять задачи по расписанию. Он предоставляет механизм для запуска задач через определенные интервалы времени или с определенной задержкой.
В этом примере создается ScheduledThreadPoolExecutor
с двумя рабочими потоками. Затем мы запускаем задачу delayedTask
с задержкой в 5 секунд с помощью метода schedule
. Затем мы запускаем периодическую задачу periodicTask
, которая будет выполняться каждую секунду, начиная сразу же, используя метод scheduleAtFixedRate
.
После запуска задач мы ждем 10 секунд, чтобы дать им выполняться. Затем мы вызываем shutdown()
для остановки пула потоков.
Prototype
В Java паттерн Prototype используется для создания новых объектов путем клонирования существующих объектов, вместо создания новых объектов с помощью конструкторов. Prototype
позволяет создавать копии объектов с минимальными затратами и избегать сложной логики инициализации объектов.
Для реализации этого паттерна необходимо, чтобы классы имели возможность клонирования, что достигается реализацией интерфейса Cloneable
и переопределением метода clone()
.
В этом примере класс Sheep
имеет два приватных поля name
и color
, а также соответствующие геттеры и сеттеры. Класс также имплементирует интерфейс Cloneable
и переопределяет метод clone()
для создания копии объекта.
В main
мы создаем оригинальный объект, клонируем его с помощью метода clone()
и получаем клонированный объект clonedSheep
. Затем мы изменяем его параметры и выводим результат.
Java Bean
JavaBeans - это стандартный подход к созданию переносимых и повторно используемых компонентов. Они представляют собой классы, которые следуют определенным соглашениям и обеспечивают удобный способ управления состоянием и поведением объектов.
Основные характеристики JavaBeans:
1. Класс должен быть публичным и иметь открытый конструктор без аргументов.
2. Приватные поля класса должны быть доступны с помощью геттеров и сеттеров (getter
и setter
методы).
3. Класс должен быть сериализуемым, то есть должен реализовывать интерфейс Serializable
.JavaBeans
также могут иметь дополнительные свойства, такие как события и методы уведомления, которые позволяют другим компонентам реагировать на изменения состояния.
synchronized
Ключевое слово synchronized используется для обозначения синхронизированных блоков кода или методов. Оно обеспечивает монопольный доступ к определенному коду, чтобы только один поток исполнения мог выполнять этот код в данный момент времени.
Синхронизация помогает предотвратить состояние гонки (race condition), когда несколько потоков пытаются одновременно изменить общие ресурсы.
Важно отметить, что синхронизация может повлечь за собой ухудшение производительности, поэтому следует использовать ее только там, где это необходимо для правильной работы с общими ресурсами и избегать излишней синхронизации.