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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про HashSet: Опасность мутабельных объектов 🧩

Когда мы положили p в сет, он попал в "корзину" (bucket), соответствующую hashCode = 1. После изменения p.x = 2, hashCode объекта тоже стал равен 2. Когда мы вызываем contains(p), сет ищет объект в корзине №2, но наш объект всё еще лежит в корзине №1! Сет его не найдет.

Вывод:
contains вернет false, но размер сета по-прежнему 1. Объект "застрял" в неправильной корзине.

⚡️ Не перепутайте:
Никогда не используйте изменяемые (mutable) поля в hashCode и equals, если объекты будут храниться в сетах или мапах.

#java #collections #hashset #hashcode #bug #интервью #java_interview_tasks
👍6🔥2👏1
Может ли отрицательное число при смене знака остаться отрицательным?
Что выведет код?
Anonymous Quiz
41%
true, false
50%
true, true
2%
false, false
7%
false, true
🔥4👍1👏1
Может ли отрицательное число при смене знака остаться отрицательным?
Что выведет код?
int x = Integer.MIN_VALUE;
System.out.println(x < 0);
System.out.println(-x < 0);
👍5🔥2❤1
🔍 Ответ на задачу про Integer.MIN_VALUE: Математические странности 🧮
Диапазон int в Java — от -2,147,483,648 до 2,147,483,647. Заметьте, что отрицательных чисел на одно больше. При попытке вычислить -Integer.MIN_VALUE происходит переполнение, и число превращается... снова в Integer.MIN_VALUE!

Вывод:
Оба условия выведут true. Отрицание минимального значения int дает то же самое отрицательное число.

⚡️ Не перепутайте:
Всегда помните об асимметрии диапазона целых чисел в Java. Это частый источник багов при использовании Math.abs().

#java #int #overflow #math #basics #интервью #java_interview_tasks
❤7🔥2💯1👀1
Чем `IdentityHashMap` отличается от обычной `HashMap`?
Сколько элементов будет в мапе?
Anonymous Quiz
27%
1
67%
2
2%
Ошибка компиляции.
3%
NullPointerException.
🔥3👍1👏1
Чем IdentityHashMap отличается от обычной HashMap?
Сколько элементов будет в мапе?
Map<String, String> map = new IdentityHashMap<>();
String s1 = "Java";
String s2 = new String("Java");
map.put(s1, "first");
map.put(s2, "second");
System.out.println(map.size());
🔥4
🔍 Ответ на задачу про IdentityHashMap: Когда ссылки важнее значений 🔗

- HashMap использует equals() и hashCode() для сравнения ключей. Для "Java" и new String("Java") equals вернет true, поэтому в HashMap была бы 1 запись.

- IdentityHashMap использует оператор ==. Так как s1 и s2 — это разные объекты в памяти, мапа считает их разными ключами.

Вывод:
Размер мапы будет 2.

⚡️ Не перепутайте:
IdentityHashMap — редкий зверь. Она полезна, например, при сериализации графа объектов, чтобы не зациклиться, если два узла имеют одинаковое содержимое, но являются разными объектами.

#java #collections #hashmap #identityhashmap #internals #интервью #java_interview_tasks
🔥6👏2👍1
🔥3👍1
Почему частый вызов MyEnum.values() в цикле — это плохая идея?
Что происходит "под капотом" при каждом вызове Color.values()?
enum Color { RED, GREEN, BLUE }
🔥5👍1
🔍 Ответ на задачу про Enum.values(): Скрытые аллокации 📦
Спецификация Java требует, чтобы массив, возвращаемый values(), был изменяемым (вы можете заменить в нем элементы, хотя это и плохая практика). Чтобы пользователи не могли испортить внутреннее состояние перечисления, компилятор генерирует код, который создает копию массива при каждом вызове values().

Вывод:
Каждый вызов values() — это новая аллокация памяти. В высокопроизводительном коде лучше кешировать этот массив: private static final Color[] VALUES = Color.values().

⚡️ Не перепутайте:
Если вам нужно просто получить количество элементов, используйте кешированное значение или Java 21 Enum.entries.

#java #enum #performance #jvm #memory #интервью #java_interview_tasks
👍7🔥1
Можно ли удалять элементы из списка во время обхода?
Какой код НЕ выбросит `ConcurrentModificationException`?
Anonymous Quiz
8%
Только A
68%
Только B
7%
Оба варианта верны.
18%
Оба выбросят исключение.
🔥3👍1
Можно ли удалять элементы из списка во время обхода?
Какой код НЕ выбросит ConcurrentModificationException?
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
// Вариант A
for (String s : list) {
if (s.equals("A")) list.remove(s);
}
// Вариант B
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("A")) it.remove();
}
👍3🔥1
🔍 Ответ на задачу про Iterator.remove(): Чистим коллекцию правильно 🧹
- Вариант A (for-each) использует итератор неявно. Если мы вызываем list.remove() напрямую, итератор об этом не знает и при следующей проверке modCount выбросит ConcurrentModificationException.
- Вариант B использует iterator.remove(). Этот метод специально спроектирован для безопасного удаления текущего элемента во время итерации.

Вывод:
Верный вариант — B. (Хотя есть исключение: в ArrayList удаление предпоследнего элемента через list.remove() в for-each может не вызвать ошибку из-за бага/особенности проверки hasNext(), но полагаться на это нельзя).

⚡️ Не перепутайте:
В Java 8+ самый простой и безопасный способ: list.removeIf(s -> s.equals("A")).

#java #collections #iterator #bug #clean_code #интервью #java_interview_tasks
👏5❤1🍌1
Как заставить мапу помнить, к каким элементам обращались чаще всего?
Что выведет этот код?
Anonymous Quiz
46%
[1, 2, 3]
18%
[1, 3, 2]
27%
[2, 1, 3]
9%
[3, 2, 1]
🔥3❤1👏1
Как заставить мапу помнить, к каким элементам обращались чаще всего?
Что выведет этот код?
Map<Integer, String> map = new LinkedHashMap<>(16, 0.75f, true);
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
map.get(2); // Обращаемся к элементу 2
System.out.println(map.keySet());
🤔8❤1🔥1
🔍 Ответ на задачу про LinkedHashMap: Порядок имеет значение 🔄
У LinkedHashMap есть специальный конструктор, где третий аргумент accessOrder включает режим "порядка доступа". Если он равен true, то при каждом get() или put() элемент перемещается в конец списка. Это идеальная основа для реализации LRU-кеша (Least Recently Used).

Вывод:
Так как мы обратились к ключу 2, он переместился в конец. Порядок станет: 1, 3, 2.

⚡️ Не перепутайте:
По умолчанию LinkedHashMap сохраняет порядок вставки (accessOrder = false).

#java #collections #linkedhashmap #lru #cache #интервью #java_interview_tasks
🔥8👍2👏1
Что будет, если вызвать приватный метод из родительского класса?
Что напечатает `new Child().test()`?
Anonymous Quiz
26%
Parent
30%
Child
42%
Ошибка компиляции.
3%
RuntimeException.
👍4
Что будет, если вызвать приватный метод из родительского класса?
Что напечатает new Child().test()?
class Parent {
public void test() { print(); }
private void print() { System.out.print("Parent"); }
}
class Child extends Parent {
public void print() { System.out.print("Child"); }
}
👍4
🔍 Ответ на задачу про Наследование: Приватные методы не переопределяются 🛡
Приватные методы в Java не участвуют в полиморфизме. Они принадлежат только тому классу, в котором объявлены, и не могут быть переопределены (override). Когда метод test() вызывается у объекта Child, он ищется в Parent. Внутри test() вызывается print(), который в Parent помечен как private. Java связывает этот вызов статически именно с методом в Parent.

Вывод:
Напечатается "Parent". Метод print() в Child — это просто новый метод, который никак не связан с приватным методом родителя.

⚡️ Не перепутайте:
Если вы хотите, чтобы метод переопределялся, он должен быть как минимум protected.

#java #oop #inheritance #polymorphism #basics #интервью #java_interview_tasks
❤5👍3
Почему статические методы ведут себя не так, как обычные?
Что выведет код?
Anonymous Quiz
66%
A
14%
B
16%
Ошибка компиляции.
5%
ClassCastException.
👍3