Что может напечатать метод 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
Может ли метод print напечатать 0, 1 или 2?
Anonymous Quiz
8%
0 может
2%
1 может
22%
2 может
35%
все не могут
33%
узнать ответ
🔥4👍2
Логическая задача с собеседования:
Два друга, Андрей и Иван, решили приготовить пирог. Андрей внес вклад, добавив в тесто 300 грамм муки, а Иван добавил 200 грамм сахара. Когда пирог был испечен, к ним заглянул сосед и они пригласили его на чаепитие. Пирог разделили поровну на троих. После чаепития сосед оставил им 500 рублей в качестве благодарности.
Андрей предложил делить деньги так: 300 рублей ему, а 200 рублей Ивану. Однако Иван не согласился.
Как вы считаете, как они должны разделить вознаграждение, чтобы все было честно?
Два друга, Андрей и Иван, решили приготовить пирог. Андрей внес вклад, добавив в тесто 300 грамм муки, а Иван добавил 200 грамм сахара. Когда пирог был испечен, к ним заглянул сосед и они пригласили его на чаепитие. Пирог разделили поровну на троих. После чаепития сосед оставил им 500 рублей в качестве благодарности.
Андрей предложил делить деньги так: 300 рублей ему, а 200 рублей Ивану. Однако Иван не согласился.
Как вы считаете, как они должны разделить вознаграждение, чтобы все было честно?
👍9
Как вы считаете, как они должны разделить вознаграждение, чтобы все было честно?
Anonymous Quiz
19%
предложено честно
58%
не честно
23%
узнать ответ
👍5❤2🔥2
Что напечатает код?
Anonymous Quiz
59%
1
8%
2
12%
3
0%
4
5%
Будет Runtime exception
8%
Будет Compilation error
7%
Узнать ответ
🔥9🤡3👍2
Проблема в порядке операций, что может ввести в заблуждение - тернарный оператор имеет низкий приоритет
Пример кода, который однозначно будет пониматься:
Пример кода, который однозначно будет пониматься:
👍8
Что делает метод trimAll?
Anonymous Quiz
75%
удаляет из каждой строки в списке все начальные и конечные символы пробелов
19%
ничего
2%
не знаю
3%
узнать
👍7🔥6😁2👎1
Здесь автор кода по ошибке попытался обрезать все строки внутри списка, но метод forEach позволяет использовать все элементы коллекции, но не позволяет их обновлять. Он принимает функциональный интерфейс Consumer, чей абстрактный метод accept() возвращает void, поэтому результат вызова trim() игнорируется. Было бы правильнее использовать метод replaceAll() в данном случае.
Telegram
Java Interview Tasks
Что делает метод trimAll?
👍6🔥5
Что напечатает код?
Anonymous Quiz
45%
key=line
14%
key=keyline
3%
line=key
11%
что-то еще
14%
ничего
13%
узнать ответ
🔥8👍2
Правильный ответ: key=keyline
Как видите, содержимое начинается с ключа, что не соответствует нашим ожиданиям. Давайте внимательнее изучим:
map.computeIfAbsent("key", StringBuilder::new)
.append("line").append("\n");
Здесь мы создаем новую запись в мапе, если она еще не была создана. Мы использовали метод референс для новых записей. Но какой конструктор StringBuilder мы вызываем здесь? Если вы преобразите ссылку на метод в лямбда-выражение, вы получите следующее:
map.computeIfAbsent("key", str -> new StringBuilder(str))
.append("line").append("\n");
Теперь результат более понятен. Функция, переданная в computeIfAbsent(), имеет аргумент, который является ключом, переданным в качестве первого параметра. Легко забыть об этом, поскольку обычно вам не нужен этот аргумент, и если он вам нужен, вы можете захватить переменную key. В лямбда-выражении вы можете просто проигнорировать этот аргумент. Однако, когда используется ссылка на метод, компилятор ищет конструктор, который принимает строку. Поскольку в StringBuilder фактически есть такой конструктор, компиляция успешно завершается, но вновь созданный StringBuilder не будет пустым. Было бы правильнее использовать лямбда-выражение и конструктор по умолчанию здесь. Ссылка на метод здесь совсем не подходит.
Как видите, содержимое начинается с ключа, что не соответствует нашим ожиданиям. Давайте внимательнее изучим:
map.computeIfAbsent("key", StringBuilder::new)
.append("line").append("\n");
Здесь мы создаем новую запись в мапе, если она еще не была создана. Мы использовали метод референс для новых записей. Но какой конструктор StringBuilder мы вызываем здесь? Если вы преобразите ссылку на метод в лямбда-выражение, вы получите следующее:
map.computeIfAbsent("key", str -> new StringBuilder(str))
.append("line").append("\n");
Теперь результат более понятен. Функция, переданная в computeIfAbsent(), имеет аргумент, который является ключом, переданным в качестве первого параметра. Легко забыть об этом, поскольку обычно вам не нужен этот аргумент, и если он вам нужен, вы можете захватить переменную key. В лямбда-выражении вы можете просто проигнорировать этот аргумент. Однако, когда используется ссылка на метод, компилятор ищет конструктор, который принимает строку. Поскольку в StringBuilder фактически есть такой конструктор, компиляция успешно завершается, но вновь созданный StringBuilder не будет пустым. Было бы правильнее использовать лямбда-выражение и конструктор по умолчанию здесь. Ссылка на метод здесь совсем не подходит.
👍21🔥4❤3🤔1
Какая реализация метода верная? (мы не знаем какая конкретно реализация List придет в метод)
java
public List<String> unionLists(List<String> l1, List<String> l2);
🔥7👍1
Какая реализация метода public List<String> unionLists(List<String> l1, List<String> l2); верная?
Anonymous Quiz
4%
1
2%
2
63%
3
26%
все верные
5%
узнать ответ
🔥9👍1
Ответ к вопросу про реализации unionLists:
Ниже представлены реализации метода
, и комментарии, почему они могут быть неверными:
Incorrect Reason: Эта реализация изменяет исходный список l1, что может быть неприемлемо, если l1 immutable. Будет exception .
Incorrect Reason: Аналогично l2 может быть immutable.
Тут проблемы с immutable l1 и l2 нет.
Ниже представлены реализации метода
public List<String> unionLists(List<String> l1, List<String> l2);
, и комментарии, почему они могут быть неверными:
public List<String> unionLists(List<String> l1, List<String> l2) {
l1.addAll(l2);
return l1;
}
Incorrect Reason: Эта реализация изменяет исходный список l1, что может быть неприемлемо, если l1 immutable. Будет exception .
public List<String> unionLists(List<String> l1, List<String> l2) {
l2.addAll(l1);
return l2;
}
Incorrect Reason: Аналогично l2 может быть immutable.
public List<String> unionLists(List<String> l1, List<String> l2) {
List<String> l3 = new ArrayList<>();
l3.addAll(l1);
l3.addAll(l2);
return l3;
}
Тут проблемы с immutable l1 и l2 нет.
Telegram
Java Interview Tasks
Какая реализация метода верная? (мы не знаем какая конкретно реализация List придет в метод)
java
public List<String> unionLists(List<String> l1, List<String> l2);
java
public List<String> unionLists(List<String> l1, List<String> l2);
🔥10👍4