🔥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 (например,
Однако метод
В данном примере:
-
- Метод
- В строке
Вывод:
Результат будет
⚡️ Не перепутайте:
- Методы
- Методы
#java #string #contains #regex #backslash #интервью #java_interview_tasks
Часто при переходе от регулярных выражений к обычным строковым методам в 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,
- Однако
Вывод:
Сравнение примитивов даст
⚡️ Не перепутайте:
Для проверки на
#java #double #nan #floatingpoint #интервью #java_interview_tasks
- Согласно стандарту 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: Опасность мутабельных объектов 🧩
Когда мы положили
Вывод:
⚡️ Не перепутайте:
Никогда не используйте изменяемые (mutable) поля в
#java #collections #hashset #hashcode #bug #интервью #java_interview_tasks
Когда мы положили
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: Математические странности 🧮
Диапазон
Вывод:
Оба условия выведут
⚡️ Не перепутайте:
Всегда помните об асимметрии диапазона целых чисел в Java. Это частый источник багов при использовании
#java #int #overflow #math #basics #интервью #java_interview_tasks
Диапазон
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: Когда ссылки важнее значений 🔗
-
-
Вывод:
Размер мапы будет 2.
⚡️ Не перепутайте:
#java #collections #hashmap #identityhashmap #internals #интервью #java_interview_tasks
-
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
Почему частый вызов `MyEnum.values()` в цикле — это плохая идея?
Что происходит "под капотом" при каждом вызове `Color.values()`?
Что происходит "под капотом" при каждом вызове `Color.values()`?
Anonymous Quiz
10%
Возвращается ссылка на внутренний статический массив.
77%
Каждый раз создается новый массив.
8%
Возвращается неизменяемый List.
5%
Массив создается только при первом вызове, потом кешируется.
🔥3👍1
Почему частый вызов
Что происходит "под капотом" при каждом вызове
MyEnum.values() в цикле — это плохая идея?Что происходит "под капотом" при каждом вызове
Color.values()?enum Color { RED, GREEN, BLUE }🔥5👍1
🔍 Ответ на задачу про Enum.values(): Скрытые аллокации 📦
Спецификация Java требует, чтобы массив, возвращаемый
Вывод:
Каждый вызов
⚡️ Не перепутайте:
Если вам нужно просто получить количество элементов, используйте кешированное значение или Java 21
#java #enum #performance #jvm #memory #интервью #java_interview_tasks
Спецификация 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`?
Какой код НЕ выбросит `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