Назовите основные свойства транзакции.
Атомарность (atomicity) гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной.
Согласованность (consistency). Транзакция, достигающая своего нормального завершения и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных.
Изолированность (isolation). Во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат.
Долговечность (durability). Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или сбои в оборудовании) изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу.
#вопросы_с_собеседований
Просто ли стать Java-разработчиком? Нет. Всем ли подойдет IT? Тоже нет. Стоит ли попробовать? Да.
Если вы хотите стать востребованным разработчиком, вам нужно не просто научиться писать код. А в первую очередь сформировать инженерное мышление.
На этом построен процесс обучения на Хекслете. На профессии «Java-разработчик» вас ждет не только теория, но и много практики:
✔️ Сотни упражнений в браузере.
✔️ 5 проектов для портфолио на GitHub.
✔️ 150 тестовых заданий от наших партнёров.
✔️ Вебинары, сессии лайвкодинга с наставником 1-2 раза в неделю.
Сделайте шаг к карьере IT-специалиста уже сегодня! Переходите по ссылке выше и начните обучение!
🎁 Пройдите первые 10 бесплатных уроков из профессии и получите дополнительно скидку 10% на курс!
Java. Распараллеливаем вычисления на пуле потоков
Разбираемся, как можно по простому ускорить вычисления с помощью параллельного выполнения на пуле потоков.
Исходный код
источник
👉👆
Содержит множество проектов на Java, которые могут быть полезны при изучении языка
https://github.com/topics/java
👉👆
Можно ли хранить null в стандартных коллекциях?
Все интерфейсы Collections Framework позволяют своим реализациям самостоятельно решать, поддерживать ли null-значения. Если реализация не может принять null
, она выбрасывает NullPointerException
или ClassCastException
.
Большинство списков (LinkedList
, ArrayList
) принимают null без проблем. Большинство очередей (Queue
и Deque
) не хранят null – возвращая из читающего метода null они сообщают пользователю о пустоте коллекции.
Unmodifiable Maps не допускают null-ов совсем. Обычные изменяемые мапы обычно не испытывают трудности со значениями null. А вот с ключами дело обстоит интереснее.HashMap
не может посчитать hash-сумму от null. Но вместо этого для таких ключей просто используется бакет номер 0.
Иногда этот вопрос дается как задача с подвохом про TreeMap
. Nullability
её ключей зависит от готовности к этому компаратора. Натуральный порядок (который работает для Comparable ключей) не поддерживает null. Раньше в реализации был баг, который позволял положить значение по ключу null в корень дерева без выброса исключения.
Для значений Set-ов действуют те же правила, что для ключей лежащих в основе их Map-ов.
👉👆
В чем секрет успешного разработчика? В умении не только писать код, но и мыслить алгоритмами.
Именно на этом построено обучение на Хекслете. Мы не сторонники подхода «повтори за учителем». Вы будете не просто писать код, а научитесь самостоятельно находить лучшие решения и сформируете инженерное мышление.
На профессии «Django Python-разработчик» вы:
✔️ Научитесь работать с сетевыми запросами.
✔️ Овладеете навыком проектирования архитектуры приложений.
✔️ Освоите самый популярный веб-фреймворк Django.
✔️ Подготовите 4 проекта для портфолио на GitHub.
✔️ Решите 150 тестовых заданий от наших партнёров.
Хотите узнать, подойдет ли вам обучение? Тогда переходите на сайт по ссылке выше и сделайте шаг в IT уже сегодня.
🎁 Пройдите первые 10 бесплатных уроков из профессии и получите дополнительно скидку 10%
В чем заключается особенность работы метода clone () с полями объекта типа ссылки?
При клонировании объектов копируются только примитивные значения и значение ссылок на объекты. Это значит, что если объект имеет во внутреннем поле ссылку на другой объект, то будет клонирована только эта ссылка, сам же этот другой объект клонирован не будет. Собственно, это и называют — поверхностным клонированием.
Ну а что, если вам нужно полноценное клонирование с клонированием всех вложенных объектов? Как сделать, чтобы это были не копии ссылок, а полноценные клоны объекты с другими занимаемыми ячейками памяти в куче?
На самом деле все довольно просто — для этого вам нужно в каждом классе этих внутренних объектов также переопределить метод clone() и добавить интерфейс маркер — Cloneable. Тогда будут скопированные не ссылки на объекты, а сами объекты, ведь теперь они тоже имеют возможность копировать себя.
#вопросы_с_собеседований
Носить с собой цветок на удачу или сделать что-то конкретное, чтобы сохранить свои деньги в сложившихся обстоятельствах? ⤵️
Сейчас самый надежный актив — недвижка, тем более IT-ипотека стала доступной. Ставка от 3 до 5%.
Главное, правильно выбрать объект для покупки — квартиру можно будет сдавать в аренду и иметь пассивный доход из любой точки мира, или продать и заработать на росте стоимости.
Чекайте всё самое важное про IT-ипотеку:
— Новые упрощенные условия
— Быстрая проверка аккредитации вашей IT-компании
— Сравнение расчётов по IT-ипотеке с другими программами
И сразу смотрите ТОП 4 квартиры, которые для вас уже подобрали и рассчитали по самым выгодным условиям.
Подписывайтесь на канал Анны Жуковой, где она публикует лучшие предложения по недвижке для айтишников и не только — /channel/anna_zuki
Деньги будут работать на вас и приносить новые деньги, а вы спокойно будете жить там, где вам комфортно )
Что такое effectively final и что с ним делать
Начну с правильного ответа на вопрос выше. В точке Б мы получим предупреждение компилятора: local variables referenced from a lambda expression must be final or effectively final
В этом посте обсудим, что означает effectively final, о чём молчит спецификация и как менять переменные внутри лямбд.
Про модификатор final всё понятно — он запрещает изменение переменной
final int count = 100;
count
всегда будет равен 100. Каждый, кто напишет count = 200;будет осуждён компилятором. Для ссылок схема такая же:
final User admin = User.createAdmin();Ссылка
admin
всегда будет указывать на объект User с параметрами админа. Никто не может её переприсвоить:❌ admin = new User(…)Effectively final называется переменная, значение которой не меняется после инициализации. По сути это тот же final, но без ключевого слова.
int x;Вот так норм:
if (…) х = 10
int x;2️⃣ Переменная не меняется внутри лямбды и после неё
if (…) х = 10; else х = 15;
int х = 10;❓ Зачем нужно такое ограничение?
…лямбда…
❌ х = 15
User user = …
…лямбда…
❌ user = userRepository.findByName(…)
✅ user.setTIN(…)
int count;Не лучший вариант, переменная доступна теперь другим потокам. Concurrency problems!
public void m() {
list.forEach(v -> count++);
}
AtomicInteger count = new AtomicInteger(0);Для ссылок:
list.forEach(v -> count.incrementAndGet())
AtomicReference<User> user = new AtomicReference<>();3️⃣ Использовать массив с одним элементом
…map(i -> user.set(…))
int[] res = new int[] {0};Популярный вариант, который подходит и для примитивов, и для ссылок. Но мне больше нравится вариант с Atomic:) Читать полностью…
list.forEach(v -> res[0]++);
Телеграм бот-игра на JAVA в 100 строк
Пишем телеграм бота, реализующего простую игру в стиле "камень-ножницы-бумага" на чистой джава + библиотека telegram api. Для пущей сложности я делаю это без БД и при этом пытаюсь выдернуть информацию о том, в каком чате происходит дело (может пригодиться для хранения какой-либо статистики)
Код из видео
Использованная библиотека
источник
👉👆
Привет! На связи Podlodka Crew — организатор IT-конференций, родившихся из известного подкаста!
Что важно уметь для построения микросервисной архитектуры? Профайлить, держать код в порядке, придерживаться принципов DDD и SOLID, создавать грамотный API и не использовать антипаттернов.
Это и многое другое разберём во втором сезоне Podlodka Java Crew, который стартует 20 марта.
Вместе с экспертами из Yandex Cloud, Tinkoff, Точка, Альфа-банк, СберМаркет, Qiwi, Huawei и других компаний:
*️⃣ Узнаем, возможно ли построить чистую архитектуру и добиться порядка в коде, не построив распределённый монолит вместо микросервисной архитектуры;
*️⃣ Поучаствуем в круглом столе по монолитам, микросервисам, гибридной архитектуре;
*️⃣ Научимся проектировать микросервисную архитектуру, разберёмся, что такое eventual consistency и как сделать грамотный API;
*️⃣ Обсудим 10 популярных антипаттернов и узнаем, как их исправить.
Это не все темы: расписание уже на сайте: https://podlodka.io/javacrew! Поспеши забрать свой билет 😉
Типы кэшей
Если спросить разработчика, что такое кэш, он скорее всего ответит:
— Кэш — хранилище типа ключ-значение. Позволяет снизить количество запросов к БД, другому сервису или не выполнять повторно сложные вычисления
Это, безусловно, правда, но не вся. В этом посте кратко опишу, что ещё умеют делать кэши и какие они бывают.
1️⃣ Кэш внутри сервиса
Хранится только в оперативной памяти. При выключении сервиса кэш пропадает. При включении — заполняется. Популярны два варианта:
🔸 ConcurrentHashMap: полностью ручное управление. Разработчик пишет код по наполнению кэша, обновлению и удалению значений
🔸 Google Guava Cache: более продвинутый вариант. Очищает кэш, уведомляет об удалении, предоставляет статистику
2️⃣ Удалённый кэш
Не связан с конкретным сервисом и запущен в отдельном процессе
✅ Доступен для нескольких сервисов
✅ Хранит данные на нескольких уровнях — в оперативной памяти и на диске
3️⃣ Распределённый кэш
Данные хранятся в нескольких процессах. Один экземпляр обычно называют нодой
✅ Шардирование. Распределяем данные по разным нодам и в итоге храним больше данных
✅ Репликация. Дублируем данные на разные ноды и повышаем доступность
Уровни 2-3 это скорее ступени эволюции кэшей. Большинство реализаций находятся на уровне 4:
4️⃣ In-memory data grid (IMDG)
Распределённый кэш с дополнительными фичами. Например:
▫️ Атомарный апдейт (вместо чтения и перезаписи)
▫️ Подписка на изменения в кэше
▫️ Поддержка транзакций
▫️ SQL-like запросы
▫️ Средства синхронизации (распределённый lock, очередь)
▫️ Продвинутый мониторинг
▫️ Выполнение скриптов
У многих кэшей есть платная и бесплатная версии. Многие фичи из списка выше доступны только платно.
В вакансиях чаще всего встречается Redis, чуть отстаёт Hazelcast. Также видела в проектах Memcached, Ehcache, Aerospike, Ignite/GridGain, Coherence. В их описании нет слова "кэш", как минимум distributed real-time in-memory streaming data platform🙂
Рекомендую погулять по документации того же Redis или Hazelcast, может для вашего проекта найдётся что-то полезное.
Собеседование Java Spring - Разбор вопросов с собеседований на Java Developer
Собрали самые интересные вопросы с собеседований на Java-разработчика. В видео две части. В первой рассказываем про Java: Коллекции, Hash Code & Equals Contract, Functional interfaces, Stream API, Garbage collector, устройство памяти, heap, concurrency.
Во второй — про Spring: Spring Beans, Spring Data Repository, Аннотации, Programmatic TM, Spring MVC
источник
👉👆
С каждым годом востребованность Kafka растет, а работа с этим инструментом входит в топ-10 ключевых навыков IT-специалистов.
Только за последний месяц можно найти больше 3000 вакансий, где требуется знание Кафки.
Уверенно заявляем: каждому backend-специалисту рано или поздно придется столкнуться с Кафкой — поэтому команда Слёрм создала интенсив по Apache Kafka для разработчиков, специально под ваши задачи.
Курс Кафка для разработчиков идеально подойдёт вам, если:
▫️Вы уже владеете языками Java или Go;
▫️Понимаете goroutine, модульность;
▫️Имеете базовые знания ThreadPool.
28 онлайн-уроков с возможностью обучаться из любой точки мира, доступ на 2 года, AMA-сессии со спикерами и закрытый чат с куратором — уменьшите время на рабочие задачи с Кафкой, получив расширенные знания по работе с инструментом!
После курса вы:
▫️Начнете прекрасно разбираться и ориентироваться в терминологии;
▫️Напишете простейшие клиенты, поймёте внутреннюю архитектуру Кафки
▫️Сможете работать со сложными протоколами и наст...
15 Tips to Become a Java Expert!
https://dev.to/weder96/15-tips-to-become-a-java-expert-1acj
👉👆
Какими свойствами обладает порождаемое equals() отношение эквивалентности?
Рефлексивность: для любой ссылки на значение x, x.equals(x)
вернет true
;
Симметричность: для любых ссылок на значения x
и y
, x.equals(y)
должно вернуть true
, тогда и только тогда, когда y.equals(x)
возвращает true
.
Транзитивность: для любых ссылок на значения x
, y
и z
, если x.equals(y)
и y.equals(z)
возвращают true
, тогда и x.equals(z)
вернёт true
;
Непротиворечивость: для любых ссылок на значения х
и у
, если несколько раз вызвать х.equals(y)
, постоянно будет возвращаться значение true
либо постоянно будет возвращаться значение false
при условии, что никакая информация, используемая при сравнении объектов, не поменялась.
Для любой ненулевой ссылки на значение х
выражение х.equals(null)
должно возвращать false
.
👉👆
Не верьте ChatGPT и используйте KotUniL
В последние недели медиа и социальные сети захлеснул поток сообщений о диалогах с ChatGPT. Только на Хабре поиск по этому термину показывает сегодня полтора десятка статей.
Попробовал пообщаться с ChatGPT и я. Результат общения вынесен в заголовок.
Хотите узнать, почему ChatGPT верить нельзя и почему лучше использовать KotUniL - читайте дальше.
А если вы решили читать дальше, не воспринимайте заголовок буквально. Это все-таки ирония. К сожалению, я не предупредил об этом читателей в первом варианте этой статьи и получил в результате массу минусов.
Итак, как было дело.
Сначала я пообщался с ChatGPT (далее для простоты я буду иногда обозначать его ИИ) на английском, а потом на русском.
https://habr.com/ru/post/707548/
👉👆
Java Collections Cheat Sheet
https://javaconceptoftheday.com/java-collections-cheat-sheet/
👉👆
Где и как вы можете использовать приватный конструктор?
Приватный (помеченный ключевым словом private
, скрытый) конструктор может использоваться публичным статическим методом генерации объектов данного класса. Также доступ к нему разрешён вложенным классам и может использоваться для их нужд.
👉👆