Сколько вариантов с одинаковым результатом?
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
Java Interview Tasks
Что больше занимает места 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.
Разъяснение к вопросу про int[] и ArrayList<Integer>:
Пустой массив весит 16 байт , учитывая выравнивание на 8
(про подсчет байтов для конкретного класса был вопрос с более детальным объяснением - https://t.me/java_interview_tasks/56)
[I object internals:
OFF SZ TYPE DESCRIPTION
0 8 (object header: mark)
8 4 (object header: class)
12 4 (array length)
12 4 (alignment/padding gap)
16 0 int [I.<elements>
Instance size: 16 bytes
Массив с 10-ю элементами весит 56 (16 + 10 * 4 (4 - размер int в массиве))
int[]:
[I@2328c243d object externals:
SIZE TYPE VALUE
56. [I [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Total size: 56
ArrayList из 10-ти элементов выглядит по памяти как показано ниже:
ArrayList<Integer>:
java.util.ArrayList@281e3708d object externals:
SIZE TYPE PATH VALUE
24 java.util.ArrayList (object)
56 [LObject; .elementData [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
16 Integer .elementData[0] 0
16 Integer .elementData[1] 1
16 Integer .elementData[2] 2
16 Integer .elementData[3] 3
16 Integer .elementData[4] 4
16 Integer .elementData[5] 5
16 Integer .elementData[6] 6
16 Integer .elementData[7] 7
16 Integer .elementData[8] 8
16 Integer .elementData[9] 9
Total size: 240
Получается 240 байт против 56 -> разница чуть больше чем в 4 раза между массивом и списком
Разница большая из-за того, что в листе элементы не примитивы, как в массиве, а объекты
Есть библиотеки, которые позволяют хранить примитивы, их довольно много:
например trove4j или fastutil
Для сравнения it.unimi.dsi.fastutil.ints.IntArrayList с 10-ю элементами:
it.unimi.dsi.fastutil.ints.IntArrayList@17695df3d object externals:
ADDRESS SIZE TYPE PATH VALUE
6233247b0 24 IntArrayList (object)
623357278 56 [I .a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Total size: 80
Про сравнение производительности можно почитать здесь - https://www.baeldung.com/java-list-primitive-performance
Вопрос к читателям:
Благодаря чему достигается прирост производительности в коллекциях с примитивами, кроме экономии памяти?
Пустой массив весит 16 байт , учитывая выравнивание на 8
(про подсчет байтов для конкретного класса был вопрос с более детальным объяснением - https://t.me/java_interview_tasks/56)
[I object internals:
OFF SZ TYPE DESCRIPTION
0 8 (object header: mark)
8 4 (object header: class)
12 4 (array length)
12 4 (alignment/padding gap)
16 0 int [I.<elements>
Instance size: 16 bytes
Массив с 10-ю элементами весит 56 (16 + 10 * 4 (4 - размер int в массиве))
int[]:
[I@2328c243d object externals:
SIZE TYPE VALUE
56. [I [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Total size: 56
ArrayList из 10-ти элементов выглядит по памяти как показано ниже:
ArrayList<Integer>:
java.util.ArrayList@281e3708d object externals:
SIZE TYPE PATH VALUE
24 java.util.ArrayList (object)
56 [LObject; .elementData [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
16 Integer .elementData[0] 0
16 Integer .elementData[1] 1
16 Integer .elementData[2] 2
16 Integer .elementData[3] 3
16 Integer .elementData[4] 4
16 Integer .elementData[5] 5
16 Integer .elementData[6] 6
16 Integer .elementData[7] 7
16 Integer .elementData[8] 8
16 Integer .elementData[9] 9
Total size: 240
Получается 240 байт против 56 -> разница чуть больше чем в 4 раза между массивом и списком
Разница большая из-за того, что в листе элементы не примитивы, как в массиве, а объекты
Есть библиотеки, которые позволяют хранить примитивы, их довольно много:
например trove4j или fastutil
Для сравнения it.unimi.dsi.fastutil.ints.IntArrayList с 10-ю элементами:
it.unimi.dsi.fastutil.ints.IntArrayList@17695df3d object externals:
ADDRESS SIZE TYPE PATH VALUE
6233247b0 24 IntArrayList (object)
623357278 56 [I .a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Total size: 80
Про сравнение производительности можно почитать здесь - https://www.baeldung.com/java-list-primitive-performance
Вопрос к читателям:
Благодаря чему достигается прирост производительности в коллекциях с примитивами, кроме экономии памяти?
Telegram
Java Interview Tasks
Какой размер будет у экземпляра объекта А?
public class A {
char ch1;
long l1;
int i1;
}
# 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…
public class A {
char ch1;
long l1;
int i1;
}
# 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…
👍13🔥5👏1
👍20🔥12👏3🎉1