С какой версии джавы будет компилироваться код выше?
Anonymous Quiz
5%
7
16%
8
2%
9
15%
11
15%
15
23%
17
10%
21
15%
Ни одна из перечисленных
🤡25👍5
Что напечатает код если value = null?
Anonymous Quiz
30%
(---)
2%
(null)
17%
null
10%
ничего
12%
будет runtime exception
18%
будет compilation error
11%
узнать ответ
🔥11👎4👍1
Тут опять проблема в порядке операций, что может ввести в заблуждение - тернарный оператор имеет низкий приоритет.
Пример корректного варианта (который не вводит в заблуждение других): return "Str:" + (value != null ? value : "(---)");
Пример корректного варианта (который не вводит в заблуждение других): return "Str:" + (value != null ? value : "(---)");
Telegram
Java Interview Tasks
Что вернет метод, если value = null?
👍10🔥4👎1
Что напечатает код?
Anonymous Quiz
21%
1
42%
ничего
4%
будет runtime exception
23%
будет compilation error
2%
еще что-то)
7%
узнать ответ
🔥11
Тут проблема в отсутствии скобок и поэтому отрицание пытается примениться к obj, а это Object и поэтому код не скомпилируется. Правильный вариант будет такой: if (!(obj instanceof String)) {...}
Telegram
Java Interview Tasks
Что напечатает код, если obj = "123"?
👍15🔥5🐳2
🔥10👍2
В приведенном коде ошибка заключается в том, что метод
Поэтому, результат вызова
Вот как выглядит исходный код:
В этом коде
Чтобы исправить этот код и получить правильный результат, необходимо присвоить результат выполнения метода
add
класса BigInteger
не изменяет текущее значение объекта, а возвращает новый объект BigInteger
, который является результатом сложения. BigInteger
является неизменяемым классом, что значит, что все его методы возвращают новые объекты, а не изменяют текущий объект.Поэтому, результат вызова
value.add(BigInteger.ONE)
не сохраняется и не присваивается обратно переменной value
. Исходная переменная value
остается прежней и не изменяется.Вот как выглядит исходный код:
BigInteger value = BigInteger.TWO;
value.add(BigInteger.ONE);
System.out.println(value); // Выводит 2, а не 3
В этом коде
System.out.println(value)
выведет 2
, потому что переменная value
не была изменена.Чтобы исправить этот код и получить правильный результат, необходимо присвоить результат выполнения метода
add
обратно переменной value
:BigInteger value = BigInteger.TWO;
value = value.add(BigInteger.ONE);
System.out.println(value); // Теперь выведет 3
Telegram
Java Interview Tasks
Что напечатает код?
👍15🔥3
String str = "s=" + index + 1;
Что будет в переменной str, если index = 3?
Что будет в переменной str, если index = 3?
Anonymous Quiz
1%
s=1
0%
s=2
4%
s=3
73%
s=31
19%
s=4
3%
Узнать ответ
👍11🐳2
Тут может возникнуть ощущение что будет s=4, но сложение идет перед конкатенацией, однозначно бы выглядел код:
String str = "s=" + (index + 1);
String str = "s=" + (index + 1);
Telegram
Java Interview Tasks
String str = "s=" + index + 1;
Что будет в переменной str, если index = 3?
s=1 / s=2 / s=3 / s=31 / s=4 / Узнать ответ
Что будет в переменной str, если index = 3?
s=1 / s=2 / s=3 / s=31 / s=4 / Узнать ответ
👍6🔥2🐳2
Что напечатает код?
Anonymous Quiz
2%
ничего
5%
будет runtime exception
19%
будет compilation error?!
10%
"default"
33%
"test"
23%
другое
8%
узнать ответ
🔥7👍2
Проблема, с которой мы сталкиваемся, связана с тем, как компилятор Java обрабатывает varargs внутри условных выражений, особенно когда ветви условия производят разные типы. Вот подробное объяснение и пошаговое решение:
когда мы используем условное выражение, компилятор не может обернуть только одну из ветвей. Он воспринимает условное выражение как целое. Поскольку тип ветви then — String, а тип ветви else — Object[], тип всего условного выражения является общим суперклассом для String и Object[], то есть просто Object. Это не массив, поэтому компилятор добавляет автоматическое оборачивание, что означает, что массив params будет обернут ещё раз.
Вы можете исправить это, если не будете полагаться на компилятор и обернете строку вручную:
когда мы используем условное выражение, компилятор не может обернуть только одну из ветвей. Он воспринимает условное выражение как целое. Поскольку тип ветви then — String, а тип ветви else — Object[], тип всего условного выражения является общим суперклассом для String и Object[], то есть просто Object. Это не массив, поэтому компилятор добавляет автоматическое оборачивание, что означает, что массив params будет обернут ещё раз.
Вы можете исправить это, если не будете полагаться на компилятор и обернете строку вручную:
params.length == 0 ? new Object[]{"default"} : params
. Однако, вероятно, будет менее запутанно вообще избегать условных выражений внутри вызова метода с varargs.Telegram
Java Interview Tasks
Что напечатает код?
🔥9🐳4❤1👍1
Что может напечатать метод print?
Anonymous Quiz
25%
10
1%
9
2%
8
1%
7
1%
6
6%
5
4%
4
1%
3
49%
все вышеперечисленное
10%
узнать ответ
👍6🔥4🥰1
Ответ к вопросу про инкремент под гонкой:
Рассуждения аналогичные как и тут:
https://t.me/java_interview_tasks/96
Для примера, посмотрим, как может получится 2 - это самый интересный случай (см. картинку к посту)
Остальные варианты (больше 2) возможно получить аналогичными рассуждениями.
Выводы: этот простой пример показывает, что не синхронизированный счётчик может терять много данных.
Если вам нужно использовать счётчик под гонкой, то надо синхронизировать инкремент или использовать уже синхронизированные счётчики, например, AtomicInteger
Рассуждения аналогичные как и тут:
https://t.me/java_interview_tasks/96
Для примера, посмотрим, как может получится 2 - это самый интересный случай (см. картинку к посту)
Остальные варианты (больше 2) возможно получить аналогичными рассуждениями.
Выводы: этот простой пример показывает, что не синхронизированный счётчик может терять много данных.
Если вам нужно использовать счётчик под гонкой, то надо синхронизировать инкремент или использовать уже синхронизированные счётчики, например, AtomicInteger
👍7🔥5