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

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

По рекламе: @alexzelentsov
Download Telegram
Почему статические методы ведут себя не так, как обычные?
Что выведет код?
Anonymous Quiz
66%
A
14%
B
16%
Ошибка компиляции.
5%
ClassCastException.
👍3
Почему статические методы ведут себя не так, как обычные?
Что выведет код?
class A {
static void staticMethod() { System.out.print("A"); }
}
class B extends A {
static void staticMethod() { System.out.print("B"); }
}
A obj = new B();
obj.staticMethod();
👍3
🔍 Ответ на задачу про Static:

Статические методы привязаны к классу, а не к объекту. В Java нет полиморфизма для статики. Это называется method hiding. Какой метод вызовется, определяется типом переменной во время компиляции, а не типом объекта во время выполнения.

Вывод:
Так как переменная obj имеет тип A, вызовется A.staticMethod(). Результат: "A".

⚡️ Не перепутайте:
Никогда не вызывайте статические методы через экземпляры объектов (obj.method()). Всегда пишите ClassName.method(), чтобы не вводить в заблуждение.

#java #static #inheritance #basics #clean_code #интервью #java_interview_tasks
🔥6👍2🤔1
🤔3🔥2
Гарантирует ли final, что другой поток увидит значение поля?
Может ли другой поток увидеть p.x == 0, если объект p был создан как p = new Point(5)?
class Point {
final int x;
Point(int val) { this.x = val; ... }
}
🔥3
🔍 Ответ на задачу про 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