Java Interview Tasks
Kanalga Telegram’da o‘tish
Реальные вопросы и задачи с собеседований. Оригинальный авторский контент. Актуальный материал. Уровень вопросов от junior до supersenior. Автор канала - @alexzelentsov По рекламе: @alexzelentsov и https://telega.in/c/java_interview_tasks
Ko'proq ko'rsatish4 521
Obunachilar
Ma'lumot yo'q24 soatlar
-107 kunlar
-2730 kunlar
Postlar arxiv
4 521
Ответ к вопросу про инкремент под гонкой:
Рассуждения аналогичные как и тут:
https://t.me/java_interview_tasks/96
Для примера, посмотрим, как может получится 2 - это самый интересный случай (см. картинку к посту)
Остальные варианты (больше 2) возможно получить аналогичными рассуждениями.
Выводы: этот простой пример показывает, что не синхронизированный счётчик может терять много данных.
Если вам нужно использовать счётчик под гонкой, то надо синхронизировать инкремент или использовать уже синхронизированные счётчики, например, AtomicInteger
4 521
Проблема, с которой мы сталкиваемся, связана с тем, как компилятор Java обрабатывает varargs внутри условных выражений, особенно когда ветви условия производят разные типы. Вот подробное объяснение и пошаговое решение:
когда мы используем условное выражение, компилятор не может обернуть только одну из ветвей. Он воспринимает условное выражение как целое. Поскольку тип ветви then — String, а тип ветви else — Object[], тип всего условного выражения является общим суперклассом для String и Object[], то есть просто Object. Это не массив, поэтому компилятор добавляет автоматическое оборачивание, что означает, что массив params будет обернут ещё раз.
Вы можете исправить это, если не будете полагаться на компилятор и обернете строку вручную:
params.length == 0 ? new Object[]{"default"} : params. Однако, вероятно, будет менее запутанно вообще избегать условных выражений внутри вызова метода с varargs.4 521
Тут может возникнуть ощущение что будет s=4, но сложение идет перед конкатенацией, однозначно бы выглядел код:
String str = "s=" + (index + 1);
4 521
String str = "s=" + index + 1;
Что будет в переменной str, если index = 3?
4 521
В приведенном коде ошибка заключается в том, что метод
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); // Теперь выведет 34 521
Тут проблема в отсутствии скобок и поэтому отрицание пытается примениться к obj, а это Object и поэтому код не скомпилируется. Правильный вариант будет такой: if (!(obj instanceof String)) {...}
4 521
Тут опять проблема в порядке операций, что может ввести в заблуждение - тернарный оператор имеет низкий приоритет.
Пример корректного варианта (который не вводит в заблуждение других): return "Str:" + (value != null ? value : "(---)");
4 521
Text blocks появились с java 15, но после начала блока должен быть переход на новую строку, поэтому вариант из прошлого вопроса не компилируется, правильный вариант будет такой
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
