OpenJDK 21. Что выведет код? Нужные импорты подключены.
var stream = Stream.of("A", "B");
System.out.println(stream.count());
stream.forEach(System.out::println);👾 — 2, затем A и B
👍 — 2, затем IllegalStateException
🥰 — Только 2, без исключения
⚡️ — Ошибка компиляции
count — терминальная операция: поток уже использован. В OpenJDK 21 повторная терминальная операция на этом Stream.of вызывает IllegalStateException. Чтобы снова обработать те же данные, нужно создать новый поток из источника.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
Stream (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util.stream, interface: Stream
👍5👾1
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
OpenJDK 21. Что выведет код? Нужные импорты подключены.
Integer value = null;
boolean useValue = true;
Integer result = useValue ? value : 0;
System.out.println(result);
👾 — null
👍 — 0
🥰 — NullPointerException
⚡️ — Ошибка компиляции
Ветви Integer и int образуют числовое условное выражение типа int. При выборе value требуется распаковать Integer в int. Но value равен null, поэтому возникает NullPointerException. Тип переменной result не отменяет эту распаковку.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👍1
OpenJDK 21. Что выведет код? Нужные импорты подключены.
var a = new BigDecimal("1.0");
var b = new BigDecimal("1.00");
var hash = new HashSet<BigDecimal>();
hash.add(a);
hash.add(b);
var tree = new TreeSet<BigDecimal>();
tree.add(a);
tree.add(b);
System.out.println(hash.size() + " " + tree.size());👾 — 2 1
👍 — 1 1
🥰 — 2 2
⚡️ — 1 2
HashSet опирается на equals и hashCode. Для BigDecimal equals учитывает и числовое значение, и scale: у 1.0 и 1.00 он различается. TreeSet без собственного компаратора использует compareTo, которое считает эти значения равными. Поэтому размеры — 2 и 1.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
BigDecimal (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.math, class: BigDecimal
👾4👍1
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥
✅ 29 октября, четверг, 19:00 МСК — приходите на митап в Санкт-Петербурге или смотрите трансляцию.
Спикеры из ЮMoney и Сбера выступят с докладами:
🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.
🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.
🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.
Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Спикеры из ЮMoney и Сбера выступят с докладами:
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.
Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam
Please open Telegram to view this post
VIEW IN TELEGRAM
Java 21. Что выведет код?
import java.util.Arrays;
class Demo {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
var list = Arrays.asList(numbers);
System.out.println(list.size());
}
}
👾 — 3
👍 — 1
🥰 — 0
⚡️ — Ошибка компиляции
Метод получает один объект — массив int[]. Его элементы не превращаются автоматически в отдельные объекты Integer. Поэтому список содержит один массив. Для Integer[] результат был бы другим: список содержал бы три числа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
Arrays (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: Arrays
👍3❤1🔥1👾1
Java 21. Что выведет код?
import java.util.ArrayList;
import java.util.List;
class Demo {
public static void main(String[] args) {
var values = new ArrayList<>(
List.of(1, 2, 1)
);
values.remove(1);
values.remove(Integer.valueOf(1));
System.out.println(values);
}
}
👾 — [2]
👍 — [1, 2]
🥰 — [1]
⚡️ — []
Вызов remove(1) выбирает перегрузку с индексом и удаляет второй элемент — число 2. Остаётся [1, 1]. Вызов с Integer удаляет первое совпавшее значение 1, поэтому в списке остаётся одна единица.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
ArrayList (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: ArrayList
🥰11❤1⚡1
Java 21. Что выведет код?
import java.util.Optional;
class Demo {
static String fallback() {
System.out.println("fallback");
return "B";
}
public static void main(String[] args) {
var value = Optional.of("A");
System.out.println(
value.orElse(fallback())
);
System.out.println(
value.orElseGet(Demo::fallback)
);
}
}
👾 — A, затем A
👍 — fallback, затем B, затем A
🥰 — fallback, A, fallback, A
⚡️ — fallback, затем A, затем A
Аргумент для orElse вычисляется до вызова метода. Поэтому fallback() выполняется, хотя запасное значение не понадобится. В orElseGet передаётся функция: она вызывается только для пустого Optional. Здесь второй вызов сразу возвращает A.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
Optional (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: Optional
⚡6
Java 21. Что выведет код?
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Demo {
public static void main(String[] args) {
var source = new ArrayList<>(List.of(1));
var view = Collections.unmodifiableList(source);
var copy = List.copyOf(source);
source.add(2);
System.out.println(view);
System.out.println(copy);
}
}
👾 — [1, 2], затем [1]
👍 — [1], затем [1]
🥰 — [1, 2], затем [1, 2]
⚡️ — Исключение на source.add(2)
unmodifiableList запрещает менять список через представление, но продолжает показывать содержимое исходного списка. List.copyOf создаёт неизменяемый список, который не отражает последующие изменения исходного. Поэтому двойка появляется только в view.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
Collections (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: Collections
👾5❤2
Java 21. Что выведет код?
import java.util.Arrays;
class Demo {
public static void main(String[] args) {
int[][] first = {{1, 2}};
int[][] second = {{1, 2}};
System.out.println(
Arrays.equals(first, second)
);
System.out.println(
Arrays.deepEquals(first, second)
);
}
}
👾 — true, затем true
👍 — false, затем true
🥰 — false, затем false
⚡️ — true, затем false
Обычный Arrays.equals сравнивает элементы внешних массивов. Эти элементы — разные объекты int[], которые не переопределяют equals для сравнения содержимого. deepEquals спускается во вложенные массивы и сравнивает числа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
Arrays (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: Arrays
👍9👾1
Java 21. В строке один эмодзи 😀. Что выведет код?
class Demo {
public static void main(String[] args) {
String text = "\uD83D\uDE00";
System.out.println(
text.length() + " " +
text.codePointCount(0, text.length())
);
}
}👾 — 1 1
👍 — 2 2
🥰 — 2 1
⚡️ — 4 1
Метод length() считает кодовые единицы UTF-16. Для этого эмодзи нужны две такие единицы — суррогатная пара. Метод codePointCount считает кодовые точки, поэтому возвращает 1. У составных эмодзи кодовых точек может быть несколько.
Please open Telegram to view this post
VIEW IN TELEGRAM
Oracle
String (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.lang, class: String
🥰2
Java 21. Что выведет код?
class Demo {
public static void main(String[] args) {
int first = 5;
int second = 2;
double a = first / second;
double b = (double) first / second;
System.out.println(a + " " + b);
}
}👾 — 2.5 2.5
👍 — 2.0 2.0
🥰 — 2.5 2.0
⚡️ — 2.0 2.5
В первом выражении оба операнда имеют тип int. Деление даёт 2, и только затем результат преобразуется в double. Во втором выражении приведение происходит до деления, поэтому оно выполняется с плавающей точкой.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡1
Java 21. Что выведет код?
class Base {
Base() {
show();
}
void show() {}
}
class Child extends Base {
int value = 7;
@Override
void show() {
System.out.print(value + " ");
}
}
class Demo {
public static void main(String[] args) {
var item = new Child();
System.out.println(item.value);
}
}👾 — 0 7
👍 — 7 7
🥰 — Только 7
⚡️ — Ошибка компиляции
Конструктор Base вызывает переопределённый метод
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👾1
Java 21. Что произойдёт при запуске?
class Main {
public static void main(String[] args) {
Object[] values = new String[2];
values[0] = "Java";
values[1] = 42;
System.out.println(values[1]);
}
}👾 — Выведет 42
👍 — Выведет строку "42"
🥰 — Выбросит ArrayStoreException
⚡️ — Код не скомпилируется
Переменная имеет тип Object[], поэтому компилятор разрешает присвоить число. Сам массив создан как String[]: при записи JVM проверяет тип элемента. Строка проходит проверку, Integer — вызывает исключение. До println выполнение не дойдёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👾1
Java 21. Что выведет код?
import java.util.HashMap;
class Main {
public static void main(String[] args) {
var cache = new HashMap<String, String>();
cache.computeIfAbsent("user", key -> null);
System.out.println(cache.containsKey("user"));
cache.computeIfAbsent("user", key -> "Ann");
System.out.println(cache.get("user"));
}
}
👾 — true, затем null
👍 — false, затем Ann
🥰 — true, затем Ann
⚡️ — Выбросит NullPointerException
Если вычисляющая функция возвращает null, computeIfAbsent оставляет отсутствующий ключ без записи. При следующем вызове функция выполнится снова. Она вернёт "Ann", и это значение попадёт в map.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Java 21. Что выведет код?
class Main {
public static void main(String[] args) {
String text = "A,B,,";
System.out.println(text.split(",").length);
System.out.println(text.split(",", -1).length);
}
}👾 — 4, затем 4
👍 — 3, затем 4
🥰 — 2, затем 2
⚡️ — 2, затем 4
Вызов split(",") удаляет пустые элементы в конце результата. Остаются "A" и "B".
Отрицательный limit сохраняет конечные пустые элементы: получатся "A", "B", "" и "". Это пригодится при разборе строк, где пустое последнее поле имеет значение.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4👍1
Java 21. Что выведет код?
class Main {
static void show(Object value) {
System.out.println("Object");
}
static void show(String value) {
System.out.println("String");
}
public static void main(String[] args) {
show(null);
}
}👾 — String
👍 — Object
🥰 — Выбросит NullPointerException
⚡️ — Код не скомпилируется из-за неоднозначности
null подходит обоим параметрам. Компилятор выбирает наиболее конкретную подходящую перегрузку: String является подтипом Object.
Само по себе присваивание null параметру исключения не вызывает.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3👍3👾2
Java 21. Что выведет код?
class Main {
static int result() {
try {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(result());
}
}👾 — 1
👍 — 1 и 2
🥰 — 2
⚡️ — Код не скомпилируется
После вычисления return 1 выполняется finally. Его return 2 заменяет уже подготовленный результат.
По той же причине return внутри finally способен скрыть исключение из try. Поэтому завершение метода лучше оставлять за пределами finally.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4⚡1
Java 21. Что выведет код?
class Main {
public static void main(String[] args) {
System.out.println(-7 / 3);
System.out.println(Math.floorDiv(-7, 3));
}
}👾 — −3, затем −3
👍 — −2, затем −3
🥰 — −2, затем −2
⚡️ — −3, затем −2
Целочисленное деление через / отбрасывает дробную часть, двигаясь к нулю. Для −7 / 3 получается −2.
floorDiv округляет результат вниз, к отрицательной бесконечности. Поэтому он возвращает −3.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java 21. Что произойдёт при запуске?
import java.util.List;
class Main {
public static void main(String[] args) {
try {
var items = List.of("A", (String) null);
System.out.println(items.size());
} catch (NullPointerException e) {
System.out.println("null");
}
}
}
👾 — 2
👍 — 1
🥰 — null
⚡️ — Ошибка компиляции
List.of запрещает null среди элементов. Исключение возникает при создании списка, и catch печатает null. До вызова size выполнение не доходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4