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

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

По рекламе: @alexzelentsov
Download Telegram
Что произойдет, если внутри `computeIfAbsent` попытаться изменить эту же мапу?
Anonymous Quiz
10%
Мапа будет содержать {A=1, B=2, C=3}.
77%
ConcurrentModificationException.
7%
Зацикливание (Infinite Loop).
5%
Ошибка компиляции.
👍4🔥1👀1
Метод computeIfAbsent в Map очень удобен, но внутри лямбды скрыта ловушка.
Что произойдет, если внутри computeIfAbsent попытаться изменить эту же мапу?

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.computeIfAbsent("B", key -> {
map.put("C", 3);
return 2;
});
👍4❤2🔥1
🔍 Ответ на задачу про computeIfAbsent: Осторожно с модификациями! ⚠️

Документация HashMap (и большинства других реализаций) прямо запрещает модификацию структуры мапы (добавление/удаление) внутри методов вычисления (compute, merge, computeIfAbsent). Это может привести к повреждению внутренней структуры данных или выбросу ConcurrentModificationException.

Вывод:
В данном случае в HashMap будет выброшен ConcurrentModificationException.

⚡️ Не перепутайте:
Никогда не меняйте коллекцию внутри методов, которые итерируются по ней или вычисляют ее значения.

#java #collections #hashmap #bug #concurrency #интервью #java_interview_tasks
🔥5👍2👀1
👍3🔥1👀1
Когда у вас есть два метода с одинаковым именем, но разными типами аргументов, какой из них выберет Java для null?
Какой метод вызовется?
public class Test {
public static void print(Object o) { System.out.println("Object"); }
public static void print(String s) { System.out.println("String"); }
public static void main(String[] args) {
print(null);
}
}
❤3🔥2👀2😱1
🔍 Ответ на задачу про перегрузку методов: null и неоднозначность ⚖️

Java при перегрузке (overloading) всегда выбирает наиболее специфичный (most specific) тип. Так как String является наследником Object, он считается более специфичным. Компилятор отдаст предпочтение ему.

Вывод:
Напечатается "String". Если бы мы добавили еще метод print(Integer i), возникла бы ошибка компиляции, так как String и Integer не связаны иерархией, и Java не смогла бы выбрать.

⚡️ Не перепутайте:
Если нужно вызвать именно версию для Object, сделайте явное приведение: print((Object) null).

#java #overloading #basics #polymorphism #интервью #java_interview_tasks
❤4👍2👀2
Что произойдет, если при формировании Map попадутся два одинаковых ключа?
Anonymous Quiz
8%
В мапе останется первый элемент ("apple").
61%
В мапе останется последний элемент ("apricot").
28%
IllegalStateException.
3%
Ошибка компиляции.
👍3❤1👀1
Что произойдет, если при формировании Map попадутся два одинаковых ключа?
List<String> list = Arrays.asList("apple12", "banana", "apricot");
Map<Integer, String> map = list.stream()
.collect(Collectors.toMap(s -> s.length(), s -> s));
🔥5💩2👀1
🔍 Ответ на задачу про Collectors.toMap 💥

Дефолтная версия Collectors.toMap(keyMapper, valueMapper) предполагает, что ключи уникальны. Если встречается дубликат (и "apple12", и "apricot" имеют длину 7), метод выбрасывает IllegalStateException: Duplicate key.

Вывод:
Чтобы код не падал, нужно использовать перегруженную версию с "merge function":
.collect(Collectors.toMap(s -> s.length(), s -> s, (oldValue, newValue) -> oldValue)) — это скажет стриму оставить старое значение при конфликте.

⚡️ Не перепутайте:
Всегда думайте, возможны ли дубликаты в ваших данных перед использованием toMap().

#java #streamapi #collectors #map #exception #интервью #java_interview_tasks
👍9🤡3❤2
Что выведет этот код?
Anonymous Quiz
26%
java/is/fun, java/is/fun
58%
java/is/fun, ///////////
9%
java.is.fun, java/is/fun
7%
java/is/fun, java.is.fun
👍4🔥1👀1
В чём разница между replace() и replaceAll(), если оба принимают две строки?
Что выведет этот код?
String str = "java.is.fun";
System.out.println(str.replace(".", "/"));
System.out.println(str.replaceAll(".", "/"));
🔥4
🔍 Ответ на задачу про String: replace vs replaceAll 🧐

- replace(CharSequence target, CharSequence replacement) заменяет литеральные строки. Точка воспринимается просто как символ.
- replaceAll(String regex, String replacement) принимает регулярное выражение. В регулярках точка . означает "любой символ". Поэтому replaceAll заменит абсолютно все символы в строке на слэш.

Вывод:
Первая строка выведет java/is/fun, а вторая — ///////////.

⚡️ Не перепутайте:
Если вам не нужны регулярные выражения, всегда используйте replace(). Он быстрее и безопаснее.

#java #string #regex #basics #интервью #java_interview_tasks
👍10🔥6❤1
Что останется в списке после удаления?
Anonymous Quiz
21%
[2, 3]
69%
[1, 3]
3%
[1, 2]
8%
IndexOutOfBoundsException
❤1👍1🔥1
Что останется в списке после удаления?

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.remove(1);
System.out.println(list);
👏5🥱3🔥2❤1
🔍 Ответ на задачу про List.remove(): Индекс или Объект? 🔢

Удаление из списка List<Integer> — классическая ловушка из-за перегрузки метода remove().

У List есть два метода: remove(int index) и remove(Object o). Если в списке лежат Integer, то при вызове remove(1) Java выберет версию с примитивом int (по индексу), так как это точное совпадение. В итоге удалится элемент под индексом 1 (это число 2).

Вывод:
Список станет [1, 3]. Чтобы удалить именно число 1, нужно вызвать list.remove(Integer.valueOf(1)).

⚡️ Не перепутайте:
Будьте осторожны с коллекциями чисел! Всегда проверяйте, удаляете вы по индексу или по значению.

#java #collections #arraylist #list #интервью #java_interview_tasks
1👍8❤2🔥1
Что выведет код?
Anonymous Quiz
18%
true, true
17%
false, false
10%
true, false
56%
false, true
🔥2❤1👍1
При работе с финансами мы используем BigDecimal. Но как их правильно сравнивать?
Что выведет код?

BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
System.out.println(d1.equals(d2));
System.out.println(d1.compareTo(d2) == 0);
❤4👍1🔥1
🔍 Ответ на задачу про BigDecimal: equals vs compareTo ⚖️

- equals() у BigDecimal сравнивает не только значение, но и scale (точность/количество знаков после запятой). Так как у "1.0" scale=1, а у "1.00" scale=2, они не равны.
- compareTo() сравнивает только математические значения. 1.0 и 1.00 математически равны.

Вывод:
equals вернет false, а compareTo вернет true.

⚡️ Не перепутайте:
Для проверки равенства денежных сумм почти всегда нужно использовать compareTo() == 0.

#java #bigdecimal #math #finance #интервью #java_interview_tasks
👍6🔥3👏1
🔥3
Что выведет код?
String MULTIPLE_VALUES_SPLITTER = "\\|";
String val = "apple|orange|banana";
System.out.println(val.contains(MULTIPLE_VALUES_SPLITTER));
❤3👍2🔥1