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

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

По рекламе: @alexzelentsov и https://telega.in/c/java_interview_tasks
Download Telegram
Forwarded from Java Developer
👍10🔥3😁3
Forwarded from Java Developer
Ответ: "test"
Способ вычисления хэша map, set, list - это часть контракта соответствующих интерфейсов. Каждая реализация должна использовать формулу, указанную в контракте. Поэтому поведение будет общим для всех JDK.
Посмотрим теперь, какой же контракт и конкретные формулы для подсчета хеша у мапы.

"The hash code of a map is defined to be the sum of the hash codes of each entry in the map's entrySet() view."

Посмотрим, как вычисляется хешкод у Map.Entry:
"The hash code of a map entry e is defined to be:
(e.getKey()==null ? 0 : e.getKey().hashCode()) ^
(e.getValue()==null ? 0 : e.getValue().hashCode())"

Зная это, мы можем посчитать хешкод нашей мапы: он будет равен 0. Почему? Так как у единственной Map.Entry совпадают значения ключа и значения, то их хешкоды будут совпадать, а значит хешкод Map.Entry будет равен 0 (XOR двух одинаковых чисел дает всегда 0).
После добавления второго Map.Entry хешкод останется равным 0, так как там тоже совпадают значения ключа и значения. Повезло, повезло.
В итоге при вызове метод get будет искать Map.Entry в нужном бакете и, встретив нужную ноду, вызовет equals, который вернет true, так как при вставке значение ключа не копируется, и он будет отображать все изменения, которые с ним происходили.

Естественно, изменять ключ после вставки в HashMap крайне не рекомендуется, иначе потом можно его не найти. Но в данном конкретном случае нам повезло, что хешкод не изменился.
👍9🔥3👎1
Какие проблемы есть в этом коде?
🔥9👍3
Java Interview Tasks
Photo
Ответ к вопросу про хеш:
1) Если класс не immutable и метод расчета хеш-код зависит от полей объекта , то такой хеш код скорее всего не годится, так как после изменения полей объекта, хеш меняться не будет - это обычно приводит к проблемам
2) Если класс неизменяемый, то первой проблемы нет, зато есть concurrency баг - поле hash никак не синхронизировано, и внутри метода hashcode состояние этого поля меняется под гонкой => могут быть разные эффекты:
- пересчет hashcode может вызваться несколько раз, если поток увидит в поле hash 0
- в методе hashcode два чтения поля hash, может возникнуть ситуация когда эти два чтения будут разные, например даже так: первый раз прочитается поле и поток увидет не ноль , а второй раз в return увидит 0
Похожий код был в старых версиях jdk в классе String, вот подробности - https://bugs.openjdk.org/browse/JDK-8166842
👍13🔥3🐳3❤‍🔥11
Задача для супер сеньоров: что напечатается в результате выполнения этого кода?
🔥10🐳1
Что напечатается в результате выполнения этого кода?
Anonymous Quiz
39%
0
17%
1
11%
2
17%
3
9%
4
5%
5
2%
10
👍13🤔7😁6🔥3🐳3
Задача для супер сеньоров, часть 2, что напечатается?
👍8🔥4👏1
Задача для супер сеньоров, часть 2, что напечатается?
Anonymous Quiz
41%
0
14%
1
11%
2
18%
3
11%
4
5%
5
🔥14👏1
Задача для супер сеньоров, часть 3, что напечатается?
🔥8👍4👏1
Задача для супер сеньоров, часть 3, что напечатается?
Anonymous Quiz
22%
0
6%
1
7%
2
8%
3
21%
4
23%
5
13%
"null"
👍10🔥7🫡7
Что напечатается?
👍8🔥3
🔥10😱3👍2👏1
Что напечатается в результате выполнения кода?
🤔7🔥5👍1
Что напечатается в результате выполнения кода?
Anonymous Quiz
26%
ничего
32%
test
29%
будет эксепшен
13%
узнать ответ
🔥9👏1
что напечатает код?
👍5🔥5👎1🐳1
🔥8🆒4👍3👎3🐳1
Ответ на вопрос про различные блокировки:
Частый вопрос на собеседовании про несколько вызовов lock у ReentrantLock и
acquire у Semaphore внутри одного треда
Как видно из задач выше, в случае ReentrantLock проблем не возникнет, и
второй lock не заблокирует тот же самый поток.
Semaphore, наоборот, заблокирует на втором вызове.
syncronized работает так же, как и ReentrantLock - не заблокирует при втором вызове.
👍7🔥4
Выводы после вопросов про разные варианты map и операции с null (https://t.me/java_interview_tasks/209):
Надо работать аккуратно, когда вы не знаете реализацию map (например, map приходит в метод как параметр), возможно вам нужно добавлять
проверки на null перед операциями с map, либо если вы модифицируете map, надо убедиться что map mutable (как вариант создать new HashMap и сложить туда все элементы из мапы которая пришла в метод, а потом уже модифицировать новую мапу)
👍6🔥3👏1