🔍 Ответ на задачу про рекурсию, try-catch и counter:
Что там происходит?
Каждый раз в try печатается "do" и выбрасывается исключение. Затем в catch, если counter <= 3 (а это true до значения 3 включительно), снова вызывается doWithCounter, увеличивая counter при этом!
⚠️ Но! Используется counter++, а не ++counter. Это значит, что в рекурсивный вызов идёт старое значение (а counter увеличится уже после передачи в функцию).
То есть вы всегда передаёте "0" в рекурсию, и создаётся бесконечная рекурсия.
❗️Первый вызов поймает исключение, зайдёт в catch и вызовет doWithCounter(0). Этот вызов опять напечатает "do" и опять вызовет doWithCounter(0), и так далее, пока не случится StackOverflowError. "do" будет выводиться до переполнения стека.
📢 Правильный ответ: "do" напечатается более 4-х раз.
👉 Было интересно? Ставь лайк, подписывайся и пиши вопросы в комментарии!
#java #recursion #exception #interview #стек #java_interview_tasks
Что там происходит?
Каждый раз в try печатается "do" и выбрасывается исключение. Затем в catch, если counter <= 3 (а это true до значения 3 включительно), снова вызывается doWithCounter, увеличивая counter при этом!
⚠️ Но! Используется counter++, а не ++counter. Это значит, что в рекурсивный вызов идёт старое значение (а counter увеличится уже после передачи в функцию).
То есть вы всегда передаёте "0" в рекурсию, и создаётся бесконечная рекурсия.
❗️Первый вызов поймает исключение, зайдёт в catch и вызовет doWithCounter(0). Этот вызов опять напечатает "do" и опять вызовет doWithCounter(0), и так далее, пока не случится StackOverflowError. "do" будет выводиться до переполнения стека.
📢 Правильный ответ: "do" напечатается более 4-х раз.
👉 Было интересно? Ставь лайк, подписывайся и пиши вопросы в комментарии!
#java #recursion #exception #interview #стек #java_interview_tasks
Telegram
Java Interview Tasks
Сколько раз напечатается "do"?
👍8🔥7❤3
🔍 Друзья, разберёмся, какой интерфейс в Java используется для сортировки объектов! (Ответ на вопрос про интерфейсы для сравнения)
Правильный ответ: Comparator и Comparable.
Но из списка в впоросе верный вариант — Comparator!
Интерфейс Comparator используется для задания порядка сортировки объектов, когда нельзя или не хочется изменять сам класс объекта.
Для справки:
CompareTo, Sort и Sortable — таких интерфейсов в стандартной библиотеке Java нет.
👀 Пример применения Comparator:
Если было полезно — ставьте лайк, подписывайтесь на канал и пишите в комментариях, что бы ещё разобрать! 😉
#java_interview_tasks #java #интервью #собеседование #сортировка #Comparator #Comparable
Правильный ответ: Comparator и Comparable.
Но из списка в впоросе верный вариант — Comparator!
Интерфейс Comparator используется для задания порядка сортировки объектов, когда нельзя или не хочется изменять сам класс объекта.
Для справки:
CompareTo, Sort и Sortable — таких интерфейсов в стандартной библиотеке Java нет.
👀 Пример применения Comparator:
List<String> list = Arrays.asList("Java", "Python", "C++");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
System.out.println(list); // [Java, C++, Python]Если было полезно — ставьте лайк, подписывайтесь на канал и пишите в комментариях, что бы ещё разобрать! 😉
#java_interview_tasks #java #интервью #собеседование #сортировка #Comparator #Comparable
Telegram
Java Interview Tasks
Какой интерфейс в Java используется для сортировки?
CompareTo / Comparator / Sort / Sortable
CompareTo / Comparator / Sort / Sortable
👍10🔥5🤗2❤1
🔍 Ответ на задачу про среднее двух чисел 💡
2_000_000_000 + 2_000_000_000 = 4_000_000_000
Но тут будет переполнение int 😱
Потому что тип int в Java ограничен максимумом в 2_147_483_647
4_000_000_000 выходит за пределы, результат сложения будет ОТРИЦАТЕЛЬНЫЙ (из-за переполнения)!
На деле (x + y) станет:
4000000000 - 2*2147483648 = -294967296
Дальше происходит деление -294967296 / 2 = -147483648
🔹 Ответ:
В консоль будет выведено: -147483648.0
❗️Тут ошибка в логике: надо было привести к long, либо double ДО сложения.
Понравилось объяснение? 👍
Ставьте лайк, подписывайтесь и пишите в комментариях, сталкивались ли вы с похожими проблемами!
#java #переполнение #арифметика #middlejava #интервью #java_interview_tasks
static double average(int x, int y) {
return (x + y) / 2;
}2_000_000_000 + 2_000_000_000 = 4_000_000_000
Но тут будет переполнение int 😱
Потому что тип int в Java ограничен максимумом в 2_147_483_647
4_000_000_000 выходит за пределы, результат сложения будет ОТРИЦАТЕЛЬНЫЙ (из-за переполнения)!
На деле (x + y) станет:
4000000000 - 2*2147483648 = -294967296
Дальше происходит деление -294967296 / 2 = -147483648
🔹 Ответ:
В консоль будет выведено: -147483648.0
❗️Тут ошибка в логике: надо было привести к long, либо double ДО сложения.
Понравилось объяснение? 👍
Ставьте лайк, подписывайтесь и пишите в комментариях, сталкивались ли вы с похожими проблемами!
#java #переполнение #арифметика #middlejava #интервью #java_interview_tasks
Telegram
Java Interview Tasks
Что напечатает код?
🔥10 6❤5
🔍 Ответ на задачу про методы isNumeric и isParsable из Apache Commons Lang 😎
В этом примере используются два метода для проверки, можно ли строку интерпретировать как число:
StringUtils.isNumeric(cs) — проверяет, состоит ли строка cs только из цифр (например, "12345" → true, "12a45" → false, "-123" → false, "12.34" → false).
NumberUtils.isParsable(cs) — проверяет, может ли строка быть разобрана в виде числа (учитываются знаки "-" и ".", десятичные числа: "12.34", "-12").
Поэтому:
Вывод:
Используйте isNumeric, если нужно проверить, что строка состоит только из цифр.
Используйте isParsable, если хотите узнать, можно ли строку преобразовать в число любого формата (целое, десятичное, экспоненциальное и т.д.).
👍 Если было полезно — поставь лайк, подпишись и напиши в комментариях, какие ещё методы сравнить!
#java #apachecommons #isnumeric #isparsable #java_interview_tasks
В этом примере используются два метода для проверки, можно ли строку интерпретировать как число:
StringUtils.isNumeric(cs) — проверяет, состоит ли строка cs только из цифр (например, "12345" → true, "12a45" → false, "-123" → false, "12.34" → false).
NumberUtils.isParsable(cs) — проверяет, может ли строка быть разобрана в виде числа (учитываются знаки "-" и ".", десятичные числа: "12.34", "-12").
Поэтому:
String cs = "123.45";
boolean numeric = StringUtils.isNumeric(cs); // false
System.out.println(numeric);
boolean parsable = NumberUtils.isParsable(cs); // true
System.out.println(parsable);
Вывод:
Используйте isNumeric, если нужно проверить, что строка состоит только из цифр.
Используйте isParsable, если хотите узнать, можно ли строку преобразовать в число любого формата (целое, десятичное, экспоненциальное и т.д.).
👍 Если было полезно — поставь лайк, подпишись и напиши в комментариях, какие ещё методы сравнить!
#java #apachecommons #isnumeric #isparsable #java_interview_tasks
👍14❤4 3
🔍 Ответ на задачу про LocalDate и DateTimeFormatter: Вечная путаница с YYYY и yyyy 😅
Очень часто даже опытные разработчики путают, как правильно форматировать и парсить даты в Java с помощью DateTimeFormatter.
Задача:
Есть дата 2024-01-01. Нужно вывести номер года в формате YYYY-MM-dd. В чём разница между использованием шаблона YYYY-MM-dd и yyyy-MM-dd для форматирования, и какой год они покажут, если дата — это, например, 2022-01-01?
Объяснение:
yyyy — календарный год (Calendar year), т.е. то, что мы обычно считаем годом.
YYYY — год недели (Week-based year) по стандарту ISO-8601:
Первый четверг года определяет первую неделю.
Иногда первые дни января могут относиться к заключительной неделе предыдущего года!
Поэтому:
Вывод:
date.format(fmtYear) даст ожидаемый результат 2022-01-01.
А вот date.format(fmtWeekYear) может дать 2021-01-01, потому что 1 января 2022 года относится к последней неделе 2021 года по ISO-8601!
⚡️ Не перепутайте:
Используйте yyyy, если нужен календарный год!
Используйте YYYY, если нужен "год недели" (например, если работа связана с бизнес-отчётами по неделям).
Понравился разбор? Ставь ❤️, подписывайся и спрашивай про другие подводные камни работы с датами!
#java #localdate #datetimeformatter #yyyy #YYYY #дата #интервью #java_interview_tasks
Очень часто даже опытные разработчики путают, как правильно форматировать и парсить даты в Java с помощью DateTimeFormatter.
Задача:
Есть дата 2024-01-01. Нужно вывести номер года в формате YYYY-MM-dd. В чём разница между использованием шаблона YYYY-MM-dd и yyyy-MM-dd для форматирования, и какой год они покажут, если дата — это, например, 2022-01-01?
Объяснение:
yyyy — календарный год (Calendar year), т.е. то, что мы обычно считаем годом.
YYYY — год недели (Week-based year) по стандарту ISO-8601:
Первый четверг года определяет первую неделю.
Иногда первые дни января могут относиться к заключительной неделе предыдущего года!
Поэтому:
LocalDate date = LocalDate.of(2022, 1, 1);
DateTimeFormatter fmtYear = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter fmtWeekYear = DateTimeFormatter.ofPattern("YYYY-MM-dd");
System.out.println(date.format(fmtYear)); // 2022-01-01
System.out.println(date.format(fmtWeekYear)); // 2021-01-01 !!!
Вывод:
date.format(fmtYear) даст ожидаемый результат 2022-01-01.
А вот date.format(fmtWeekYear) может дать 2021-01-01, потому что 1 января 2022 года относится к последней неделе 2021 года по ISO-8601!
⚡️ Не перепутайте:
Используйте yyyy, если нужен календарный год!
Используйте YYYY, если нужен "год недели" (например, если работа связана с бизнес-отчётами по неделям).
Понравился разбор? Ставь ❤️, подписывайся и спрашивай про другие подводные камни работы с датами!
#java #localdate #datetimeformatter #yyyy #YYYY #дата #интервью #java_interview_tasks
3👍16❤5 5🤔1
Forwarded from JavaNews (AlexZTgListener)
Cursor доступен в JetBrains IDE.
Cursor теперь доступен в IDE JetBrains: IntelliJ IDEA, PyCharm, WebStorm и другие теперь подключают его через Agent Client Protocol (ACP). А это значит, что работать с агентом можно прямо в JetBrains-IDE. Cursor ACP дает выбор модели под задачу: OpenAI, Anthropic, Google и модели Cursor. Под каждую модель у Cursor своя агентная обвязка, чтобы держать качество и скорость. Как включить: – установить Cursor ACP из ACP Registry – авторизоваться существующей учеткой Cursor. Плагин является бесплатным для пользователей на платных тарифах Cursor.
Статья: https://habr.com/ru/companies/spring_aio/articles/1006764/
#java
#JetBrains
#CURSOR
#RealJavaNews
Cursor теперь доступен в IDE JetBrains: IntelliJ IDEA, PyCharm, WebStorm и другие теперь подключают его через Agent Client Protocol (ACP). А это значит, что работать с агентом можно прямо в JetBrains-IDE. Cursor ACP дает выбор модели под задачу: OpenAI, Anthropic, Google и модели Cursor. Под каждую модель у Cursor своя агентная обвязка, чтобы держать качество и скорость. Как включить: – установить Cursor ACP из ACP Registry – авторизоваться существующей учеткой Cursor. Плагин является бесплатным для пользователей на платных тарифах Cursor.
Статья: https://habr.com/ru/companies/spring_aio/articles/1006764/
#java
#JetBrains
#CURSOR
#RealJavaNews
Хабр
Cursor теперь доступен в IDE JetBrains
Cursor теперь доступен в IntelliJ IDEA, PyCharm, WebStorm и других IDE JetBrains через протокол Agent Client Protocol (ACP). Разработчики, которые полагаются на IntelliJ IDEA и другие IDE JetBrains за...
👍3❤1
Записи докладов Spring I/O 2026 постепенно появляются на [YouTube](https://youtube.com/playlist?list=PLe6FX2SlkJdQZ3N0SW9Abo4cN7eO5dU-U&si=A4mfuEUr9MZAJtMk) — Spring Boot 4, новые интеграции, модульный дизайн, API и немного AI.
Это заставляет задуматься: как потреблять знания с конференций в 2026 году?
Раньше мы смотрели доклады ради трёх вещей:
1. Вдохновение — почти не изменилось. Чужой практический опыт по-прежнему мотивирует.
2. Расширение кругозора — теряет смысл. AI-ассистенты дают доступ к любым знаниям быстрее и в удобном формате, а поток информации давно превышает возможности восприятия.
3. Накопление знаний для работы — изменилось радикально. Раньше знания хранились в голове (и редко — в заметках с низкой доступностью). Сейчас решения принимаются с помощью AI, а персональные базы знаний стали по-настоящему оперативными.
Новый подход: вместо просмотра видео — взять описание, слайды, транскрипт и попросить AI сделать глубокое саммари с ресерчем. Оценить полезность, трансформировать в нужный формат и загрузить в персональную базу знаний.
Что думаете по этому поводу?
Изменились ли ваши подходы к потреблению информации?
Сохранится ли мотивация у докладчиков при таком подходе?
#java
#RealJavaNews
Это заставляет задуматься: как потреблять знания с конференций в 2026 году?
Раньше мы смотрели доклады ради трёх вещей:
1. Вдохновение — почти не изменилось. Чужой практический опыт по-прежнему мотивирует.
2. Расширение кругозора — теряет смысл. AI-ассистенты дают доступ к любым знаниям быстрее и в удобном формате, а поток информации давно превышает возможности восприятия.
3. Накопление знаний для работы — изменилось радикально. Раньше знания хранились в голове (и редко — в заметках с низкой доступностью). Сейчас решения принимаются с помощью AI, а персональные базы знаний стали по-настоящему оперативными.
Новый подход: вместо просмотра видео — взять описание, слайды, транскрипт и попросить AI сделать глубокое саммари с ресерчем. Оценить полезность, трансформировать в нужный формат и загрузить в персональную базу знаний.
Что думаете по этому поводу?
Изменились ли ваши подходы к потреблению информации?
Сохранится ли мотивация у докладчиков при таком подходе?
#java
#RealJavaNews
❤3
🔍 Ответ на задачу про Optional: Почему orElse может тормозить ваш код? 🐢
Использование Optional — это стандарт де-факто в современном Java-коде. Но знаете ли вы разницу между
Задача: Что произойдет, если вызвать
Объяснение:
Вывод: В примере выше на консоль выведется "Вызов тяжелого метода!", хотя значение "Hello" уже есть. Если бы мы использовали
⚡️ Не перепутайте:
Используйте
Используйте
Понравился разбор? Ставь ❤️, подписывайся и пиши в комментариях, какие ещё методы Optional тебя путают!
#java #optional #performance #clean_code #backend #интервью #java_interview_tasks
Использование Optional — это стандарт де-факто в современном Java-коде. Но знаете ли вы разницу между
orElse() и orElseGet()? Ошибка здесь может привести к лишним вызовам методов и даже к падению производительности.Задача: Что произойдет, если вызвать
orElse() для метода, который делает тяжелую операцию (например, запрос в БД), даже если значение в Optional уже есть?Объяснение:
orElse(T other) принимает готовый объект. Это значит, что аргумент вычисляется до вызова метода orElse. Даже если Optional не пустой, getDefaultValue() будет выполнен! orElseGet(Supplier<? extends T> other) принимает лямбду (Supplier). Она выполняется только тогда, когда Optional действительно пуст (ленивые вычисления).Вывод: В примере выше на консоль выведется "Вызов тяжелого метода!", хотя значение "Hello" уже есть. Если бы мы использовали
optional.orElseGet(() -> getDefaultValue()), лишнего вызова бы не было.⚡️ Не перепутайте:
Используйте
orElse(), если у вас уже есть готовая константа или примитив.Используйте
orElseGet(), если получение дефолтного значения требует вычислений или создания нового объекта.Понравился разбор? Ставь ❤️, подписывайся и пиши в комментариях, какие ещё методы Optional тебя путают!
#java #optional #performance #clean_code #backend #интервью #java_interview_tasks
❤11👍6🔥5👏1
🔍 Ответ на задачу про списки: В чём подвох Arrays.asList() и List.of()? 📝
Казалось бы, оба метода создают список из элементов. Но ведут они себя совершенно по-разному, что часто приводит к
Объяснение:
Вывод:
⚡️ Не перепутайте:
Нужен список, который меняется вместе с массивом? Используйте
Нужна гарантия неизменяемости и безопасности? Используйте
Было полезно? Жми ❤️ и подписывайся, чтобы не пропустить новые разборы!
#java #collections #list #arrays #immutable #backend #интервью #java_interview_tasks
Казалось бы, оба метода создают список из элементов. Но ведут они себя совершенно по-разному, что часто приводит к
UnsupportedOperationException или неожиданным изменениям данных.Объяснение:
Arrays.asList() — это "обертка" над массивом. Он возвращает список фиксированного размера. Если изменить элемент в массиве, он изменится и в списке! Добавлять/удалять элементы нельзя. List.of() (появился в Java 9) создает полностью неизменяемый (immutable) список. Он копирует данные из массива. Изменение массива на него не влияет. Добавлять/удалять элементы также нельзя. Кроме того, List.of() запрещает null.Вывод:
list1.get(0) выведет "C" (связь с массивом сохранена).list2.get(0) выведет "A" (данные скопированы).⚡️ Не перепутайте:
Нужен список, который меняется вместе с массивом? Используйте
Arrays.asList().Нужна гарантия неизменяемости и безопасности? Используйте
List.of().Было полезно? Жми ❤️ и подписывайся, чтобы не пропустить новые разборы!
#java #collections #list #arrays #immutable #backend #интервью #java_interview_tasks
❤10🔥3👍2
🔍 Ответ на задачу про Stream.peek(): Почему ничего не напечаталось? 🕵️♂️
Метод
Объяснение: Стримы в Java ленивы. Промежуточные операции (filter, map, peek) не выполняются до тех пор, пока не будет вызвана терминальная операция (collect, forEach, count и т.д.). В данном коде терминальной операции нет, поэтому конвейер даже не запустится.
Вывод: Код не выведет ничего. Чтобы
⚡️ Не перепутайте:
Всегда завершайте цепочку стрима терминальной операцией.
#java #streamapi #peek #lazy #backend #интервью #java_interview_tasks
Метод
peek() часто используют для логирования промежуточных этапов стрима. Но новички часто забывают про "ленивость" стримов.Объяснение: Стримы в Java ленивы. Промежуточные операции (filter, map, peek) не выполняются до тех пор, пока не будет вызвана терминальная операция (collect, forEach, count и т.д.). В данном коде терминальной операции нет, поэтому конвейер даже не запустится.
Вывод: Код не выведет ничего. Чтобы
peek сработал, нужно добавить, например, .collect(Collectors.toList()) в конце.⚡️ Не перепутайте:
peek() предназначен для отладки, не используйте его для изменения состояния объектов (side-effects).Всегда завершайте цепочку стрима терминальной операцией.
#java #streamapi #peek #lazy #backend #интервью #java_interview_tasks
🔥4❤3
🔍 Ответ на задачу про TreeMap: Любит ли она null-ключи? 🗺
Коллекции в Java по-разному относятся к null. Если HashMap его терпит, то что скажет TreeMap?
Объяснение:
Многие считают, что TreeMap категорически запрещает null-ключи. На самом деле, TreeMap — это просто дерево, которое полагается на механизм сравнения.
Проблема не в самой TreeMap, а в компараторе. Если вы используете дефолтный компаратор (Natural Ordering), он попытается вызвать
Однако, если при создании TreeMap передать ей кастомный компаратор, который умеет обрабатывать null (например,
Вывод:
TreeMap сама по себе НЕ запрещает null-ключи. Ошибка возникает только при использовании компаратора, не поддерживающего null (что происходит по умолчанию).
⚡️ Не перепутайте:
• HashMap: разрешает один null-ключ.
• Hashtable: запрещает null-ключи и значения на уровне методов
• TreeMap: позволяет использовать null-ключи, ЕСЛИ предоставлен соответствующий компаратор.
#java #collections #treemap #null #map #интервью #java_interview_tasks
Коллекции в Java по-разному относятся к null. Если HashMap его терпит, то что скажет TreeMap?
Объяснение:
Многие считают, что TreeMap категорически запрещает null-ключи. На самом деле, TreeMap — это просто дерево, которое полагается на механизм сравнения.
Проблема не в самой TreeMap, а в компараторе. Если вы используете дефолтный компаратор (Natural Ordering), он попытается вызвать
compareTo() у ключа. Вызов метода у null неизбежно приведет к NullPointerException.Однако, если при создании TreeMap передать ей кастомный компаратор, который умеет обрабатывать null (например,
Comparator.nullsFirst), то TreeMap будет прекрасно работать с null-ключами.Вывод:
TreeMap сама по себе НЕ запрещает null-ключи. Ошибка возникает только при использовании компаратора, не поддерживающего null (что происходит по умолчанию).
⚡️ Не перепутайте:
• HashMap: разрешает один null-ключ.
• Hashtable: запрещает null-ключи и значения на уровне методов
put/get.• TreeMap: позволяет использовать null-ключи, ЕСЛИ предоставлен соответствующий компаратор.
#java #collections #treemap #null #map #интервью #java_interview_tasks
🔥3❤1👍1👎1