Ответ на последнюю задачу - https://t.me/java_interview_tasks/83
Список проблем:
1) дублирование строки “key”
2) map может быть null, нужна проверка
3) если этот код выполняется в многопоточной среде, то можно получить value = null внутри if, если другой поток вызовет map.remove(“key”) между вызовами map.containsKey(“key”) и map.get(“key”)
4) название метода не соответствует логике, лучше назвать, например, printKey
Если нашли какие то ещё проблемы, пишите в комментариях
Список проблем:
1) дублирование строки “key”
2) map может быть null, нужна проверка
3) если этот код выполняется в многопоточной среде, то можно получить value = null внутри if, если другой поток вызовет map.remove(“key”) между вызовами map.containsKey(“key”) и map.get(“key”)
4) название метода не соответствует логике, лучше назвать, например, printKey
Если нашли какие то ещё проблемы, пишите в комментариях
Telegram
Java Interview Tasks
Какие тут есть проблемы ?
👍4🤮2
Сколько вариантов с одинаковым результатом?
Anonymous Quiz
13%
Во всех вариантах одинаковые результаты
22%
2 одинаковых
19%
3 одинаковых
17%
Все разные
17%
Что за фигня?
12%
Узнать ответ
🔥8
Java Interview Tasks
Рассмотрим 4 варианта нахождения среднего значения в массиве
Ответ к задаче про нахождение среднего:
1 вариант будет сильно отличаться от остальных, так как оперирует с лонгами, и там будут переполнения
2 вариант и 3 отличаются между собой из-за разного порядка суммирования в обычном и параллельном стриме
Главный вопрос в том, почему отличается вариант 2 от варианта 4: doubleStream использует алгоритм, который делает суммирования таким образом, чтобы погрешность была минимальной, а цикл for суммирует в лоб
1 вариант будет сильно отличаться от остальных, так как оперирует с лонгами, и там будут переполнения
2 вариант и 3 отличаются между собой из-за разного порядка суммирования в обычном и параллельном стриме
Главный вопрос в том, почему отличается вариант 2 от варианта 4: doubleStream использует алгоритм, который делает суммирования таким образом, чтобы погрешность была минимальной, а цикл for суммирует в лоб
❤9
Что возвращает метод Map.of()?
Anonymous Quiz
46%
HashMap
4%
TreeMap
7%
LinkedHashMap
25%
EmptyMap
19%
другой ответ
Java Interview Tasks
Что возвращает метод Map.of()?
Ответ на задачу про Map.of():
В доках не указана конкретная реализация, сказано следующее: Returns an unmodifiable map …
В java 17 реализация из класса ImmutableCollections.
Например: ImmutableCollections.EMPTY_MAP, new ImmutableCollections.Map1<>(k1, v1) и тд.
Эти мапы эффективнее.
Если у вас мапа не будет меняться, то лучше использовать эти реализации.
В доках не указана конкретная реализация, сказано следующее: Returns an unmodifiable map …
В java 17 реализация из класса ImmutableCollections.
Например: ImmutableCollections.EMPTY_MAP, new ImmutableCollections.Map1<>(k1, v1) и тд.
Эти мапы эффективнее.
Если у вас мапа не будет меняться, то лучше использовать эти реализации.
👍15
Может ли метод нахождения модуля целого числа из jdk Math.abs() вернуть отрицательный результат?
Anonymous Quiz
36%
может
46%
не может
9%
что за фигня?
6%
узнать ответ
3%
больше не буду использовать методы jdk
😱11🔥8👍4
Знаете ли вы что такое @IntrinsicCandidate?
Anonymous Poll
7%
Знаю
78%
Не знаю
15%
Узнать результаты
👍12😢2🤩2❤1😱1
Java Interview Tasks
Может ли метод нахождения модуля целого числа из jdk Math.abs() вернуть отрицательный результат?
Ответ на задачу про отрицательный модуль:
Ситуация возможна, если: Math.abs(Integer.MIN_VALUE);
C java 15 добавился метод Math.absExact, он выкидывает exception в этом случае
Реальный кейс, приводящий к проблеме - array[Math.abs(str.hash())], один раз на 4 млрд вы можете получить ArrayIndexOutOfBoundsException
Так же метод из задачи помечен аннотацией @IntrinsicCandidate.
IntrinsicCandidate указывает на то, что данный метод может быть заменён на intrinsic-функцию.
Intrinsic-функция — функция, которую JIT-компилятор может встроить вместо вызова Java-кода с целью оптимизации.
Короче говоря, вместо кода, который внутри метода, в реальности может работать другой код, который будет работать гораздо эффективнее.
Ситуация возможна, если: Math.abs(Integer.MIN_VALUE);
C java 15 добавился метод Math.absExact, он выкидывает exception в этом случае
Реальный кейс, приводящий к проблеме - array[Math.abs(str.hash())], один раз на 4 млрд вы можете получить ArrayIndexOutOfBoundsException
Так же метод из задачи помечен аннотацией @IntrinsicCandidate.
IntrinsicCandidate указывает на то, что данный метод может быть заменён на intrinsic-функцию.
Intrinsic-функция — функция, которую JIT-компилятор может встроить вместо вызова Java-кода с целью оптимизации.
Короче говоря, вместо кода, который внутри метода, в реальности может работать другой код, который будет работать гораздо эффективнее.
👍23🔥4👎3❤1
Какие пары (x, y) могут напечататься после того как отработают thread1 и thread2?
Anonymous Quiz
27%
(0, 0), (1, 1), (2, 1), (1, 2), (2, 2)
23%
(1, 1), (2, 1), (1, 2), (2, 2)
8%
(2, 1), (1, 2), (2, 2)
17%
(1, 2), (2, 2)
25%
(2, 2)
👍10🔥4
Java Interview Tasks
Какие пары (x, y) могут напечататься после того, как отработают thread1 и thread2?
Ответ к последнему вопросу:
Проблема тут в том, что происходит инкремент полей под гонкой и операция i++ не атомарна. По факту это две операции: чтение и запись. Может случиться так, что первый поток прочитал значение поля, потом второй поток увеличил значение, а после этого первый поток перетер его, сделав инкремент значения, которое он прочитал в самом начале.
Volatile тут значения не имеет.
Что бы решить проблему, можно использовать AtomicInteger и атомарные операции, например, incrementAndGet()
Следующий вопрос: почему нельзя увидеть x = 0?
Видимость всех переменных гарантируется тем, что перед чтением переменных делается join на тредах, в спеке по этому поводу написано следующее: All actions in a thread happen-before any other thread successfully returns from a join() on that thread.
Прочитать про это можно тут - https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html (17.4.5. Happens-before Order)
Похожая проблема с неатомарностью инкрементов рассмотрена здесь - https://github.com/openjdk/jcstress/blob/master/jcstress-samples/src/main/java/org/openjdk/jcstress/samples/api/API_02_Arbiters.java
Проблема тут в том, что происходит инкремент полей под гонкой и операция i++ не атомарна. По факту это две операции: чтение и запись. Может случиться так, что первый поток прочитал значение поля, потом второй поток увеличил значение, а после этого первый поток перетер его, сделав инкремент значения, которое он прочитал в самом начале.
Volatile тут значения не имеет.
Что бы решить проблему, можно использовать AtomicInteger и атомарные операции, например, incrementAndGet()
Следующий вопрос: почему нельзя увидеть x = 0?
Видимость всех переменных гарантируется тем, что перед чтением переменных делается join на тредах, в спеке по этому поводу написано следующее: All actions in a thread happen-before any other thread successfully returns from a join() on that thread.
Прочитать про это можно тут - https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html (17.4.5. Happens-before Order)
Похожая проблема с неатомарностью инкрементов рассмотрена здесь - https://github.com/openjdk/jcstress/blob/master/jcstress-samples/src/main/java/org/openjdk/jcstress/samples/api/API_02_Arbiters.java
GitHub
jcstress/API_02_Arbiters.java at master · openjdk/jcstress
https://openjdk.org/projects/code-tools/jcstress. Contribute to openjdk/jcstress development by creating an account on GitHub.
👍9🔥5
Java Interview Tasks
Что напечатает код?
Ответ к задаче про сравнение строк:
Первое, что нужно отметить, что тут сравниваются не значения строк, а ссылки на строки. Поэтому ide подчёркивает все равенства и предлагает правильный вариант сравнения значений строк через “equals”
s1 и s2 это один и тот же объект, так как в java есть пул строк, и для s2 не создается новый объект, так как в пуле уже есть строка с таким же значением.
А вот s3 создается через new и в пул строк не попадает. Поэтому s1 и s3 это разные объекты, поэтому сравнение вернёт false
s4 будет гарантированно из пула, так как вызван метод intern.
s5 работает аналогично s2
Выводы:
1) сравнивая объекты через == , можно не всегда получить то, что ожидаешь, поэтому лучше этого не делать и использовать метод equals. Сравнивая через == вы должны знать что делаете.
2) Если ide подчёркивает код, стоит обратить на это внимание, скорее всего у вас проблемы в коде
3) Метод intern перед созданием объекта String смотрит, есть ли этот объект в пуле стрингов и возвращает его. Иначе создается новый объект в пуле.
Статья на эту тему: https://habr.com/ru/post/79913/
Видео, которое рекомендую посмотреть, про intern там тоже идёт речь: https://youtu.be/SZFe3m1DV1A
Первое, что нужно отметить, что тут сравниваются не значения строк, а ссылки на строки. Поэтому ide подчёркивает все равенства и предлагает правильный вариант сравнения значений строк через “equals”
s1 и s2 это один и тот же объект, так как в java есть пул строк, и для s2 не создается новый объект, так как в пуле уже есть строка с таким же значением.
А вот s3 создается через new и в пул строк не попадает. Поэтому s1 и s3 это разные объекты, поэтому сравнение вернёт false
s4 будет гарантированно из пула, так как вызван метод intern.
s5 работает аналогично s2
Выводы:
1) сравнивая объекты через == , можно не всегда получить то, что ожидаешь, поэтому лучше этого не делать и использовать метод equals. Сравнивая через == вы должны знать что делаете.
2) Если ide подчёркивает код, стоит обратить на это внимание, скорее всего у вас проблемы в коде
3) Метод intern перед созданием объекта String смотрит, есть ли этот объект в пуле стрингов и возвращает его. Иначе создается новый объект в пуле.
Статья на эту тему: https://habr.com/ru/post/79913/
Видео, которое рекомендую посмотреть, про intern там тоже идёт речь: https://youtu.be/SZFe3m1DV1A
Хабр
Все о String.intern()
Думаю, что многие Java-разработчики знают или хотя бы слышали о методе String.intern(). Но далеко не каждый использует его в своих приложениях или представляет в...
👍24🔥5❤2🎉1🤩1
Ответ к последнему вопросу про спринг контроллер (https://t.me/java_interview_tasks/101):
1. Надо сделать поле starterService final. Аннотация @RequiredArgsConstructor добавляет конструктор со всеми final полями, поэтому при создании бина поле starterService не проинициализируется.
2. Не хватает аннотации @PathVariable. Иначе будет всегда collector = null и NPE в collector.toString()
Также был вопрос про @Autowired над полем и над конструктором: https://t.me/java_interview_tasks/62
1. Надо сделать поле starterService final. Аннотация @RequiredArgsConstructor добавляет конструктор со всеми final полями, поэтому при создании бина поле starterService не проинициализируется.
2. Не хватает аннотации @PathVariable. Иначе будет всегда collector = null и NPE в collector.toString()
Также был вопрос про @Autowired над полем и над конструктором: https://t.me/java_interview_tasks/62
Telegram
Java Interview Tasks
Какие тут есть проблемы в коде?
#spring
#spring
👍7🔥2❤1
Что больше занимает места List<Integer> или int[] с 10 элементами каждый?
# openjdk-17.0.1
# Running 64-bit HotSpot VM. # Using compressed oop with 3-bit shift. # Using compressed klass with 3-bit shift. # Objects are 8bytes aligned.
# openjdk-17.0.1
# Running 64-bit HotSpot VM. # Using compressed oop with 3-bit shift. # Using compressed klass with 3-bit shift. # Objects are 8bytes aligned.
Anonymous Quiz
17%
List<Integer> в ~2 раза больше места займет чем int[]
23%
List<Integer> в ~1.5 раза больше места займет чем int[]
13%
List<Integer> в ~4 раза больше места займет чем int[]
4%
List<Integer> в ~10 раз больше места займет чем int[]
2%
List<Integer> в ~20 раз больше места займет чем int[]
7%
int[] в ~1,5 раза больше места займет чем List<Integer>
28%
узнать ответ
6%
я не считаю место, если что увеличиваю xmx в два раза
🔥14👍7👎3❤2