Java Interview Tasks
الذهاب إلى القناة على Telegram
Реальные вопросы и задачи с собеседований. Оригинальный авторский контент. Актуальный материал. Уровень вопросов от junior до supersenior. Автор канала - @alexzelentsov По рекламе: @alexzelentsov
إظهار المزيد4 893
المشتركون
-424 ساعات
لا توجد بيانات7 أيام
+17030 أيام
أرشيف المشاركات
4 893
Проблемы:
1) код вообще не компилируется, так как метод void, но есть return
2) relatedId странное название, по факту это carId
3) внутри map, завернут еще один optional, это не нужно делать - тут лучше использовать flatMap, он уже возвращает optional
4) 'c' внутри map запутывает, это car, но такое название уже занято и, видимо, поэтому назвали 'c', лучше назвать как то более понятно, например, car, а параметр метода carToFill
5) 'c' внутри ifPresent запутывает еще больше, это owner и надо назвать именно так
6) если поправить пунтк 3, то и вложенный ifPresent внутри ifPresent'a будет не нужен
7) Возможно лучше вообще сделать так, что бы метод возвращал matadata, а потом уже другой метод проставлял в Car метадату
8) optional.of вернёт npe для null, правильно использовать optional.ofNullable
Если нашли что-то ещё - пишите в комменты
4 893
Разъяснение:
В конструктор BigDecimal(4.4) передаётся примитив double, в котором вместо 4.4 лежит
4.4000000000000003552713678800500929355621337890625
Поэтому объект BigDecimal будет хранить это число, а не 4.4
Вопрос к читателям: как переписать код, что бы результат стал точным (8.8) ?
4 893
Вопрос для любителей точных вычеслений:
Что напечатает код?
``` BigDecimal result = new BigDecimal(4.4).add(new BigDecimal(4.4)); System.out.println(result); ```
4 893
Ответ к последнему вопросу:
Объявление массива как volatile не делает доступ к его элемента volatile.
Поэтому hb семантика тут не применима и никаких гарантий относительно исполнения дать нельзя
Правильный вариант - "0, 0", "1, 1", "0, 1", "1, 0"
Были вопросы откуда может взяться вариант "1, 0":
Тут происходит запись элементов в массив и их чтение под гонкой,
jmm не дает в этом случае каких то гарантий на порядок выполнения операций.
Например компилятор может выполнить запись в другом порядке,
отличающимся от порядка в коде, то есть сначала записать a[1] = 1 а потом a[0] = 1
Вот пример, когда volatile даёт гарантии видимости в другом треде: https://t.me/java_interview_tasks/53
Вопрос для читателей: что нужно сделать, что бы вариант (1,0) был запрещён?
4 893
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
4 893
Ответ к вопросу про allMatch/anyMatch:
Малоизвестный факт, в документации написано следующее:
boolean allMatch(Predicate<? super T> predicate);
return true if either all elements of the stream match the
provided predicate or the stream is empty, otherwise false
и
boolean anyMatch(Predicate<? super T> predicate);
return true if any elements of the stream match the provided predicate, otherwise false
То есть allMatch() для пустого стрима вернет true, а anyMatch() вернет false.
Объяснить это можно так: для всех элементов пустого стрима любое условие выполнено.
В тоже время anyMatch вернет false, потому что нельзя найти элемент из коллекции, который удовлятворяет этому условию.
Такое поведение консистенто, например, для закона Де Моргана:
stream.allMatch(condition) расносильно !stream.anyMatch(!condition)4 893
Jugru выложили недавно несколько видосов, один из которых по тематике канала:
https://youtu.be/4ESHltu1YBI
4 893
Ответ на вопрос VolatileVsFinal:
Тут речь идет об одном из самых интересных разрешенных сценариев JMM. Это тот факт, что volatile поле не имеет final семантики.
Это означает, что если мы публикуем ссылку объекта под гонкой то мы можем увидеть дефолтное значение для volatile поля
Поэтому в данном случае 0 вполне можно получить.
Этот эффект можно увидеть на некоторых платформах, например AArch64:
RESULT SAMPLES FREQ EXPECT
-1 1,428,517,070 91.74% Acceptable
0 7,105 <0.01% Interesting
42 128,534,641 8.25% Acceptable4 893
Какие значения может напечатать код (thread1 и thread2 запускаются одновременно в разных потоках)?
4 893
Какие значения может напечатать код (thread1 и thread2 запускаются одновременно в разных потоках)?
4 893
Ответ к вопросу IntVsInteger:
initInteger1 создает примитив, поэтому это самый быстрый вариант.
initInteger2 создает объект-обертку для примитива, бенчмарк показывает, что такой вариант в разы медленнее,
это происходит, потому что initInteger2 создает каждый раз новый объект в хипе + оверхед на создание объекта + GC оверхед
initInteger4 чуть хуже чем создание примитива, так как мы все таки создаем объект изначально, но потом используем кеш
initInteger2 от initInteger3 сильно не отличаются, так как делают примерно одно и тоже
Так же считаю вопросы про конкретные значения между вариантами не корректными. Так как на разных версиях java, разных ОС
и разном hardware результаты могут сильно отличаться. Можно говорить только про результаты на конкретной машине.
Имеет смысл говорить про то, например, что один вариант сильно медленнее или быстрее, понимая из-за чего это происходит.
Поэтому таких вопросов, как последние 3, больше не будет.
Вот такие результаты я получил на своем ноутбуке:
java 8
Benchmark Mode Cnt Score Error Units IntVsInteger.doNothing avgt 20 0.268 ± 0.006 ns/op IntVsInteger.initInteger1 avgt 20 2.236 ± 0.018 ns/op IntVsInteger.initInteger2 avgt 20 3.981 ± 0.104 ns/op IntVsInteger.initInteger3 avgt 20 4.073 ± 0.145 ns/op IntVsInteger.initInteger4 avgt 20 2.786 ± 0.043 ns/opjava 17
Benchmark Mode Cnt Score Error Units IntVsInteger.doNothing avgt 20 0,451 ± 0,017 ns/op IntVsInteger.initInteger1 avgt 20 2,103 ± 0,068 ns/op IntVsInteger.initInteger2 avgt 20 4,056 ± 0,168 ns/op IntVsInteger.initInteger3 avgt 20 4,332 ± 0,195 ns/op IntVsInteger.initInteger4 avgt 20 2,394 ± 0,058 ns/op
4 893
Добро пожаловать в мир продвинутого изучения Java @javatg
В канале вы найдете :
📃Статьи
📚Книги
👨💻 Код
🔗Ссылки
🗯 Чат разработчиков
и много другой полезной информации
#Java #Coding
#Books #Pro
1 канал вместо тысячи учебников и курсов, подписывайтесь: 👇👇👇
