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

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

По рекламе: @alexzelentsov
Download Telegram
При работе с финансами мы используем 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
🔍 Ответ на задачу про String.contains: Ловушка экранирования 🪤

Часто при переходе от регулярных выражений к обычным строковым методам в Java возникает путаница с экранированием.

Многие методы в Java (например, split, replaceAll) принимают регулярные выражения. В regex символ | (pipe) является специальным (логическое ИЛИ) и требует экранирования — \|.

Однако метод String.contains(CharSequence s) ищет буквальное совпадение подстроки.

В данном примере:
- MULTIPLE_VALUES_SPLITTER инициализируется строкой \| (обратный слеш и вертикальная черта).
- Метод contains честно ищет эти два символа подряд.
- В строке "apple|orange|banana" есть только символ |, но нет символа \.

Вывод:
Результат будет false. Для корректной проверки наличия разделителя в данном случае нужно использовать val.contains("|").

⚡️ Не перепутайте:
- Методы contains, indexOf, replace работают с литералами.
- Методы split, replaceAll, matches работают с регулярными выражениями.

#java #string #contains #regex #backslash #интервью #java_interview_tasks
👍8❤1🔥1
Что выведет этот код?
Anonymous Quiz
20%
true, true
35%
false, false
14%
true, false
32%
false, true
👍3🔥1👏1
Как сравнить два NaN (Not-a-Number) в Java?!
Что выведет этот код?
double x = Double.NaN;
double y = Double.NaN;
System.out.println(x == y);
System.out.println(Double.valueOf(x).equals(Double.valueOf(y)));
👍5🔥1👏1
🔍 Ответ на задачу про Double.NaN: 👻

- Согласно стандарту IEEE 754, NaN не равен самому себе. Поэтому x == y всегда false.
- Однако Double.equals() реализован так, что он считает два NaN равными. Это сделано для того, чтобы NaN можно было использовать в коллекциях (например, как ключ в HashMap).

Вывод:
Сравнение примитивов даст false, а объектов — true.

⚡️ Не перепутайте:
Для проверки на NaN у примитивов используйте Double.isNaN(x).

#java #double #nan #floatingpoint #интервью #java_interview_tasks
👍7🔥1
Что будет, если изменить объект, который уже лежит в `HashSet`?
Сколько элементов будет в сете в конце?
Anonymous Quiz
32%
true, 1
58%
false, 1
3%
false, 0
7%
true, 2
👍3🔥1
Что будет, если изменить объект, который уже лежит в HashSet?
Сколько элементов будет в сете в конце?
class Point {
int x;
Point(int x) { this.x = x; }
@Override public int hashCode() { return x; }
@Override public boolean equals(Object o) { return x == ((Point)o).x; }
}
HashSet<Point> set = new HashSet<>();
Point p = new Point(1);
set.add(p);
p.x = 2;
System.out.println(set.contains(p));
System.out.println(set.size());
👍4🔥1
🔍 Ответ на задачу про 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