Изучаем Java. По вопросам сотрудничества: @seniorvladislav
⚙️ List.subList()
В Java метод subList()
позволяет создать представление части списка. Это удобно для работы с подмножествами коллекций без необходимости копирования элементов.
⚙️ Math.round()
В Java метод Math.round()
округляет число до ближайшего целого значения. Это полезно для обработки чисел с плавающей запятой, если требуется округление до ближайшего целого.
⚙️ String.replace()
В Java метод String.replace()
заменяет все вхождения указанного символа или подстроки в строке на новое значение. Это удобно для модификации строк без необходимости создания сложных шаблонов.
⚙️ String.startsWith() и String.endsWith()
В Java методы String.startsWith()
и String.endsWith()
проверяют, начинается или заканчивается строка на указанную подстроку. Это удобно для работы с текстами и валидации.
⌛ Что будет выведено при выполнении кода?
Пояснение ⬇️
Метод divide вызывает исключение ArithmeticException, так как деление на ноль недопустимо. Исключение перехватывается в блоке catch, где его сообщение выводится. После этого выполняется блок finally, который всегда исполняется независимо от того, было исключение или нет.Читать полностью…
⚙️HashMap.getOrDefault()
В Java метод HashMap.getOrDefault()
возвращает значение для заданного ключа, если он существует, или значение по умолчанию, если ключ отсутствует. Это удобный способ избежать проверки на наличие ключа.
❓ Вопрос на собеседовании
Как работает CompletableFuture
в Java, чем он отличается от Future, и как использовать метод thenCombine()
для выполнения параллельных задач?
Ответ ⬇️
CompletableFuture — это расширение Future, позволяющее выполнять асинхронные задачи и комбинировать их без необходимости вручную управлять потоками. В отличие от Future, он предоставляет богатый API для обработки результатов, включая цепочку методов и возможность комбинирования нескольких задач. Метод thenCombine() используется для объединения результатов двух асинхронных задач, выполняемых параллельно, в одну итоговую операцию.
Пример использования ⚙️
import java.util.concurrent.CompletableFuture;Читать полностью…
public class Main {
public static void main(String[] args) {
// Первая асинхронная задача
CompletableFuture<Integer> task1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Эмуляция задержки
} catch (InterruptedException e) {
e.printStackTrace();
}
return 10;
});
// Вторая асинхронная задача
CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> 20);
// Комбинируем результаты двух задач
CompletableFuture<Integer> combined = task1.thenCombine(task2, Integer::sum);
// Получаем и выводим результат
combined.thenAccept(result -> System.out.println("Сумма: " + result));
// Ждем завершения всех задач (только для примера)
combined.join();
}
}
// Результат выполнения:
// Сумма: 30
⚙️ Stream.reduce()
В Java метод Stream.reduce()
выполняет свёртку элементов потока в одно значение, используя заданную ассоциативную функцию. Это мощный инструмент для операций, таких как суммирование, произведение или объединение.
➡️ Pebble — современный движок шаблонов для Java
Pebble — это гибкий и производительный движок шаблонов, который позволяет легко интегрировать динамический HTML в ваши приложения. Разработанный с акцентом на расширяемость и безопасность, Pebble поддерживает удобный синтаксис, похожий на Twig.•
Компактный синтаксис: интуитивно понятный синтаксис для построения шаблонов.•
Шаблоны высокого уровня: поддержка наследования и макросов.•
Безопасность: автоматическое экранирование HTML и поддержка WhiteList-фильтров.•
Расширяемость: добавление пользовательских функций и фильтров.
🔗 Ссылочка на доку
⚙️ Math.max()
В Java метод Math.max()
позволяет найти большее из двух чисел. Он работает с различными типами данных, такими как int
, double
, float
, и полезен в задачах сравнения.
⚙️ List.of()
В Java метод List.of()
позволяет быстро создать неизменяемый список. Это удобно для создания небольших коллекций с фиксированным набором элементов.
⚙️ Comparator.reverseOrder()
В Java метод Comparator.reverseOrder()
создаёт компаратор, который сортирует элементы в порядке убывания. Это удобно для работы с сортировкой коллекций, когда нужно изменить стандартный порядок.
#вопросы_с_собеседований
Как, используя LinkedHashMap, сделать кэш c «invalidation policy»?
Необходимо использовать LRU-алгоритм (Least Recently Used algorithm) и LinkedHashMap
с access-order. В этом случае при обращении к элементу он будет перемещаться в конец списка, а наименее используемые элементы будут постепенно группироваться в начале списка. Так же в стандартной реализации LinkedHashMap
есть метод removeEldestEntries()
, который возвращает true
, если текущий объект LinkedHashMap
должен удалить наименее используемый элемент из коллекции при использовании методов put()
и putAll()
.
Стоит заметить, что LinkedHashMap
не позволяет полностью реализовать LRU-алгоритм, поскольку при вставке уже имеющегося в коллекции элемента порядок итерации по элементам не меняется.
Систематизируете и углубите знания разработки на Java на курсе Яндекс Практикума.
За 6 месяцев научитесь тому, что отличает опытного разработчика от новичка:
— Напишете своё приложение‑блог с использованием наиболее популярного на сегодняшний день фреймворка Spring Boot, а также научитесь правильно писать тесты с кешированием контекстов;
— Используя реактивный стек на Spring Boot, напишете веб‑приложение, которое состоит из нескольких сервисов, использует данные из СУБД и Redis в качестве кеша, производит аутентификацию и авторизацию пользователей. Сервисы будут развёрнуты при помощи средств Docker;
— Создадите инфраструктуру банка для совершения трансакции с аудитом операций при помощи микросервисной архитектуры, которая поддерживается экосистемой Spring. Часть микросервисов будут сообщаться между собой через RESTful API, а часть — через стриминговую платформу Apache Kafka. Также будет задействован ELK‑стек для мониторинга и логирования.
И самое главное никаких давно снятых видео и длинных лекций. Вся теория и практика проходят в интерактивном учебнике, а также воркшопы с опытными разработчиками, которые разбирают сложные кейсы и отвечают на ваши вопросы. И всё это в удобном для вас темпе без жёстких дедлайнов.
Начать можно бесплатно!
⁉️ Хотите, чтобы ваши Java-приложения выдерживали любые нагрузки и были стабильны в любой ситуации?
Научитесь этому на бесплатном открытом уроке с использованием Resilience4j!
В мире высоких нагрузок и распределенных систем стабильность — это ключ к успеху.
🗓 На уроке 19 декабря в 20:00 мск мы разберем фреймворк Resilience4j и покажем, как повысить отказоустойчивость ваших приложений.
🦾 Уверенные навыки работы с Resilience4j сделают вас востребованным специалистом, который способен справляться с реальными вызовами. Добавьте этот мощный инструмент в свой профессиональный стек.
Спикер Сергей Петрелевич — опытный разработчик на Java и Kotlin.
🔗 Регистрируйтесь на вебинар: https://otus.pw/CB1B/
Все участники вебинара получат скидку на курс «Java Developer. Professional».Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
Что такое метод finalize()
в Java, как он работает и почему его использование не рекомендуется?
Ответ ⬇️
Метод finalize() вызывается перед тем, как объект удаляется сборщиком мусора (garbage collector). Он используется для освобождения ресурсов, таких как файловые дескрипторы или сетевые соединения. Однако его использование не рекомендуется из-за непредсказуемости вызова (точное время выполнения сборки мусора неизвестно) и потенциальных проблем с производительностью. Вместо этого рекомендуется использовать try-with-resources или явно закрывать ресурсы.
Пример использования ⚙️
class Resource {Читать полностью…
@Override
protected void finalize() throws Throwable {
System.out.println("Ресурс освобожден!");
}
}
public class Main {
public static void main(String[] args) {
new Resource(); // Создаем объект без сохранения ссылки
System.gc(); // Явный вызов сборщика мусора (не гарантирует немедленного выполнения)
System.out.println("Завершение программы");
}
}
⚙️ String.contains()
В Java метод String.contains()
проверяет, содержится ли указанная подстрока в строке. Это удобный способ проверки наличия текста в строке.
#вопросы_с_собеседований
Расскажите про приведение типов. Что такое понижение и повышение типа?
Приведение типов — это преобразование переменной одного типа в другой.
Существует два вида приведения типов:
— Повышение типа (widening): автоматическое преобразование типа в другой, более широкий тип. Например, int в long. При этом не теряется точность, так как широкий тип может представить все значения узкого типа.
— Понижение типа (narrowing): явное приведение к более узкому типу, например double в int. Здесь возможна потеря точности, поэтому требуется явное приведение в коде.
Повышение типа безопасно, компилятор делает его автоматически.
Понижение опасно потерей данных, поэтому разработчик должен явно указать такое приведение в коде, чтобы показать, что он контролирует возможную потерю точности.
👩💻 Задача по Java: Проверка строки на наличие всех букв алфавита
Напишите функцию, которая проверяет, содержит ли строка все буквы английского алфавита (a-z). Игнорируйте регистр букв и символы, не являющиеся буквами.
Пример:
System.out.println(isPangram("The quick brown fox jumps over the lazy dog"));
// Ожидаемый результат: true
System.out.println(isPangram("Hello, World!"));
// Ожидаемый результат: false
Semaphore
Semaphore — это класс, который позволяет ограничивать количество потоков, одновременно работающих с каким-либо ресурсом.
Поток должен получить разрешение, чтобы войти в критическую секцию.Semaphore
управляет набором разрешений (permits), а конструктор принимает количество разрешений.
Если разрешений нет, поток ставится в очередь до освобождения.
Метод acquire()
получает разрешение, release()
— освобождает.
⌛ Что будет выведено при выполнении кода?
Пояснение ⬇️
Переменные sb1 и sb2 ссылаются на один и тот же объект StringBuilder. При вызове метода append изменения вносятся непосредственно в этот объект.Читать полностью…
• sb1.append(" World") добавляет " World" к строке, делая её "Hello World".
• Затем sb2.append("!") добавляет "!" к той же строке, получая "Hello World!".
Так как объект изменяется напрямую, при выводе обе переменные показывают результат "Hello World!".
⚙️ Objects.requireNonNull()
В Java метод Objects.requireNonNull()
проверяет, что объект не равен null
, и выбрасывает NullPointerException
, если проверка не пройдена. Это удобный способ защитить код от неожиданных null
.
👩💻 Задача по Java: Проверка баланса скобок в строке
Напишите функцию, которая проверяет, сбалансированы ли круглые, фигурные и квадратные скобки в заданной строке. Сбалансированность означает, что каждая открывающая скобка имеет соответствующую закрывающую, и скобки вложены корректно.
Пример:
"{[()()]}"
true
"{[(])}"
false
5 декабря пройдет онлайн-митап для java-разработчиков от Naumen. Спикеры поделятся опытом в промышленной java-разработке, реальными кейсами и полезными рекомендациями.
В программе три доклада:
🔸 Как приручить JSON — Максим Осипов, руководитель группы разработки Naumen SMP
🔸 Прагматика микросервисов: строим большую систему с помощью пачки монолитов — Дмитрий Черкасов, DevRel Jmix
🔸 Бэкэнд изображений в ОК — Руслан Измайлов, ведущий java-разработчик в ОК, VK
Старт митапа 5 декабря в 16:00 мск | 18:00 екб.
Участие как всегда бесплатное, нужна только регистрация.
→ Зарегистрироваться на митап.
Реклама, АО «Нау-сервис», ИНН 6671116364
https://www.naumen.ru/
erid: 2Vtzqx9U7pj
⚙️ Arrays.binarySearch()
В Java метод Arrays.binarySearch()
выполняет бинарный поиск в отсортированном массиве, возвращая индекс найденного элемента. Если элемент не найден, возвращается отрицательное значение, указывающее потенциальную позицию вставки.
Закрытый клуб для айтишников
FAANG School, чьи выпускники работают в Яндексе, СБЕРЕ и других гигантах, запустили бесплатное сообщество для всех, кто изучает Java.
Общайся в ламповом чате с такими же людьми «в теме», получай фидбек у опытных разрабов и черпай практические рекомендации от экспертов школы.
В чате уже больше 10 000 человек, а новенькие, которые подключатся сейчас, получат доступ к большой библиотеке Java Junior с полезными материалами:
– Пошаговая RoadMap по Java
– Мануал по Docker. Основные команды и концепции
– Микросервисы. Вопросы с собеседований
– Шпаргалка по Kafka
– Инструкция по работе с Git
– Подробный гайд, как найти работу в IT без опыта
– Подборка платформ с вакансиями для java-разработчиков
Вступай сейчас. Открыли доступ всего на 24 часа!
⚡️ Приглашаем на открытый урок «Разрабатываем Kafka-appender для логгера».
🗓 05 декабря в 20:00 МСК
Интеграция логирования с системами обмена сообщениями, такими как Apache Kafka, становится все более востребованной в современных Java-приложениях. Однако найти готовый функционал для этой задачи не всегда просто, поэтому часто возникает необходимость разработки собственного Kafka-appender для логгера.
На вебинаре разберем:
✔️ Зачем нужен Kafka-appender для логгера.
✔️ Подходы к разработке собственного Kafka-appender.
✔️ Шаги по созданию Kafka-appender для логгера.
✔️Практические рекомендации
Вебинар пройдет в рамках курса «Java Developer. Professional», все посетители получат welcome-скидку на обучение.
🔗 Ссылка на регистрацию: https://otus.pw/bWyu/Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
Зачем нужен HashMap, если есть Hashtable?
☕️ Методы класса Hashtable
синхронизированы, что приводит к снижению производительности, а HashMap
- нет;
☕️ HashTable
не может содержать элементы null
, тогда как HashMap
может содержать один ключ null
и любое количество значений null
;
☕️ Iterator у HashMap
, в отличие от Enumeration у HashTable
, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных).Hashtable
это устаревший класс и его использование не рекомендовано.
Какова оценка временной сложности операций над элементами из HashMap? Гарантирует ли HashMap указанную сложность выборки элемента?
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
Данная сложность не гарантируется, т.к. если хэш-функция распределяет элементы по корзинам равномерно, временная сложность станет не хуже Логарифмического времени O(log(N)), а в случае, когда хэш-функция постоянно возвращает одно и то же значение, HashMap превратится в связный список со сложностью О(n).
Пример кода двоичного поиска приведен выше.