Что знает 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. Во время компиляции проверки проводятся, но в байт-коде вся информация о типах
Вывод:
Оба списка принадлежат одному и тому же классу
⚡️ Не перепутайте:
Из-за стирания типов вы не можете сделать
#java #generics #jvm #internals #basics #интервью #java_interview_tasks
В 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.
2.
3. В
Вывод:
Не скомпилируются строки 1 и 3.
⚡️ Не перепутайте:
#java #generics #wildcards #basics #интервью #java_interview_tasks
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\)?
Из какого списка можно ЧИТАТЬ данные \(получать объекты типа T\)?
Anonymous Quiz
49%
Только A
30%
Только B
16%
Из обоих.
4%
Ни из одного.
🔥3
Когда использовать
Из какого списка можно ЧИТАТЬ данные (получать объекты типа T)?
? 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: Если коллекция "производит" данные (мы из нее читаем), используйте
- Consumer Super: Если коллекция "потребляет" данные (мы в нее пишем), используйте
Вывод:
Верна только строка A.
⚡️ Не перепутайте:
#java #generics #pecs #clean_code #интервью #java_interview_tasks
Это правило 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 — целые числа
### Решение: 🚫
Ключевое наблюдение — посмотрим на чётность произведения
Сложим все три множителя:
Сумма трёх множителей всегда чётна (кратна 6). Если сумма трёх целых чисел чётна, то среди них либо все три чётные, либо ровно два нечётных и одно чётное. В обоих случаях хотя бы один множитель — чётный. А значит, произведение
Но 11 — нечётное число.
### Вывод:
Уравнение не имеет решений в целых числах.
#math #numbertheory #diophantine #интервью #java_interview_tasks
### Решение: 🚫
Ключевое наблюдение — посмотрим на чётность произведения
(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
Может ли простая ссылка на метод запутать компилятор?
Почему этот код не скомпилируется?
Почему этот код не скомпилируется?
Anonymous Quiz
29%
Нельзя ссылаться на нестатический метод через имя класса.
17%
Нельзя ссылаться на статический метод в `forEach`.
49%
Неоднозначность (Ambiguity).
5%
Метод `process` должен возвращать значение.
👍2🔥2
Может ли простая ссылка на метод запутать компилятор?
Почему этот код не скомпилируется?
Почему этот код не скомпилируется?
class Service {
void process() { }
static void process(Service s) { }
}
List<Service> list = new ArrayList<>();
list.forEach(Service::process);🔥5
🔍 Ответ на задачу про Method References: Неоднозначность 😵💫
Ссылка
1. Как вызов статического метода:
2. Как вызов обычного метода у текущего элемента:
Обе интерпретации идеально подходят под сигнатуру
Вывод:
Возникает ошибка компиляции из-за неоднозначности.
⚡️ Не перепутайте:
В таких случаях используйте обычную лямбду
#java #lambda #methodreference #bug #интервью #java_interview_tasks
Ссылка
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: В чём разница? 🔍
-
-
Вывод:
В параллельном стриме
⚡️ Не перепутайте:
В последовательном (sequential) стриме
#java #streamapi #parallel #performance #интервью #java_interview_tasks
-
findFirst() жестко привязан к порядку следования (encounter order). В параллельном стриме он потратит время на то, чтобы убедиться, что вернул именно первый элемент.-
findAny() позволяет среде выполнения выбрать любой подходящий элемент. В параллельных стримах это работает гораздо быстрее, так как не нужно координировать потоки для соблюдения порядка.Вывод:
В параллельном стриме
findAny() может вернуть любой элемент, подходящий под условие. Если порядок не важен — используйте его для скорости.⚡️ Не перепутайте:
В последовательном (sequential) стриме
findAny() чаще всего тоже будет возвращать первый элемент, но спецификация этого не гарантирует.#java #streamapi #parallel #performance #интервью #java_interview_tasks
👍6🔥1
⚡️ Здравствуйте, Дорогие подписчики!
Представляем вашему вниманию подборку полезных каналов в сфере «Образование и наука» 🔥
Будем очень рады, если вы найдете для себя что-нибудь полезное.
❗️Ссылка на папку:
https://t.me/addlist/X7qi5eXa3Xc1Nzgy
Представляем вашему вниманию подборку полезных каналов в сфере «Образование и наука» 🔥
Будем очень рады, если вы найдете для себя что-нибудь полезное.
❗️Ссылка на папку:
https://t.me/addlist/X7qi5eXa3Xc1Nzgy
Telegram
📕Образование
Алексей Панкратов invites you to add the folder “📕Образование”, which includes 77 chats.
👍8✍3💩3🙏1
Зачем нужен `flatMap`, если есть обычный `map`?
Что выведет этот код?
Что выведет этот код?
Anonymous Quiz
14%
2
82%
3
2%
1
2%
Ошибка компиляции.
🔥4👍1🤔1
Зачем нужен
Что выведет этот код?
flatMap, если есть обычный map?Что выведет этот код?
List<List<String>> list = Arrays.asList(
Arrays.asList("a"),
Arrays.asList("b", "c")
);
System.out.println(list.stream()
.flatMap(Collection::stream)
.count());
👍4🔥1🤔1
🔍 Ответ на задачу про Stream.flatMap:
-
-
Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат
⚡️ Не перепутайте:
Используйте
#java #streamapi #flatmap #basics #интервью #java_interview_tasks
-
map() превращает каждый элемент в другой элемент (1 -> 1). Если применить его здесь, мы получим стрим стримов: Stream<Stream<String>>.-
flatMap() превращает каждый элемент в стрим, а затем "склеивает" все эти стримы в один плоский Stream<String>.Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат
count() — 3.⚡️ Не перепутайте:
Используйте
flatMap, когда ваш объект содержит коллекцию или Optional, и вы хотите работать с их содержимым напрямую.#java #streamapi #flatmap #basics #интервью #java_interview_tasks
🔥2👌1