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

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

По рекламе: @alexzelentsov и https://telega.in/c/java_interview_tasks
Download Telegram
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
👍5
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
Anonymous Quiz
10%
"0, 0", "1, 1"
13%
"0, 0", "1, 1", "1, 0"
9%
"0, 0", "1, 1", "0, 1"
46%
"0, 0", "1, 1", "0, 1", "1, 0"
22%
узнать ответ
👍10🤯5🔥3
Java Interview Tasks
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
Ответ:
тут нарушен порядок HB сначала идет запись в volatile поле g а потом в x, поэтому чтение из g еденицы не дает гарантий относительно x.
Поэтому возможны все варианты: "0, 0", "1, 1", "0, 1", "1, 0"

Пример использования конструкции с правильным HB тут - https://t.me/java_interview_tasks/53
👍6🔥2👏21
Что будет напечатано?
🔥8👍1
👍10🤔6🔥3👎1👏1
Задача с собеседования:
Sort a large input stream of 3-byte unsigned integers (e.g. 16GB total size) not using disk provided you run 32-bit Java

Ваши варианты пишите в комментарии
🤔15🔥4👍2
Java Interview Tasks
Что будет напечатано?
Правильный вариант: может быть и true и false

Дело в том, что вызов thenRun у того же future, но во втором потоке, может привести к срабатыванию callback в первом thenRun.
При этом callback первого thenRun будет вызван во втором потоке.

Это происходит в тот момент, когда future.complete(null) начало выполняться, но ещё не успело вызвать callbacks,
а во втором потоке вызвался thenRun, который и выполнит все остальные callbacks на этом future но уже в своём потоке.

Проблем решается просто:

//основной поток
Thread mainThread = Thread.currentThread();

//создаём второй поток
Executor executor = Executors.newSingleThreadExecutor();

CompletableFuture<Void> future = new CompletableFuture<>();
CompletableFuture<Void> secondThreadFuture = future.thenRun(() -> {
System.out.println(Thread.currentThread() == mainThread);
});

//просто добавляем callback к тому же future в другом потоке
executor.execute(() -> {
secondThreadFuture.thenRun(() -> {
//nop
});
});

//завершаем future
future.complete(null);

Мы просто добавили secondThreadFuture, которая зависит от результата исходной future.
И вызов на ней thenRun во втором потоке не приводит к возможному срабатыванию callbacks на исходной future.

Для гарантированного вызова callbacks в заданных пользователем потоках у CompletableFuture существуют async реализации методов,
например — thenRunAsync, которым нужно передавать Executor. Но async-версии методов могут работать медленней, чем обычные.
👍5🔥4
Какие проблемы могут быть в таком коде?

public static List<?> add(Long l1, Long l2, Long l3) {
return List.of(l1, l2, l3);
}
👍6🔥2👏1🤔1
Оцените код по 10-бальной шкале
👏6👍4👎1
Оцените код по 10-бальной шкале (10 = наилучший код в истории человечества)
Anonymous Poll
20%
1
6%
2
12%
3
7%
4
15%
5
6%
6
6%
7
4%
8
3%
9
21%
10
👍4🔥3
Java Interview Tasks
Оцените код по 10-бальной шкале
Тут главная проблема в том, что первоначальный эксепшен теряется и непонятно будет какая ошибка случилась. Здесь нужно либо прокинуть этот эксепшен дальше либо залоггировать его.
🔥12👍7👏1
Может ли конструктор быть synchronized? (почему - пишите в комменты)
Anonymous Quiz
34%
может
56%
не может
8%
что такое synchronized?
2%
что такое конструктор?
🔥14👎2👏2
Java Interview Tasks
Может ли конструктор быть synchronized? (почему - пишите в комменты)
Нет, конструктор не может быть synchronized, это запрещено спецификацией, аргументация примерено такая - JVM гарантирует, что только один поток может вызвать конструктор в данный момент времени.
Вот почему нет необходимости объявлять конструктор как synchronized, и это недопустимо в Java.

PS. У меня этот вопрос спрашивали на собесах несколько раз. Интересовались не только ответом может или не может, но и причинами, почему так сделали.
👍36🔥31🐳1
Что напечатает код?
double a = Math.pow(10, 100);
double b = Math.pow(10, -100);
double c = a + b;
System.out.println(c);
🐳3🍌2
👍7👎2🔥2
Что будет напечатано?

List<String> list = List.of(null, "1", "2"); String result = list.stream().findFirst().orElse(""); System.out.println(result);
Anonymous Quiz
10%
"1"
1%
"2"
26%
""
22%
"null"
29%
NullPointerException
7%
какой-то другой ексепшен
5%
что-то другое
🔥15👍31
Java Interview Tasks
Что напечатает код? double a = Math.pow(10, 100); double b = Math.pow(10, -100); double c = a + b; System.out.println(c);
Здесь проблема в том, что сумма будет ровна 1,0..01е199 , где в мантиссе числа 199 нулей и поэтому это число нельзя представить точно в виде double (там на мантиссу выделяется 53 бита), поэтому будет округление

Еще вопросы про double:
https://t.me/java_interview_tasks/85
https://t.me/java_interview_tasks/150
🔥6👍1
Какие значения может напечатать код (thread1 и thread2 запускаются одновременно в разных потоках)?
👍10👎3
Какие значения может напечатать код (thread1 и thread2 запускаются одновременно в разных потоках)?
Anonymous Quiz
43%
-1,42
30%
-1,42,0
17%
42
10%
-1
🔥9👎6
Ответ к задаче про atomic (https://t.me/java_interview_tasks/195):
Проблема в том, что внутри класса AtomicInteger поле value не final, а volatile поле не имеет final семантики, поэтому если мы публикуем ссылку объекта пол гонкой, то можно увидеть дефолтное значение поля (0 в данном случае)
Похожая задача была тут - https://t.me/java_interview_tasks/140

0 можно получить на AArch64:
RESULT SAMPLES FREQ
-1 1,358,737,999 90.09%
0 8,322 <0.01%
42 149,426,735 9.91%


Вопрос для читателей: как данную проблему можно обойти?
👍13🔥3🐳3👏1