Java Interview Tasks
4.64K subscribers
205 photos
1 video
1 file
134 links
Реальные вопросы и задачи с собеседований.
Оригинальный авторский контент.
Актуальный материал.
Уровень вопросов от junior до supersenior.

Автор канала - @alexzelentsov

По рекламе: @alexzelentsov и https://telega.in/c/java_interview_tasks
Download Telegram
🔍 Ответ на задачу про исключение в стримах Java! 🚨

При выполнении данного кода возникнет исключение NullPointerException.
Давайте разберём, почему это происходит. 🤔

Код:
 
public static class Fee {
private String description;

public Fee(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}

public static void main(String[] args) {
List<Fee> fees = List.of(new Fee(null));
String s = fees.stream()
.map(Fee::getDescription)
.findFirst()
.orElse("1");
System.out.println(s);
}


Проблема возникает в строчке findFirst(). Метод .map(Fee::getDescription) создаёт стрим, где первый элемент имеет значение null из-за description равного null в объекте Fee.

Когда findFirst() пытается вернуть найденное значение — а это null — метод Optional.of() выбрасывает NullPointerException, поскольку Optional.of() не позволяет обёртывать null значениями. Для обработки null значений нужно использовать Optional.ofNullable().

Чтобы исправить это и избежать исключения, можно немного изменить этот код:

String s = fees.stream()
.map(Fee::getDescription)
.filter(Objects::nonNull) // добавляем этот фильтр
.findFirst()
.orElse("1");
Этот код сначала фильтрует все null значения из стрима и предотвращает NullPointerException.

Если вам понравился разбор, не забудьте поставить лайк, подписаться и оставить комментарий! 😊

#streamAPI #nullHandling #java_interview_tasks
🔥22👍112🤝1
🔍 Ответ на задачу про MegaClass 📊

Давайте разберём, что именно будет напечатано при выполнении данного кода. Здесь мы имеем класс MegaClass с переопределёнными методами equals() и hashCode(), и работаем с объектами этого класса в HashSet. Обратите внимание на влияние изменения состояния объекта на результат работы методов, связанных с коллекциями.

Пояснения:

A: set.add(o) - Возвращает true, потому что объект o только что добавлен в set.

B: set.contains(new MegaClass(10)) - Возвращает false, так как после изменения поля i, o имеет hashCode = 1000, который не совпадает с 1000 у new MegaClass(10).

C: set.add(new MegaClass(10)) - Возвращает true, объект с hashCode равным 10 не найден в set, потому что изменили o.

D: set.contains(new MegaClass(1000)) - Возвращает false, так как теперь oбъект, у которого hashcode 1000, содержится в set, но предыдущий объект был добавлен с хешкодом 10 и поэтому он не найдется теперь.

E: new MegaClass(10).equals(new MegaClass(1000)) - Возвращает false, так как поля i отличаются.

📈 Этот пример отлично демонстрирует, насколько важно соблюдать неизменяемость полей, участвующих в вычислении hashCode() и equals(), при работе с коллекциями.

Если вам понравился анализ этого кода и вы хотите узнавать больше, ставьте лайк, подписывайтесь на канал и делитесь своими мыслями в комментариях! 👍💬

#java #hashcode #equals #collections #java_interview_tasks
👍9🔥96
🔍 Ответ на задачу про работу String.valueOf() с null! 💡

String s1 = String.valueOf((Object) null);
String s2 = String.valueOf(null);
System.out.println(Objects.equals(s1, s2));


Вызов String.valueOf((Object) null) в первой строке приводит к тому, что Java воспринимает null как объект, и возвращает строку "null".

Во второй строке, String.valueOf(null) вызывает перегруженный метод, который принимает char[]. Но поскольку передан null, вызов упадет с NPE. 🚀

Выводы: всегда смотрите реализацию метода, который вызывается.
Может быть несколько перегруженных методов, реализация которых очень сильно отличается.

Спасибо, что дочитали до сюда) Не забудьте поставить лайк, оставить комментарий и подписаться! 🙌

#Java #NullPointerException #String #java_interview_tasks
👍305🔥3
🔍 Ответ на задачу про сравнение лонгов:🌟


В методе main, вызывается checkEvent с новым объектом Event, где id инициализирован null. Поэтому, при сравнении (event.id == 42) произойдет неявный вызов метода java.lang.Long.longValue(), что вызовет NullPointerException и программа завершится с ошибкой.

Программа выведет исключение:

Exception in thread "main" java.lang.NullPointerException
👨‍💻 Советы: всегда проверяйте null-ссылки перед использованием объектов во избежание необработанных исключений!

Интересная задача? Поддержите лайком и оставьте комментарий! 😊👇

#java #exceptionHandling #java_interview_tasks
🔥9👍7🙏1
🔍 Ответ на задачу про Immutable объекты в Java 🔒

✍️ В Java объект типа String является неизменяемым (immutable). Операция s1.concat(" World") создает новый объект строки и присваивает его s1. Переменная s2 остается ссылаться на старую строку "Hello". Поэтому программа выведет: Hello

Если задача понравилась, ставьте лайк 👍, подписывайтесь на канал и пишите свои ответы и вопросы в комментариях! Обсудим вместе 😊

#java #string #immutable #interview #java_tasks #java_interview_tasks
👍193🔥2😢1
🔍 Ответ на задачу про работу с HashMap и null 🗺

✍️ HashMap в Java разрешает использовать ключ null.
Правильный ответ: 5

Если задача была полезна, ставь лайк 👍, подписывайся и пиши свое решение или вопросы в комментариях! 💬

#java #hashmap #null #map #java_tasks #java_interview_tasks
👍10🔥93
🔍 Ответ на задачу про вычисление среднего двух чисел в Java:

👉 Рассмотрим код:

static double average(int x, int y) {
return (x + y) / 2;
}

public static void main(String[] args) {
System.out.println(average(0,1));
}
Что напечатает программа? 🤔


Метод average принимает два int, возвращает double.
(x + y) / 2 — деление целых чисел, результат тоже будет целым (int). Только в конце оно автоконвертируется в double.
Для average(0, 1):

(0 + 1) / 2 = 1 / 2 = 0 (целое деление!)
💡 Вернётся 0.0 (так как double)

✏️ Если хотите получить десятичное число, нужно хотя бы одно число привести к double:

return (x + y) / 2.0;
Тогда результат будет 0.5!

❗️ Не забывайте про особенности целочисленного деления в Java!

Если было полезно — ставьте лайк❤️, подписывайтесь и пишите комментарии!

#java #javacode #программирование #интервью #java_interview_tasks
10🔥8👍3
🔍 Ответ на задачу про преобразование List в Map в Java

Давайте разберём, что произойдёт в этом коде:

List<String> list = Arrays.asList("one", "two", "three", "four");
Map<Integer, String> size2Str = list.stream()
.collect(Collectors.toMap(String::length, Function.identity()));
System.out.println(size2Str.size());

🔸 Мы превращаем список строк в Map, где ключ — длина строки, а значение — сама строка.

📌 Важно: toMap по умолчанию выбрасывает исключение, если встречает дубликаты ключей (а у нас ключи — длины строк).

При первом попадании строки длины 3 ("one") всё ок. Но когда попадётся "two" — возникнет конфликт ключей!

❗️ Результат: Код выбросит исключение типа IllegalStateException: Duplicate key
То есть ничего не напечатает, а программа упадёт с ошибкой.

Если хотите избежать ошибки — добавьте в toMap третий аргумент (как решать конфликт):

.collect(Collectors.toMap(String::length, Function.identity(), (s1, s2) -> s1))
// Этот вариант оставит первое значение.


🔔 Было полезно? Ставь лайк, подписывайся и пиши свои вопросы или комменты!
#java #stream #map #interview #toMap #java_interview_tasks
👍214🔥41
🔍 Ответ на задачу про рекурсию, 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
👍8🔥71
🔍 Друзья, разберёмся, какой интерфейс в Java используется для сортировки объектов! (Ответ на вопрос про интерфейсы для сравнения)

Правильный ответ: 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
👍10🔥5🤗21
🔍 Ответ на задачу про среднее двух чисел 💡

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
🔥822