Правильный ответ: 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
Напечатает ли код числа в отсортированном порядке?
Anonymous Quiz
21%
напечатает, с сортировкой по возрастанию
10%
напечатает, с сортировкой по убыванию
41%
не отсортирует
16%
будет runtime exception
12%
узнать ответ
🔥7👍4
Этот код компилируется, но выдает совершенно неправильный результат:
[0, -1, -2, -3, 3, 1, 2]
Для Comparator, необходимо реализовать один метод compare(), который принимает два integer значения и возвращают int значение, знак которого показывает, какой из входных параметров больше.
Метод Integer.max() принимает два целочисленных значения и возвращает int, поэтому с точки зрения Java, он соответствует интерфейсу Comparator. Однако знак возвращаемого значения не показывает, какой из входных данных больше. Например max(2,3)=3, а в случае компаратора должен был бы вернуть отрицательное значение. Поэтому сортировка работает некорректно.
Чтобы исправить этот код, вы можете указать Comparator.naturalOrder().
[0, -1, -2, -3, 3, 1, 2]
Для Comparator, необходимо реализовать один метод compare(), который принимает два integer значения и возвращают int значение, знак которого показывает, какой из входных параметров больше.
Метод Integer.max() принимает два целочисленных значения и возвращает int, поэтому с точки зрения Java, он соответствует интерфейсу Comparator. Однако знак возвращаемого значения не показывает, какой из входных данных больше. Например max(2,3)=3, а в случае компаратора должен был бы вернуть отрицательное значение. Поэтому сортировка работает некорректно.
Чтобы исправить этот код, вы можете указать Comparator.naturalOrder().
Telegram
Java Interview Tasks
Напечатает ли код числа в отсортированном порядке?
👍15🔥4👏2🐳1
Что напечатает код?
Anonymous Quiz
16%
идишник дто
51%
напечатает то, что возвращает Object.toString()
18%
код не скомпилируется
7%
рантайм ошибка будет
8%
узнать что будет
🔥7👍2👏1
Ответ к вопросу про EntDto:
На первый взгляд может показаться, что все в порядке.
Однако это не работает: любая попытка создание экземпляра EntDto приводит к исключению NullPointerException. Инициализация поля random фактически является частью класса EntDto. конструктор, который выполняется после конструктора суперкласса. Когда выполняется конструктор суперкласса, поля подкласса не инициализируются. Однако мы вызываем переопределенный метод generateId(), который предполагает, что random уже инициализировано.
На первый взгляд может показаться, что все в порядке.
Однако это не работает: любая попытка создание экземпляра EntDto приводит к исключению NullPointerException. Инициализация поля random фактически является частью класса EntDto. конструктор, который выполняется после конструктора суперкласса. Когда выполняется конструктор суперкласса, поля подкласса не инициализируются. Однако мы вызываем переопределенный метод generateId(), который предполагает, что random уже инициализировано.
Telegram
Java Interview Tasks
Что напечатает код?
👍9🔥4🐳2❤1
Что напечатает код?
Anonymous Quiz
35%
TTT
0%
Ttt
2%
ttt
6%
Ничего не напечатает
16%
null
35%
Будет ошибка
6%
Узнать ответ
🔥8👍2
Ответ на вопрос про порядок инициализации:
ответ null, потому что Y.Y_FIELD в этом случае будет null, что бы понять это,
давайте посмотрим шаги инициализации этого кода:
Class X initializer starts
Class Y initializer starts
Y_FIELD = X.X_FIELD; // X.X_FIELD = null
Class Y initializer ends
X.y = new Y();
X.X_FIELD = "ttt".toUpperCase();
Class X initializer ends
То есть когда X_FIELD присваивается в переменную класса Y, поле еще null.
ответ null, потому что Y.Y_FIELD в этом случае будет null, что бы понять это,
давайте посмотрим шаги инициализации этого кода:
Class X initializer starts
Class Y initializer starts
Y_FIELD = X.X_FIELD; // X.X_FIELD = null
Class Y initializer ends
X.y = new Y();
X.X_FIELD = "ttt".toUpperCase();
Class X initializer ends
То есть когда X_FIELD присваивается в переменную класса Y, поле еще null.
Telegram
Java Interview Tasks
Что напечатает код?
🔥14👍1
Чему равен average?
Anonymous Quiz
25%
1_500_000_000
9%
1_499_999_999
3%
0
10%
-1
40%
чему-то еще
13%
узнать ответ
👍7🔥4
Ответ на вопрос про среднее значение двух интов:
Проблема в коде возникает из-за переполнения переменной типа int, так как значение суммы переменных a и b превышает максимально допустимое значение для типа int.
В языке Java int занимает 4 байта (32 бита), что позволяет хранить целые числа в диапазоне от -2,147,483,648 до 2,147,483,647.
Сумма a и b:
( a + b = 1,500,000,000 + 1,500,000,000 = 3,000,000,000 )
Это значение больше, чем максимальное значение для типа int (2,147,483,647). Поэтому происходит переполнение.
Когда происходит переполнение, результат «оборачивается» и начинает считаться от минимального значения переменной. Поэтому мы получим отрицательное значение. И в итоге будет -647483648
Проблема в коде возникает из-за переполнения переменной типа int, так как значение суммы переменных a и b превышает максимально допустимое значение для типа int.
В языке Java int занимает 4 байта (32 бита), что позволяет хранить целые числа в диапазоне от -2,147,483,648 до 2,147,483,647.
Сумма a и b:
( a + b = 1,500,000,000 + 1,500,000,000 = 3,000,000,000 )
Это значение больше, чем максимальное значение для типа int (2,147,483,647). Поэтому происходит переполнение.
Когда происходит переполнение, результат «оборачивается» и начинает считаться от минимального значения переменной. Поэтому мы получим отрицательное значение. И в итоге будет -647483648
Telegram
Java Interview Tasks
Чему равен average?
👍12🔥3
👍6🔥5