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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про Final поля: Безопасная публикация 🏗

Согласно JMM, поля final обеспечивают "гарантию заморозки". Если объект был правильно сконструирован (ссылка this не утекла во время работы конструктора), то любой поток, увидевший ссылку на этот объект, гарантированно увидит корректные значения всех его final полей.

Вывод:
При условии отсутствия "утечки" this в конструкторе , после создания объекта другой тред увидеть не может ничего кроме 5. Это одна из основ создания Immutable объектов в Java.

⚡️ Не перепутайте:
Обычные (не final) поля без синхронизации могут быть видны другим потокам в их дефолтном состоянии (например, 0 или null), даже если конструктор уже отработал.

#java #concurrency #jmm #final #multithreading #интервью #java_interview_tasks
🔥4
Что знает JVM о ваших дженериках во время выполнения?
Что выведет код?
Anonymous Quiz
76%
true
17%
false
5%
Ошибка компиляции.
3%
ClassCastException.
❤3👍1🔥1
Что знает JVM о ваших дженериках во время выполнения?
Что выведет код?
List<String> strings = new ArrayList<>();
List<Integer> ints = new ArrayList<>();
System.out.println(strings.getClass() == ints.getClass());
❤3👍1🔥1👌1
🔍 Ответ на задачу про Generics: Стирание типов (Type Erasure) 🧼
В Java дженерики реализованы через стирание типов. Это сделано для обратной совместимости с кодом до Java 5. Во время компиляции проверки проводятся, но в байт-коде вся информация о типах <String> и <Integer> удаляется, и оба списка превращаются в просто ArrayList (работающий с Object).

Вывод:
Оба списка принадлежат одному и тому же классу java.util.ArrayList. Результат: true.

⚡️ Не перепутайте:
Из-за стирания типов вы не можете сделать instanceof List<String> или создать массив дженериков new T[10].

#java #generics #jvm #internals #basics #интервью #java_interview_tasks
👌5👍1👏1
Можно ли положить String в список "любых объектов"?
Какие строки кода НЕ скомпилируются?
Anonymous Quiz
28%
Только 1
19%
1 и 3
15%
Только 3
38%
Все скомпилируются.
🔥3❤1👍1
Можно ли положить String в список "любых объектов"?
Какие строки кода НЕ скомпилируются?
List<Object> list1 = new ArrayList<String>(); // 1
List<?> list2 = new ArrayList<String>(); // 2
list2.add("hello"); // 3
🔥3👍1👏1
🔍 Ответ на задачу про Wildcards: List<Object> vs List<?> ❓
1. List<Object> не является родителем для List<String>. Несмотря на то, что String — это Object, сами коллекции инвариантны. Иначе мы могли бы положить Integer в список строк через ссылку на List<Object>.
2. List<?> (wildcard) — это родитель для любого List. Строка 2 верна.
3. В List<?> нельзя ничего добавлять (кроме null), так как мы не знаем, список какого типа там на самом деле.

Вывод:
Не скомпилируются строки 1 и 3.

⚡️ Не перепутайте:
List<Object> — это список, в который можно класть любые объекты.
List<?> — это список какого-то неизвестного типа, из него можно только читать.

#java #generics #wildcards #basics #интервью #java_interview_tasks
✍6👍4👏1
Когда использовать `? extends`, а когда `? super`?
Из какого списка можно ЧИТАТЬ данные \(получать объекты типа T\)?
Anonymous Quiz
49%
Только A
30%
Только B
16%
Из обоих.
4%
Ни из одного.
🔥3
Когда использовать ? extends, а когда ? super?
Из какого списка можно ЧИТАТЬ данные (получать объекты типа T)?
void process(List<? extends T> list1, List<? super T> list2) {
T item1 = list1.get(0); // A
T item2 = list2.get(0); // B
}
🔥3
🔍 Ответ на задачу про PECS: Producer Extends, Consumer Super 🦆
Это правило PECS:
- Producer Extends: Если коллекция "производит" данные (мы из нее читаем), используйте extends. Мы гарантируем, что там лежат объекты типа T или его наследники, поэтому их безопасно приводить к T.
- Consumer Super: Если коллекция "потребляет" данные (мы в нее пишем), используйте super. Мы можем безопасно положить туда T. Но при чтении мы получим только Object, так как не знаем реального типа.

Вывод:
Верна только строка A.

⚡️ Не перепутайте:
List<? extends T> — только для чтения.
List<? super T> — в основном для записи.

#java #generics #pecs #clean_code #интервью #java_interview_tasks
🔥5
Задача с собеседования в grok:
x,y,z -целые числа, решить уравнение:
(7x-y)(7y-z)(7z-x)=11
👍3🔥1🤔1
### 🧮 Задача: (7x−y)(7y−z)(7z−x) = 11, где x, y, z — целые числа

### Решение: 🚫

Ключевое наблюдение — посмотрим на чётность произведения (7x−y)(7y−z)(7z−x).

Сложим все три множителя:

(7x − y) + (7y − z) + (7z − x) = 6x + 6y + 6z = 6(x + y + z)

Сумма трёх множителей всегда чётна (кратна 6). Если сумма трёх целых чисел чётна, то среди них либо все три чётные, либо ровно два нечётных и одно чётное. В обоих случаях хотя бы один множитель — чётный. А значит, произведение (7x−y)(7y−z)(7z−x) всегда чётно при любых целых x, y, z.

Но 11 — нечётное число.

### Вывод:
Уравнение не имеет решений в целых числах.

#math #numbertheory #diophantine #интервью #java_interview_tasks
🤔6👍3🔥2
Может ли простая ссылка на метод запутать компилятор?
Почему этот код не скомпилируется?
class Service {
void process() { }
static void process(Service s) { }
}
List<Service> list = new ArrayList<>();
list.forEach(Service::process);
🔥5
🔍 Ответ на задачу про Method References: Неоднозначность 😵‍💫
Ссылка Service::process может быть интерпретирована двумя способами:
1. Как вызов статического метода: (Service s) -> Service.process(s).
2. Как вызов обычного метода у текущего элемента: (Service s) -> s.process().
Обе интерпретации идеально подходят под сигнатуру Consumer<Service>, который ожидает forEach. Компилятор не знает, какой метод выбрать.

Вывод:
Возникает ошибка компиляции из-за неоднозначности.

⚡️ Не перепутайте:
В таких случаях используйте обычную лямбду s -> s.process(), чтобы явно указать нужный метод.

#java #lambda #methodreference #bug #интервью #java_interview_tasks
🔥5👍2👌1
Гарантирует ли findAny() возвращение самого первого элемента стрима?
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> result = list.parallelStream()
.filter(x -> x > 2)
.findAny();
👍2🔥1👌1
Гарантирует ли `findAny()` возвращение самого первого элемента стрима?
Anonymous Quiz
10%
да
86%
нет
3%
узнать ответ
2%
что такое стрим?
👍3👌2🔥1
🔍 Ответ на задачу про Stream.findFirst vs findAny: В чём разница? 🔍
- findFirst() жестко привязан к порядку следования (encounter order). В параллельном стриме он потратит время на то, чтобы убедиться, что вернул именно первый элемент.
- findAny() позволяет среде выполнения выбрать любой подходящий элемент. В параллельных стримах это работает гораздо быстрее, так как не нужно координировать потоки для соблюдения порядка.

Вывод:
В параллельном стриме findAny() может вернуть любой элемент, подходящий под условие. Если порядок не важен — используйте его для скорости.

⚡️ Не перепутайте:
В последовательном (sequential) стриме findAny() чаще всего тоже будет возвращать первый элемент, но спецификация этого не гарантирует.

#java #streamapi #parallel #performance #интервью #java_interview_tasks
👍6🔥1
⚡️ Здравствуйте, Дорогие подписчики!

Представляем вашему вниманию подборку полезных каналов в сфере «Образование и наука» 🔥
Будем очень рады, если вы найдете для себя что-нибудь полезное.

❗️Ссылка на папку:

https://t.me/addlist/X7qi5eXa3Xc1Nzgy
👍8✍3💩3🙏1
Зачем нужен `flatMap`, если есть обычный `map`?
Что выведет этот код?
Anonymous Quiz
14%
2
82%
3
2%
1
2%
Ошибка компиляции.
🔥4👍1🤔1